GMap.NET使用教程


GMap.NET是一個強大、免費、跨平台、開源的.NET控件,它在Windows Forms和WPF環境中能夠通過Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等實現路徑規划、地理編碼以及地圖展示功能,並支持緩存和運行在Mobile環境中。
本文介紹了從下載安裝到如何使用GMap.NET。
 
  本文所使用的GMap.NET版本為1.7穩定版。


下載和安裝

 
這里下載,解壓后得到兩個文件(GMap.NET.Core.dll 和 GMap.NET.WindowsForms.dll)。
然后在項目中添加引用。

 

添加GMapControl到工具箱。在“選擇項”時,選擇“GMap.NET.WindowsForms.dll”文件即可添加。
 

使用NuGet安裝

 
 
 

添加地圖控件

拖拽GMapControl到Windows Form中,可看到控件中心有個小十字。查看屬性,你會發現GMap.NET的一些特有屬性。通過設置這些屬性可以配置地圖的行為,但是不能設置其內容。
 
 
* Bearing - 按照指定的度數向左旋轉地圖 * CanDragMap – 是否啟用鼠標右鍵拖動(平移)地圖 * EmptyTileColor – 設置沒有數據的切片所顯示的顏色 * MarkersEnabled – 是否顯示定義的標記,同PolygonsEnabled和RoutesEnabled * ShowTileGridLines – 顯示網格線 * Zoom,MinZoom和MaxZoom - 縮放級別

 

this.gMapControl1.MapProvider = OpenStreet4UMapProvider.Instance; // 設置地圖源
GMaps.Instance.Mode = AccessMode.ServerAndCache; // GMap工作模式
this.gMapControl1.SetPositionByKeywords("北京"); // 地圖中心位置

//使用經緯度設置地圖中心
//this.gMapControl1.Position = new GMap.NET.PointLatLng(39.923518, 116.539009);

① MapProvider:設置地圖源,輸入GMapProviders可以看到GMap所支持的所有地圖源。 

② GMaps.Instance.Mode: GMap可以從服務器、本地緩存、服務器或本地緩存獲取數據。這適用於在應用程序中創建的所有GMap控件實例,只需要設置一次該值。 
③ 設置地圖中心位置可以使用關鍵字或者經緯度。
④ 地圖顯示結果。按住鼠標右鍵可以拖拽地圖,當然也可以設置其他鍵來拖拽。
this.gMapControl1.DragButton = MouseButtons.Left;

 

添加標記

//創建一個名為“markers”的圖層
GMapOverlay markers = new GMapOverlay("markers");
//創建標記,並設置位置及樣式
GMapMarker marker = new GMarkerGoogle(new PointLatLng(39.923518, 116.539009), GMarkerGoogleType.blue_pushpin);
//將標記添加到圖層
markers.Markers.Add(marker);
//將圖層添加到地圖
this.gMapControl1.Overlays.Add(markers);

 ① GMapOverlay:圖層。添加的標記、圖形、路徑等都是在圖層上操作的。

② GMapMarker:GMarkerGoogle,提供標記位置(PointLatLng)和標記樣式。 它有兩個重載,可以使用GMarkerGoogleType和位圖。GMap.NET還提供了GMarkerCross,這是一個簡單的十字,不允許使用圖標。
 
public GMarkerGoogle(PointLatLng p, GMarkerGoogleType type);
public GMarkerGoogle(PointLatLng p, Bitmap Bitmap);

GMapMarker還可以設置ToolTip。

marker.ToolTipText = "我在這里";
marker.ToolTip.Fill = new SolidBrush(Color.FromArgb(100, Color.Black));
marker.ToolTip.Foreground = Brushes.White;
marker.ToolTip.TextPadding = new Size(20, 20);

③ 地圖顯示結果。(發現中心的小十字沒了嗎,因為這是可以設置的)

 

this.gMapControl1.ShowCenter = false; //隱藏中心十字

 

 

