百度一直以來都是個即想裝出一副擁抱互聯網開放的樣子,又為了短期商業利益封閉自己的公司,模仿谷歌地圖,開放了自己的百度地圖 API,為了防止別人盜用其數據和用戶自由遷移,地圖相比於火星坐標,又更加封閉,在火星坐標的基礎上進一步的加偏,偏上加偏。國際經緯度坐標標准為WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度坐標在此基礎上,進行了BD-09二次加密措施,讓開發人員倍感不爽。
為了方便開發人員調用,我們開發了百度坐標轉換工具,並提供動態庫方便開發者調用。算法庫可見我的文章:http://www.cnblogs.com/productivity/p/3974591.html
提供功能:
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,都要耗費不固定的遠程調用時間及調用超時的時間。
另外存在一個問題是,無論是那個地圖,在地圖上畫的區域存儲在數據庫的都是自己地圖坐標系統的經緯度節點,如果要進行電子圍欄報警,下發給終端的時候,終端是百分百誤報的,因為終端的坐標和地圖坐標系統不符,需要在下發給終端前,還原成原始坐標再下發給終端。所以就需要逆向還原的糾偏算法。我們提供正向和反向的算法庫。
需要購買C# .netframework2.0 離線版 DLL 的300元 算法源碼600元,包含原始坐標加偏和逆向糾偏還原成原始坐標。提供火星坐標和百度坐標兩種接口,不是數據庫,提供的是算法源碼,實時解析,需要的可以直接聯系我(2379423771@qq.com)購買。
API |
坐標系 |
百度地圖API |
百度坐標 |
騰訊搜搜地圖API |
火星坐標 |
搜狐搜狗地圖API |
搜狗坐標* |
阿里雲地圖API |
火星坐標 |
圖吧MapBar地圖API |
圖吧坐標 |
高德MapABC地圖API |
火星坐標 |
靈圖51ditu地圖API |
火星坐標 |