1. 程式人生 > >基於GMap.Net的地圖解決方案

基於GMap.Net的地圖解決方案

一 地圖的載入與顯示

關於GMap的介紹與使用可以看我以前的文章:

GMap.Net是.Net下一個地圖控制元件,可以基於Http協議載入各個公司的地圖,如Google,Bing,ArcGIS的,主要原理是通過解析各個公司的地圖服務的URL,傳入相應的引數得到對應的切片底圖(Tiled map),如一個高德地圖的GMapProvider的實現如下:

using System;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections;

namespace GMapProvidersExt
{
    
public abstract class AMapProviderBase : GMapProvider { public AMapProviderBase() { MaxZoom = null; RefererUrl = "http://www.amap.com/"; //Copyright = string.Format("©{0} 高德 Corporation, ©{0} NAVTEQ, ©{0} Image courtesy of NASA", DateTime.Today.Year);
} public override PureProjection Projection { get { return MercatorProjection.Instance; } } GMapProvider[] overlays; public override GMapProvider[] Overlays { get { if (overlays == null
) { overlays = new GMapProvider[] { this }; } return overlays; } } } public class AMapProvider : AMapProviderBase { public static readonly AMapProvider Instance; readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88"); public override Guid Id { get { return id; } } readonly string name = "AMap"; public override string Name { get { return name; } } static AMapProvider() { Instance = new AMapProvider(); } public override PureImage GetTileImage(GPoint pos, int zoom) { try { string url = MakeTileImageUrl(pos, zoom, LanguageStr); return GetTileImageUsingHttp(url); } catch (Exception ex) { return null; } } string MakeTileImageUrl(GPoint pos, int zoom, string language) { var num = (pos.X + pos.Y) % 4 + 1; //string url = string.Format(UrlFormat, num, pos.X, pos.Y, zoom); string url = string.Format(UrlFormat, pos.X, pos.Y, zoom); return url; } //static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7"; static readonly string UrlFormat = "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={0}&y={1}&z={2}"; } }
View Code

如下為高德地圖的顯示:

通過類似的辦法,可以實現載入Google、騰訊的地圖,百度的地圖也可以載入,但是因為百度採用自己的加偏演算法(BD-09),導致載入的地圖顯示偏差大,當在不同的地圖間切換時,無法正確顯示。。

二 Marker的顯示與操作

GMapMarker為地圖上要顯示的資料元素,繼承GMapMarker可以實現自己想要的地圖元素效果,如下顯示自定義元素的樣式:

關於自定義Marker,可以看這篇文章:GMap.Net開發之自定義Marker,通過C# GDI+可以實現自己想要的各種圖示樣式和顯示效果。

三 圖形的顯示與操作

在地圖上手動畫各種多邊形,來實現類似“電子圍欄”的功能,可以使用GMapPolygon。

如下為我實現的圓形(Circle)、矩形(Rectangle)、多邊形(Polygon)和折線段(Polyline):

關於畫多邊形,可以看我以前的這篇文章:GMap.Net開發之在地圖上新增多邊形,手動畫多邊形時可以實時檢視效果,畫完的多邊形隨地圖放大(縮小)而放大(縮小)。

實現類似百度地圖“測距”的功能:

通過點、線和提示框可以實現類似百度地圖的“測距”功能,點選紅色的“X”,實現刪除這次測距。

四 地址解析與路徑查詢

地址解析:GMap中的地址解析主要用到GeocodingProvider中的如下方法:

//根據關鍵字得到一組座標
GeoCoderStatusCode GetPoints(string keywords, out List<PointLatLng> pointList); 

//根據關鍵字得到一個座標
PointLatLng? GetPoint(string keywords, out GeoCoderStatusCode status);

//根據座標得到一組地址
GeoCoderStatusCode GetPlacemarks(PointLatLng location, out List<Placemark> placemarkList);

//根據座標得到一個地址
Placemark GetPlacemark(PointLatLng location, out GeoCoderStatusCode status);

路徑查詢:GMap中的路徑查詢主要用到RoutingProvider的如下方法:

//avoidHighways:是否避免走高速公路
//walkingMode:是否步行
//zoom:查詢路徑時的zoom,貌似越大路徑越準確

//根據起止點start、end和當前的zoom查詢路徑
MapRoute GetRoute(PointLatLng start, PointLatLng end, bool avoidHighways, bool walkingMode, int Zoom);

//根據出發點地址start、目的點地址end和當前的zoom查詢路徑
MapRoute GetRoute(string start, string end, bool avoidHighways, bool walkingMode, int Zoom);

