地标名称,类别(预留),经度,纬度
纯文本格式,一行一个兴趣点,保存于Map文件夹中,文件名为POI.txt。
现在文件名为固定形式,今后再增加可以多种类别的兴趣点,并由用户设置要加载哪些兴趣点
1
汕头市澄海区工商局,2,116.76421,23.45816
2
汕头市澄海区环卫局,2,116.76378,23.45271
3
汕头市澄海区劳动局,2,116.76305,23.45636
4
汕头市澄海区物资局,2,116.7628,23.45649
5
聚星新形象美发连锁沙龙,2,116.74684,23.44001
6
鹏发美容美发,2,116.76734,23.45379
7
亚洲人美容美发形象设计中心,2,116.76313,23.45705
8
银都,2,116.76254,23.4561
9
中国移动莱美服务厅,2,116.76395,23.45512
10
中国网通中山南路营业厅,2,116.76326,23.45675
11
中国铁通外砂营业厅,2,116.74881,23.44344
12
吉成手机大卖场,2,116.76451,23.45898
13
狮龙手机连锁店外砂大卖场,2,116.74941,23.43482
汕头市澄海区工商局,2,116.76421,23.458162
汕头市澄海区环卫局,2,116.76378,23.452713
汕头市澄海区劳动局,2,116.76305,23.456364
汕头市澄海区物资局,2,116.7628,23.456495
聚星新形象美发连锁沙龙,2,116.74684,23.440016
鹏发美容美发,2,116.76734,23.453797
亚洲人美容美发形象设计中心,2,116.76313,23.457058
银都,2,116.76254,23.45619
中国移动莱美服务厅,2,116.76395,23.4551210
中国网通中山南路营业厅,2,116.76326,23.4567511
中国铁通外砂营业厅,2,116.74881,23.4434412
吉成手机大卖场,2,116.76451,23.4589813
狮龙手机连锁店外砂大卖场,2,116.74941,23.43482加载兴趣点:
1
/**//// <summary>
2
/// 兴趣点
3
/// </summary>
4
public List<POI> PoiPoint = new List<POI>();
5
6
/**//// <summary>
7
/// 载入兴趣点
8
/// </summary>
9
public void LoadPOI()
{
10
11
//判断 地图的路径是否存在.
12
if (_MapPath == "" || _MapPath == null) return;
13
//载入兴趣点数据
14
StreamReader srRut = new StreamReader(MapPath + "//POI.txt", System.Text.Encoding.Default);
15
//StreamReader srRut = new StreamReader(MapPath + "//Cities.poi", System.Text.Encoding.Default);
16
17
//清除原来的兴趣点列表
18
PoiPoint.Clear();
19
20
//测试性能
21
int t = Environment.TickCount;
22
23
//调取一行
24
string line = srRut.ReadLine();
25
string[] p;
26
Point pnt;
27
28
while (line != null)
{
29
//把读入的一行文本分离成数组
30
p = line.Split(',');
31
//分离后的数组长度至少大于3个
32
if (p.Length >= 4)
{
33
try
{
34
//把经纬度转为坐标点
35
pnt = ConvertLatLonToXY(p[3], p[2]);
36
//如果坐标点在当前的地图范围内,贴添加到兴趣点列表中
37
if(pnt.X>0 && pnt.Y>0 && pnt.X<map.RefPoint2.x&&pnt.Y<map.RefPoint2.y)
{
38
PoiPoint.Add(new POI(p[0], Convert.ToInt32(p[1]),pnt));
39
}
40
} catch
{
41
}
42
}
43
line = srRut.ReadLine();
44
}
45
srRut.Close();
46
47
System.Diagnostics.Debug.WriteLine("Load POI TickCounts:" + (Environment.TickCount - t));
48
}

/**//// <summary>2
/// 兴趣点3
/// </summary>4
public List<POI> PoiPoint = new List<POI>();5

6

/**//// <summary>7
/// 载入兴趣点8
/// </summary>9

