1. 程式人生 > >GMap.Net開發之在WinForm和WPF中使用GMap.Net地圖外掛

GMap.Net開發之在WinForm和WPF中使用GMap.Net地圖外掛

GMap.NET是什麼?

來看看它的官方說明:GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps from Coogle, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yendux, Mapy.cz, Maps.lt, iKarte.lv, NearMap, OviMap, CloudMade, WikiMapia, MapQuest in Windows Forms & Presentation, supports caching and runs on windows mobile!

GMap.NET是一個強大、免費、跨平臺、開源的.NET控制元件,它在Windows Forms 和WPF環境中能夠使用來自Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等地圖,並可以實現尋找路徑、地理編碼以及地圖展示功能,並支援快取和執行在Mobile環境中。

如何在WinForm中使用GMap.Net

下載GMap.Net,我下載的版本:greatmaps_81b71bf30091,編譯三個核心專案:

GMap.Net.Core:核心DLL

GMap.Net.WindowsForms:WinForm中使用的DLL

GMap.NET.WindowsPresentation:WPF中使用的DLL

在WinForm專案中使用GMap:

1、新建一個Visual C# 的Windows視窗程式。新增對GMap.Net.Core.DLL和GMap.Net.WindowsForms.DLL的引用。

2、在專案中新增一個UserControl,這裡取名為MapControl,修改這個UserControl,使其繼承於GMapControl,這就是展示地圖的控制元件。修改如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using GMap.NET.WindowsForms; namespace GMapWinFormDemo { public partial class MapControl : GMapControl { public MapControl() { InitializeComponent(); } } }

3、編譯專案,在我們的Form設計視窗下,在工具箱中(tool box)裡就可以看到這個MapControl,將這個MapControl加到Form中。

4、在主Form中新增相關的程式碼如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GMap.NET;
using GMap.NET.WindowsForms;
using GMap.NET.MapProviders;
using GMap.NET.WindowsForms.Markers;
namespace GMapDemo { public partial class MapForm : Form { private GMapOverlay markersOverlay = new GMapOverlay("markers"); //放置marker的圖層 public MapForm() { InitializeComponent(); try { System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn"); } catch { mapControl.Manager.Mode = AccessMode.CacheOnly; MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButtons.OK, MessageBoxIcon.Warning); } mapControl.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //快取位置 mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地圖 mapControl.MinZoom = 2; //最小比例 mapControl.MaxZoom = 24; //最大比例 mapControl.Zoom = 10; //當前比例 mapControl.ShowCenter = false; //不顯示中心十字點 mapControl.DragButton = System.Windows.Forms.MouseButtons.Left; //左鍵拖拽地圖 mapControl.Position = new PointLatLng(32.064,118.704); //地圖中心位置:南京 mapControl.Overlays.Add(markersOverlay); mapControl.MouseClick += new MouseEventHandler(mapControl_MouseClick); } void mapControl_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y); GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.green); markersOverlay.Markers.Add(marker); } } }

5、編譯、執行專案就可以看到地圖,這裡使用的是線上的Google中國的地圖,地圖控制元件的幾個主要屬性:

MapProvider:地圖服務的提供者。

MinZoom:最小縮放,最小可為1。

MaxZoom:最大縮放,最大為24.

Zoom:當前縮放。

ShowCenter:是否顯示中心點(最好為false,否則地圖中間會有一個紅色的十字)。

DragButton:哪個鍵拖動地圖。

Position:地圖中心點位置。

地圖顯示如下,支援左鍵拖動,放大縮小,可以顯示左鍵的點選經緯度。

如何在WPF中使用GMap.Net

1、新建一個Visual C# 的WPF程式。新增對GMap.Net.Core.DLL和GMap.NET.WindowsPresentation.DLL的引用。

2、由於WPF的UserControl不能修改繼承的基類,所以新增一個新的類,為MapControl.cs,程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GMap.NET.WindowsPresentation;

namespace GMapWPFDemo
{
    class MapControl : GMapControl
    {
    }
}

只需要繼承GMapControl就行了,基本功能都可以由GMapControl提供。

3、在我們的MainWindow.xaml中,新增專案的namespace:xmlns:src="clr-namespace:GMapWPFDemo",在XML程式碼中新增對MapControl.cs的使用:

<Window x:Class="GMapWPFDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:GMapWPFDemo"
        Title="MainWindow" Height="410" Width="618">
    <Grid>
            <GroupBox Name="mapgroup" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
            <src:MapControl x:Name="mapControl" Zoom="13" MaxZoom="24" MinZoom="1" />
            </GroupBox>
    </Grid>
</Window>

4、在MainWindow中新增相關的程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.WindowsPresentation;

namespace GMapWPFDemo
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            try
            {
                System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
            }
            catch
            {
                mapControl.Manager.Mode = AccessMode.CacheOnly;
                MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButton.OK, MessageBoxImage.Warning);
            }

            mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地圖
            mapControl.MinZoom = 2;  //最小縮放
            mapControl.MaxZoom = 17; //最大縮放
            mapControl.Zoom = 5;     //當前縮放
            mapControl.ShowCenter = false; //不顯示中心十字點
            mapControl.DragButton = MouseButton.Left; //左鍵拖拽地圖
            mapControl.Position = new PointLatLng(32.064, 118.704); //地圖中心位置:南京

            mapControl.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown);
        }

        void mapControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Point clickPoint = e.GetPosition(mapControl);
            PointLatLng point = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
            GMapMarker marker = new GMapMarker(point);
            mapControl.Markers.Add(marker);
        }
    }
}

效果圖如下:

和Winform程式碼差不多,一些響應事件不同,WPF的GMap中沒有GMapOverlay這個“圖層”的概念,所以沒法加多個GMapOverlay,在GMapOverlay上再加GMapMarker(可以理解為圖示標註),GMapMarker只能直接加在mapControl上面。

WPF的GMapMarker可以直接例項化(WinForm中的不行),但是貌似沒有預設提供的效果,而要做出一些效果,需要自己設計實現,官方Demo中已經有了一些實現,WinForm中的GMapMarker可以用GMarkerGoogle去例項化(提供的有可選的效果,也可以自己傳入bitmap作為自定義的圖示)。

做過一段時間ArcGIS開發,由於ArcGIS的授權費用,為了節省成本,開始搞GMap.Net。。。剛開始研究,待續。。。

相關推薦

GMap.Net解決方案WinFormWPF使用GMap.Net地圖插件的開發

aac dem play 設計實現 成本 這就是 sage 就是 pes 在做地理位置相關的開發時,總是面臨高額地圖引擎費用讓大部分用戶望而卻步,加之地圖數據又是天價,那麽GMap.NET就是首選了,它本身就是開源免費,服務器可以在本地緩存,以後訪問時就可以直

GMap.Net開發WinFormWPF使用GMap.Net地圖外掛

GMap.NET是什麼? 來看看它的官方說明:GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps

【.NET開發美】使用ComponentOne提高.NET DataMap的載入速度

概述 FlexGrid for WinForm 採用了最新的資料繫結技術,並與Microsoft .NET Framework無縫整合。 因此,您可以獲得易於使用的靈活網格控制元件,用於建立使用者友好介面,以顯示、編輯、格式化、組織、彙總和打印表格資料。 FlexGrid的DataMap屬性允

AndroidStudio2.2 Preview3NDK開發CMake傳統 JNI在目錄結構配置檔案上的區別

 自從AndroidStudio更新到2.2,就有了CMake和傳統JNI兩種開發NDK的方法,主要就是在目錄結構和build.gradle上的區別,下面我們將分別介紹目錄區別和build.gradle種配置的區別(提示:在第一次用CMake時,最好在新建專案時勾選Include C++

GMap.Net開發自定義Marker

上一篇文章介紹瞭如何在WinForm和WPF中使用GMap控制元件,這篇介紹下GMap中Marker的使用。 自定義Marker,可以理解為在地圖上自定義圖示(Custom Marker),先看看GMap的地圖和圖示的顯示方式: Map控制元件上可以新增Overlay(圖層),可以新增多個圖層,先新增

GMap.Net開發地圖上新增多邊形

上一篇介紹了在GMap上新增自定義標籤(GMapMarker),這篇介紹在GMap上新增多邊形(GMapPolyogn),並且介紹如何在地圖上畫任意的多邊形。 如果已經知道了多邊形的各個點的位置,就可以通過如下方式在地圖上新增多邊形: GMapOverlay polyOverlay = new GMa

GMap.Net開發地址解析與路徑查詢

上一篇介紹瞭如何在GMap地圖上新增多邊形,這篇介紹下如何使用線上的地圖服務進行“地址解析”和“路徑查詢”。 先看地址解析,GMap中的地址解析主要用到GeocodingProvider中的如下方法: //根據關鍵字得到一組座標 GeoCoderStatusCode GetPoints(string

WPF使用.NET Core 3.0依賴項注入服務提供程式

前言 我們都知道.NET Core提供了對依賴項注入的內建支援。我們通常在ASP.NET Core中使用它(從Startup.cs檔案中的ConfigureServices方法開始),但是該功能不限於此框架,我們可以在WPF和Windows Forms應用程式中使用它。 實踐 新建專案 將所需的NuGe

Java進擊C#——應用開發LinqEF

了吧 -1 擴展 有一點 增刪改 adk 對象 structure mis 本章簡言 上一章筆者對於WinForm開發過程用到的幾個知識點做了講解。筆者們可以以此為開端進行學習。而本章我們來講一個跟ORM思想有關的知識點。在講之前讓我們想一下關於JAVA的hib

Java進擊C#——應用開發WinForm開發

logs i++ mex 有時 數據 rst 流動 應用程序 dir 本章簡言 上一章筆者介紹了關於WinForm環境。這一章筆者將繼續講WinForm。只不過更加的面向開發了。事實就是在學習工具箱裏面的控件。對於WinForm開發來講,企業對他的要求並沒有那麽

Java進擊C#——應用開發WinForm環境

png 程序員 esp renderer 復制 表示 com ont mode 本章簡言 上一章筆者講到關於IO文件操作類,了解如何處理文件流。從這一章開始筆者將講解相對比較高級的知識點。而本章筆者就對WinForm開發的知識點進行講解和引導。現在很多業務都是面

swift開發 -- ? ! 的作用

裏的 http col 調用 play class 種類型 value sel 記錄下這個知識點: 一般我們在一下兩種情況會遇到 ? 和 !的使用 1,聲明變量時 var number:Int? var str:String? 2,在對變量進行操作時 number?.

Django開發登陸登出

coo .com password art post方法 沒有 必須 創建 ref 使用django自帶的驗證模塊 1、首先使用python manage.py startapp models為當前項目添加一個應用。 2、在setting.py中INSTALLED_APPS

前端開發BOMDOM

obj clear comm form useragent bom 替換 ntop attribute BOM   BOM:是指瀏覽器對象模型,它使JavaScript可以和瀏覽器進行交互。     1,navigator對象:瀏覽器對象,通過這個對象可以判定用戶所使用的瀏

WinFormWPF顏色對象的轉換

name pub public winform wpf dia ring edit -c 原文:WinForm和WPF顏色對象的轉換 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/h

測試開發Django——No3.Django的試圖(views)

說到views,我們先來說django中執行的一個順序。 我們開啟一個django中配置的頁面,之後的執行是有這麼幾個步驟:   1.系統配置的urls中尋找是否配置了這個地址;   2.如果已經配置了這個地址,那麼查詢他對應的views;   3.根據views的return,來查詢頁面上顯示的模板

測試開發前端——No6.HTML5的鍵盤事件

鍵盤事件 由鍵盤觸發的事件。 適用於所有 HTML 5 元素: 屬性 值 描述 onkeydown script 當按下按鍵時執行指令碼 onkeypress script 當按下並鬆開按鍵時

測試開發前端——No5.HTML5的表單事件

表單事件 由 HTML 表單內部的動作觸發的事件。 適用於所有 HTML 5 元素,不過最常用於表單元素中: 屬性 值 描述 onblur script 當元素失去焦點時執行指令碼 onchange

測試開發前端——No8.HTML5的媒介事件

媒介事件 由視訊、影象以及音訊等媒介觸發的事件。 適用於所有 HTML 5 元素,不過在媒介元素(諸如 audio、embed、img、object 以及 video)中最常用: 屬性 值 描述 onabort script 當發生

測試開發前端——No7.HTML5的滑鼠事件

滑鼠事件 由滑鼠或相似的使用者動作觸發的事件。 適用於所有 HTML 5 元素: 屬性 值 描述 onclick script 當單擊滑鼠時執行指令碼 ondblclick script 當雙