介面使用方式:

RoutingProvider rp = mapControl.MapProvider as RoutingProvider;
GeocodingProvider gp = mapControl.MapProvider as GeocodingProvider;

GeocodingProvider和RoutingProvider都是通過當前的MapProvider轉換得到的,也就是說如果要在載入的地圖上實現地址解析與路徑查詢,就需要實現載入地圖的三大介面:

GMapProvider介面:用於顯示地圖。

RoutingProvider:用於路徑查詢。

GeocodingProvider:用於地址解析。

五 座標糾偏

中國國內的地圖都是經過“加偏”處理的,所以被稱為“火星座標”。

現在主流的座標系是WGS84座標系,即地球座標系,國際上通用的座標系,經過國家測繪局要求採用GCJ02演算法加偏後即為“火星座標”,百度在“火星座標”的基礎上又採用了自己的加偏演算法BD09加偏後,得到“百度座標”,國內的搜狗座標系、圖吧座標系等,估計也是在GCJ02基礎上加密而成的。

而現在Google中國、騰訊和高德採用的是WGS84經過GCJ02演算法加偏後的“火星座標”。

通過GPS裝置採集到的座標一般是沒有經過“加偏”處理的WGS84座標,所以放到國內地圖上顯示會有誤差,可以把採集到的座標也通過加偏演算法加偏後再放到地圖上顯示,就可以得到對應的地點。

如下是經過加偏演算法加偏後處理的情況:

如上使用Google中國地圖,現在採用的演算法在地圖1-16級可以基本沒有誤差,誤差很小,當然和採集裝置採集的點的準確度也有關係。

當地圖放大超過16級時候,就出現了誤差,但誤差也就在幾米:

六 中國行政區域邊界

有中國各個省市的邊界資料,就可以實現行政區域的顯示:

如下顯示江蘇省和南京市的行政邊界:

PS:現在手上有全國的各個省、市、縣區的行政邊界。

七 地圖下載與快取

GMap會自動在本地快取一些訪問過的地圖,預設是不刪除的,所以當訪問的地圖區域越多時,本地的地圖快取也就越大。

當然你也可以手動下載地圖到本地資料庫(支援SQLite、MySQL、MsSQL、PostgreSQL),如下所示:

快取到本地的離線地圖資料就可以作為地圖資料包使用。

八 離線方案

離線地圖下載,CS或BS離線地圖使用:

聯絡方式:站內信,QQ:599965176

 參考:

https://greatmaps.codeplex.com/

相關推薦

基於GMap.Net地圖解決方案

一 地圖的載入與顯示 關於GMap的介紹與使用可以看我以前的文章: GMap.Net是.Net下一個地圖控制元件,可以基於Http協議載入各個公司的地圖,如Google,Bing,ArcGIS的,主要原理是通過解析各個公司的地圖服務的URL,傳入相應的引數得到對應的切片底圖(Tiled map),如一

GMap.Net解決方案之在WinForm和WPF中使用GMap.Net地圖插件的開發

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

Apollo 2.5推基於動態的實時相對地圖解決方案

如何 中心線 lan 精度 poll 視覺 會有 如何工作 adc Apollo 2.5推基於動態的實時相對地圖解決方案 太平洋電腦網 百家號06-2513:19 【PConline資訊】高精地圖對於開發者及測試者來說並不是可以輕易獲得的,制作高精地圖需要大

ASP.NET Zero--解決方案結構(層)

ges 檢測 lan auto git png 其他 nan repos 解決方案結構(層) 創建和下載項目後,您將具有如下所示的解決方案結構: 解決方案有8個項目: Core項目包含域層類(如 實體 和 域服務)。 Application項目包含應用

.net同一個解決方案下面多個web專案的解決方法

經過n次的google,下面是解決方法: 1. 新建一個web application 2. 在該application中新建資料夾SubSystem 3. 在整個的專案中新增web site。注意這其中的路徑(這裡的路徑是上面新建的資料夾的路徑)。 4. 上面的 工程中

Android webview顯示net::ERR_PROXY_CONNECTION_FAILED解決方案

這段時間一直用手機連線WiFi測試APP,但是一直打不開webview的網頁內容。一直顯示net::ERR_PROXY_CONNECTION_FAILED 如果變成了手機4G流量就可以開啟。一直以為是網路問題,結果發現是我把WiFi設定成代理了。 解決方法:

百度谷歌離線地圖解決方案(離線地圖下載)