public void LoadPOI()
{10

11
//判断 地图的路径是否存在.12
if (_MapPath == "" || _MapPath == null) return;13
//载入兴趣点数据14
StreamReader srRut = new StreamReader(MapPath + "//POI.txt", System.Text.Encoding.Default);15
//StreamReader srRut = new StreamReader(MapPath + "//Cities.poi", System.Text.Encoding.Default);16

17
//清除原来的兴趣点列表18
PoiPoint.Clear();19

20
//测试性能21
int t = Environment.TickCount;22

23
//调取一行24
string line = srRut.ReadLine();25
string[] p;26
Point pnt;27

28

while (line != null)
{29
//把读入的一行文本分离成数组30
p = line.Split(',');31
//分离后的数组长度至少大于3个32

if (p.Length >= 4)
{33

try
{34
//把经纬度转为坐标点35
pnt = ConvertLatLonToXY(p[3], p[2]);36
//如果坐标点在当前的地图范围内,贴添加到兴趣点列表中37

if(pnt.X>0 && pnt.Y>0 && pnt.X<map.RefPoint2.x&&pnt.Y<map.RefPoint2.y)
{38
PoiPoint.Add(new POI(p[0], Convert.ToInt32(p[1]),pnt));39
}40

} catch
{41
}42
}43
line = srRut.ReadLine();44
}45
srRut.Close();46

47
System.Diagnostics.Debug.WriteLine("Load POI TickCounts:" + (Environment.TickCount - t));48
}显示兴趣点:
利用GDI+的DrawString输出兴趣点。
遍厉兴趣点,判断兴趣点是否在当前的缓存地图上,如果是,判断当前的文本输范围是否与"已存在的文本范围"重叠,不重叠的话,刚输出兴趣点的文本。并把当前的文本范围添加到"已存在的文本范围"列表中。
1
/**//// <summary>
2
/// 画兴趣点
3
/// </summary>
4
/// <param name="g"></param>
5
public void DrawPOI(Graphics g)
{
6
7
if (PoiPoint.Count > 0)
{
8
9
Font font = new Font("Nina", 12F, FontStyle.Regular);
10
SolidBrush br = new SolidBrush(Color.Red);
11
int px = 0;
12
int py = 0;
13
int bmpWidth = bmp.Width;
14
int bmpHeight = bmp.Height;
15
int t= Environment.TickCount;
16
17
18
List<Rectangle> rects = new List<Rectangle>();
19
Rectangle rect = new Rectangle();
20
bool isIntersect=false;
21
22
foreach (POI p in PoiPoint)
{
23
24
px = p.Longitude - MapCol * ImageTileWidth;
25
py = p.Latitude - MapRow * ImageTileWidth - 4;
26
if (px < 0 || py < 0 || px > bmpWidth || py > bmpHeight)
{
27
//上面的条件落在缓存图片之外
28
} else
{
29
30
//测试文字区域
31
rect.Size = g.MeasureString(p.Name, font).ToSize();
32
rect.X = px;
33
rect.Y = py;
34
isIntersect = false;
35
//判断是否与已有的文字区域相交
36
foreach (Rectangle r in rects)
{
37
if (rect.IntersectsWith(r))
{
38
isIntersect = true;
39
break;
40
}
41
}
42
43
//如果不相交,输出文字,并把该方框添加到方框列表中
44
if (!isIntersect)
{
45
g.DrawString(p.Name, font, br, px, py);
46
rects.Add(rect);
47
}
48
49
}
50
51
}
52
53
rects.Clear();
54
55
System.Diagnostics.Debug.WriteLine("Draw POI TickCounts:" + (Environment.TickCount - t));
56
57
}
58
}
59

/**//// <summary>2
/// 画兴趣点3
/// </summary>4
/// <param name="g"></param>5

public void DrawPOI(Graphics g)
{6

7

if (PoiPoint.Count > 0)
{8

9
Font font = new Font("Nina", 12F, FontStyle.Regular);10
SolidBrush br = new SolidBrush(Color.Red);11
int px = 0;12
int py = 0;13
int bmpWidth = bmp.Width;14
int bmpHeight = bmp.Height;15
int t= Environment.TickCount;16

17

18
List<Rectangle> rects = new List<Rectangle>();19
Rectangle rect = new Rectangle();20
bool isIntersect=false;21

22

foreach (POI p in PoiPoint)
{23

24
px = p.Longitude - MapCol * ImageTileWidth;25
py = p.Latitude - MapRow * ImageTileWidth - 4;26

if (px < 0 || py < 0 || px > bmpWidth || py > bmpHeight)
{27
//上面的条件落在缓存图片之外28

} else
{29

30
//测试文字区域31
rect.Size = g.MeasureString(p.Name, font).ToSize();32
rect.X = px;33
rect.Y = py;34
isIntersect = false;35
//判断是否与已有的文字区域相交36

foreach (Rectangle r in rects)
{37

if (rect.IntersectsWith(r))
{38
isIntersect = true;39
break;40
} 41
}42

43
//如果不相交,输出文字,并把该方框添加到方框列表中44

if (!isIntersect)
{45
g.DrawString(p.Name, font, br, px, py);46
rects.Add(rect); 47
}48
49
} 50

51
}52

53
rects.Clear();54
55
System.Diagnostics.Debug.WriteLine("Draw POI TickCounts:" + (Environment.TickCount - t));56

57
}58
}59


本文介绍了一种基于文本文件的地标兴趣点加载方法及其实现细节,包括如何通过代码解析经纬度信息,并将兴趣点在地图上进行有效展示的技术方案。
1596

被折叠的 条评论
为什么被折叠?



