GMap.net 是一套user control 整合了不同的Map source (e.g. Google, OpenStreetMap 等). 它亦可以加入marker 及計算route 的距離等feature. 而它亦有出到WPF version, 但相對之下, 利用WinForm 的development 彈性較大, 而部份WinForm 有的event WPF 沒有(如Marker Click等), 須需熟識WPF 才可以掌握.
private GMapOverlay _markerOverlay;
private GMapOverlay _routeOverlay;
private void ReloadGMapControl()
{
// 決定Map Provider.
this.gMapControl.MapProvider = GMap.NET.MapProviders.OpenCycleMapProvider.Instance;
// 決定存取模式. 可以cache 於client 上.
GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
// 決定如何Drag 地圖.
gMapControl.DragButton = MouseButtons.Left;
// 預設pre-load 位置, 可以用名search.
gMapControl.SetPositionByKeywords("Hong Kong");
// Disable 中間的紅十字.
gMapControl.ShowCenter = false;
// 加入route 及 marker 的Layer.
this._markerOverlay = new GMapOverlay("markers");
this._routeOverlay = new GMapOverlay("routes");
gMapControl.Overlays.Add(this._markerOverlay);
gMapControl.Overlays.Add(this._routeOverlay);
}
加入WayPoint 及Route
private void gMapControl_DoubleClick(object sender, EventArgs e)
{
MouseEventArgs args = e as MouseEventArgs;
if (args != null)
{
PointLatLng locationLatLng = gMapControl.FromLocalToLatLng(args.X, args.Y);
GMapMarker marker = new GMarkerGoogle(locationLatLng, GMarkerGoogleType.green);
_markerOverlay.Markers.Add(marker);
WayPoint wayPoint = new WayPoint();
wayPoint.Latitude = Convert.ToDecimal(locationLatLng.Lat);
wayPoint.Longitude = Convert.ToDecimal(locationLatLng.Lng);
wayPoints.Add(wayPoint);
//this.dataGridWayPoints.Refresh();
if (wayPoints.Count > 1)
{
GMapMarker lastMarker = this._markerOverlay.Markers[_markerOverlay.Markers.Count - 2];
MapRoute route = GMapProviders.OpenCycleMap.GetRoute(lastMarker.Position, locationLatLng, true,
true, Convert.ToInt32(gMapControl.Zoom));
if (route != null)
{
GMapRoute mapRoute = new GMapRoute(route.Points, "A to B");
this._routeOverlay.Routes.Add(mapRoute);
}
}
}
}
Leave a Reply