離線地圖解決方案,除了買地圖資料,使用專業的ArcGIS來做外,也可以使用GMap.Net來做。 使用了GMap一年了,也有了一些積累,開發了一個可以下載ArcGIS、百度、谷歌、高德、騰訊SOSO、天地圖、Here等地圖的地圖下載器。 百度和google地圖載入顯示如下: 百度普通地圖: 百

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

VS Code 管理 .NET Core解決方案

dell 當我 如果 創建模板 ctr res site ont 結構 本練習要使用Visual studio code完成一個包含多個項目的解決方案,包括類庫和Web項目。結合Visual Studio Code和.NET Core CLI,創建項目結構如下: piedp

離線地圖解決方案【轉載】

Web GIS離線解決方案 1、背景 在離線環境下(區域網中)的GIS系統中如何使用地圖?這裡的地圖主要指的是地圖底圖,有了底圖切片資料,我們就可以看到地圖,在上面加上自己的業務資料圖層,進行相關操作。 要在離線環境下看到GIS地圖,就要有底圖切片資料,地

基於WEB的 SSO 解決方案

本文提出的解決方案將只解決使用者的身份驗證,即SSO本義,使用者的使用過程中許可權由各個業務系統進一步的控制。這種方案簡單可行,不僅完成使用者帳號的集中管理,而且對於原有的應用不需要做太大的更改,適合快速的解決Single Sign-On問題。 一、SSO實現原理 1、概念:

Arcgis for Android開發檔案一(離線地圖解決方案

ArcGIS Runtime for Android開發解決方案資料 目錄 前言 一、ArcGIS Runtime for Android 開發環境的搭建 二、ArcGIS Runtime for Android 離線地圖包的製作 三、ArcGIS Runtime for

基於.Net的單點登入(SSO)解決方案(2)

//產生令牌 string tokenValue = Guid.NewGuid().ToString().ToUpper(); HttpCookie tokenCookie = new HttpCookie("Token"); tokenCookie.Values.Add(

ASP.NET MVC下基於異常處理的完整解決方案

EntLib的異常處理應用塊(Exception Handling Application Block)是一個不錯的異常處理框架,它使我們可以採用配置的方式來定義異常處理策略。而ASP.NET MVC是一個極具可擴充套件開發框架,在這篇文章中我將通過它的擴充套件實現與

.NET基於Redis快取實現單點登入SSO的解決方案

一、基本概念 最近公司的多個業務系統要統一整合使用同一個登入,這就是我們耳熟能詳的單點登入,現在就NET基於Redis快取實現單點登入做一個簡單的分享。 單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義

C#/.NET基於Topshelf建立Windows服務的守護程式作為服務啟動的客戶端桌面程式不顯示UI介面的問題分析和解決方案

本文首發於:碼友網--一個專注.NET/.NET Core開發的程式設計愛好者社群。 文章目錄 C#/.NET基於Topshelf建立Windows服務的系列文章目錄: C#/.NET基於Topshelf建立Windows服務程式及服務的安裝和解除安裝 (1) 在C#/.NET應用程式開發中建立一個基於To

粘包處理現象及其解決方案——基於NewLife.Net網路庫的管道式幀長粘包處理方法

目錄1.粘包現象2.粘包原因2.1. 同一客戶端連續傳送2.2. 網路擁塞造成粘包2.3. 服務端卡死了3. 粘包的危害3.1. 無法正確解析資料包3.2. 錯誤資料包被錯誤解析3.3. 進入死迴圈4. 粘包的邏輯處理方式4.1. 根據包尾特徵引數進行區分4.2. 根據包頭包尾特徵引數進行區分4.3. 根據報

基於.NET的程式讀取Excel檔案的解決方案

[TOC] shanzm-2020年12月8日 23:48:11 ### 0. 前言 以前基於 .NET 開發的程式,我一般都是使用NPOI操作Excel檔案, 因為我的程式讀取的是另外一個成品WMS匯出的Excel檔案(至於為什麼不直接從資料庫獲取該WMS匯出到Excel的資料,此中原因,一言難盡

WEB.NET error:請添加一個名為 jquery (區分大小寫)的 ScriptResourceMapping 解決方案

clas resource 文件 全局 區分大小寫 get com 技術 star 參考 http://blog.csdn.net/kisscatforever/article/details/50579935 今天用了一個組件 一個驗證型的組件。 然後出現了這個問

asp.net MVC 常見安全問題及解決方案

container coo baidu his ring article 調試工具 並且 part asp.net MVC 常見安全問題及解決方案一.CSRF (Cross-site request forgery跨站請求偽造,也被稱為“one click attack”或