④ 標記點擊事件
標記本身沒有任何事件鈎子,GMapControl的OnMarkerClick事件即為標記點擊事件。在下面的示例中,點擊標記會彈出提示框顯示ToolTip的文本內容。當然GMap.NET不只有點擊事件,還有OnMarkerEnter、OnMarkerLeave。
private void gMapControl1_OnMarkerClick(GMapMarker item, MouseEventArgs e)
{
    MessageBox.Show(String.Format("Marker:{0} 被點了。", item.ToolTipText));
}

 

 

添加多邊形

添加多邊形和添加標記的原理是一樣的。
 
GMapOverlay polygons = new GMapOverlay("polygons");
// 多邊形的頂點
List<PointLatLng> points = new List<PointLatLng>();
points.Add(new PointLatLng(39.92244, 116.3922));
points.Add(new PointLatLng(39.92280, 116.4015));
points.Add(new PointLatLng(39.91378, 116.4019));
points.Add(new PointLatLng(39.91346, 116.3926));
GMapPolygon polygon = new GMapPolygon(points, "故宮");
polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));
polygon.Stroke = new Pen(Color.Red, 1);
polygons.Polygons.Add(polygon);
this.gMapControl1.Overlays.Add(polygons);

 

顯示結果

路徑規划

GMap.NET中路徑規划主要用RoutingProvider類的以下兩種方法:
 
 
//avoidHighways:是否避免走高速公路
//walkingMode:是否步行
//zoom:查找路徑時的zoom

//根據起止點經緯度查找路徑
MapRoute GetRoute(PointLatLng start, PointLatLng end, bool avoidHighways, bool walkingMode, int Zoom);
//根據起止點地址查找路徑
MapRoute GetRoute(string start, string end, bool avoidHighways, bool walkingMode, int Zoom);

 

通過點擊地圖,添加起止點

添加地圖標記之前,需要先清除(Clear)以下,這樣可以避免重復點擊地圖時,顯示多個標記。
 
 
int isSetPoint;  //設置起止點,1為起點,2為終點
PointLatLng startPoint; //起點
PointLatLng endPoint;   //終點

private void btn_SetStart_Click(object sender, EventArgs e)
{
    isSetPoint = 1;
}

private void btn_SetEnd_Click(object sender, EventArgs e)
{
    isSetPoint = 2;
}

//點擊地圖添加起止點
private void gMapControl1_MouseClick(object sender, MouseEventArgs e)
{
    PointLatLng point = this.gMapControl1.FromLocalToLatLng(e.X, e.Y);
    switch (isSetPoint)
    {
        case 1:
            //起點
            startPoint = point;
            GMapMarker marker1 = new GMarkerGoogle(startPoint, GMarkerGoogleType.red_pushpin);
            //清除上一次添加的起點
            markerStart.Markers.Clear();
            markerStart.Markers.Add(marker1);
            break;
        case 2:
            //終點
            endPoint = point;
            GMapMarker marker2 = new GMarkerGoogle(endPoint, GMarkerGoogleType.blue_pushpin);
            markerEnd.Markers.Clear();
            markerEnd.Markers.Add(marker2);
            break;
        default:
            break;
    }
}

查找路徑

 
private void btn_FindRoute_Click(object sender, EventArgs e)
{
    //點擊查找路徑后,不再添加點
    isSetPoint = 0;
    RoutingProvider rp = this.gMapControl1.MapProvider as RoutingProvider;
    //獲取路徑
    MapRoute route = rp.GetRoute(startPoint, endPoint, false, false, (int)this.gMapControl1.Zoom);
    if (route != null)
    {
        //添加routes圖層
        GMapOverlay routes = new GMapOverlay("routes");
        GMapRoute r = new GMapRoute(route.Points, route.Name);
        r.Stroke = new Pen(Color.Red, 3);
        routes.Routes.Add(r);
        //添加到地圖
        this.gMapControl1.Overlays.Add(routes);
        this.gMapControl1.ZoomAndCenterRoute(r);
    }
    else
    {
        MessageBox.Show("未能找到路線");
    }
}

查找路徑結果

如果路徑查找結果(route)為null,要么時確實沒有結果,要么是GMap封裝的地址搜索服務失效。我在寫這篇文章時,就無法使用GoogleChinaMap,上圖是使用OpenStreetMap的搜索結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM