百度一直以來都是個即想裝出一副擁抱互聯網開放的樣子,又爲了短時間商業利益封閉本身的公司,模仿谷歌地圖,開放了本身的百度地圖 API,爲了防止別人盜用其數據和用戶自由遷移,地圖相比於火星座標,又更加封閉,在火星座標的基礎上進一步的加偏,偏上加偏。國際經緯度座標標準爲WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度座標在此基礎上,進行了BD-09二次加密措施,讓開發人員倍感不爽。php
爲了方便開發人員調用,咱們開發了百度座標轉換工具,並提供動態庫方便開發者調用。算法庫可見個人文章:http://www.cnblogs.com/productivity/p/3974591.htmlhtml
提供功能:web
1.原始GPS座標轉百度座標算法
2.火星座標轉百度座標數據庫
3.百度座標轉GPS座標工具
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MapServiceClient; using MapServiceClient.MapFix; using GpsNET.CoordService; using GpsNET; /** *@author: www.ltmonitor.com *@email: speed.zheng@gmail.com */ namespace MapServiceDemo { class Program { static void Main(string[] args) { MapServiceClient.MapFix.IMapService service = MapServiceFactory.getMapService(); double lng1 = 121.111; double lat1 = 32.121; //獲取地理位置 String location = service.GetLocation(lng1, lat1); Console.WriteLine(location); //測試點是否在圓形區域中 double centerLng = 120; double centerLat = 32;//圓心座標 double radiusByMeter = 100;//圓形半徑,米爲單位 Boolean isInCircle = service.IsInCircle(lng1, lat1, centerLng, centerLat, radiusByMeter); //測試點是否在多邊形中 MyPointLatLng p = new MyPointLatLng(lat1, lng1); MyPointLatLng p1 = new MyPointLatLng(33.12,121.10); MyPointLatLng p2 = new MyPointLatLng(33.12, 121.10); MyPointLatLng p3 = new MyPointLatLng(33.12, 121.10); MyPointLatLng p4 = new MyPointLatLng(33.12, 121.10); MyPointLatLng[] points = new MyPointLatLng[]{p1,p2,p3};//多邊形的頂點 Boolean isInPolygon = service.IsInPolygon(p, points); //測試點是否在矩形中,矩形的左上角和右下角的座標必需要輸入正確,不能搞混 //Boolean isInRect = service.IsInRect(lng1,lat1,lngLeft, latTop,lngRight,latBottom); int offset = 12;//路線偏移的最大距離 Boolean isOnline = service.IsPointOnLine(p, p1, p2, offset); //測試座標加偏和解偏 for (int m = 0; m < 50; m++) { double lng = 121.122 + m * 0.01; double lat = 33.222 + m * 0.01; //百度座標加偏 MyPointLatLng pt1 = service.Fix(lng, lat, "baidu"); /** *反向還原成原始的GPS座標 */ MyPointLatLng pt2 = service.Reverse(pt1.Lng, pt1.Lat, "baidu"); /** * 得到兩點之間的偏差距離,單位米 */ double d = service.GetDistanceByMeter(lng, lat, pt2.Lng, pt2.Lat); Console.WriteLine("百度座標還原後,兩點之間的偏差精度:" + d + "米"); //火星座標系(如谷歌,高德)座標加偏 pt1 = service.Fix(lng, lat, "google"); /** *反向還原成原始的GPS座標 */ pt2 = service.Reverse(pt1.Lng, pt1.Lat, "google"); /** * 得到兩點之間的偏差距離,單位米 */ d = service.GetDistanceByMeter(lng, lat, pt2.Lng, pt2.Lat); Console.WriteLine("谷歌座標還原後,兩點之間的偏差精度:" + d + "米"); } Console.ReadLine(); } } } 原始座標,和通過加偏再解偏後的座標比較,偏差精度在1米左右,很是精確。運行結果以下:
本系統實時加偏,採用加偏算法和逆向糾偏算法,能夠實時的進行百度地圖的座標系統轉換,不須要百度自帶的webservice服務,避免了百度調用接口的限制及性能的損失,由於每次遠程調用http,都要耗費不固定的遠程調用時間及調用超時的時間。測試
另外存在一個問題是,不管是那個地圖,在地圖上畫的區域存儲在數據庫的都是本身地圖座標系統的經緯度節點,若是要進行電子圍欄報警,下發給終端的時候,終端是百分百誤報的,由於終端的座標和地圖座標系統不符,須要在下發給終端前,還原成原始座標再下發給終端。因此就須要逆向還原的糾偏算法。咱們提供正向和反向的算法庫。google
須要購買C# .netframework2.0 離線版 DLL 的300元 算法源碼600元,包含原始座標加偏和逆向糾偏還原成原始座標。提供火星座標和百度座標兩種接口,不是數據庫,提供的是算法源碼,實時解析,須要的能夠直接聯繫我(2379423771@qq.com)購買。
API阿里雲 |
座標系 |
百度地圖API |
百度座標 |
騰訊搜搜地圖API |
火星座標 |
搜狐搜狗地圖API |
搜狗座標* |
阿里雲地圖API |
火星座標 |
圖吧MapBar地圖API |
圖吧座標 |
高德MapABC地圖API |
火星座標 |
靈圖51ditu地圖API |
火星座標 |