上一篇介紹了在GMap上添加自定義標簽(GMapMarker),這篇介紹在GMap上添加多邊形(GMapPolyogn),並且介紹如何在地圖上畫任意的多邊形。
如果已經知道了多邊形的各個點的位置,就可以通過如下方式在地圖上添加多邊形:
GMapOverlay polyOverlay = new GMapOverlay("polygons"); List points = new List(); points.Add(new PointLatLng(-25.969562,32.585789)); points.Add(new PointLatLng(-25.966205,32.588171)); points.Add(new PointLatLng(-25.968134,32.591647)); points.Add(new PointLatLng(-25.971684,32.589759)); GMapPolygon polygon = new GMapPolygon(points, "mypolygon"); polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red)); polygon.Stroke = new Pen(Color.Red, 1); polyOverlay.Polygons.Add(polygon); gmap.Overlays.Add(polyOverlay);
如果需要手動在地圖上畫多邊形,可以通過在地圖上記錄每個點擊的位置,每次點擊更新正在畫的多邊形就可以了,實現方式如下:
先定義一些變量:
private GMapOverlay polygons = new GMapOverlay("polygon"); //放置polygon的圖層 private GMapPolygon drawingPolygon = null; //正在畫的polygon private List<PointLatLng> drawingPoints = new List<PointLatLng>(); //多邊形的點集 private GMapPolygon currentPolygon;
mapControl.Overlays.add(polygons);
在點擊mousedown事件中更新多邊形的點集(即更新多邊形的形狀):
void mapControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { isLeftButtonDown = true; if (checkBoxDrawPolygon.Checked) { drawingPoints.Add(mapControl.FromLocalToLatLng(e.X, e.Y)); if (drawingPolygon == null) { drawingPolygon = new GMapPolygon(drawingPoints, "my polygon"); drawingPolygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red)); drawingPolygon.Stroke = new Pen(Color.Blue, 2); drawingPolygon.IsHitTestVisible = true; polygons.Polygons.Add(drawingPolygon); } else { drawingPolygon.Points.Clear(); drawingPolygon.Points.AddRange(drawingPoints); if (polygons.Polygons.Count == 0) { polygons.Polygons.Add(drawingPolygon); } else { mapControl.UpdatePolygonLocalPosition(drawingPolygon); } } //mapControl.Refresh(); } } }
在雙擊事件中將當前正在畫的多邊形加到保存多邊形的GMapOverlay中:
void mapControl_MouseDoubleClick(object sender, MouseEventArgs e) { if (checkBoxDrawPolygon.Checked && drawingPolygon != null) { polygons.Polygons.Add(drawingPolygon); drawingPolygon = null; drawingPoints.Clear(); } }
在OnPolygonEnter和OnPolygonLeave中改變多邊形的輪廓顏色:
void mapControl_OnPolygonLeave(GMapPolygon item) { currentPolygon = null; item.Stroke.Color = Color.MidnightBlue; } void mapControl_OnPolygonEnter(GMapPolygon item) { currentPolygon = item; item.Stroke.Color = Color.Red; }
采用同樣的方法,可以在地圖上畫矩形、圓形等圖形,畫矩形和圓形的時候要隨鼠標移動改變圖形的大小,需要在MouseMove事件中改變正在畫的圖形的大小。
由於圓形沒法用點集組成(無窮個點組成),可以采用GMapMarker來畫。
效果圖如下:

項目地址:https://github.com/luxiaoxun/MapDownloader
