地标名称,类别(预留),经度,纬度
纯文本格式,一行一个兴趣点,保存于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

3

4

5

6

7

8

9

10

11

12

13

加载兴趣点:
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
}


2

3

4

5

6


7

8

9



10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28



29

30

31

32



33



34

35

36

37



38

39

40



41

42

43

44

45

46

47

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


2

3

4

5



6

7



8

9

10

11

12

13

14

15

16

17

18

19

20

21

22



23

24

25

26



27

28



29

30

31

32

33

34

35

36



37



38

39

40

41

42

43

44



45

46

47

48

49

50

51

52

53

54

55

56

57

58

59
