代码改变世界

百度地图坐标纠偏和转换工具和DLL

2013-09-26 18:08  GPS视频平台产品经理  阅读(5673)  评论(1编辑  收藏  举报

百度一直以来都是个即想装出一副拥抱互联网开放的样子,又为了短期商业利益封闭自己的公司,模仿谷歌地图,开放了自己的百度地图 API,为了防止别人盗用其数据和用户自由迁移,地图相比于火星坐标,又更加封闭,在火星坐标的基础上进一步的加偏,偏上加偏。国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,让开发人员倍感不爽。

为了方便开发人员调用,我们开发了百度坐标转换工具,并提供动态库方便开发者调用。算法库可见我的文章:http://www.cnblogs.com/productivity/p/3974591.html

 

提供功能:

1.原始GPS坐标转百度坐标

2.火星坐标转百度坐标

3.百度坐标转GPS坐标

GPS算法服务库DemoGPS算法服务库Demo 已下载 339 次

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

火星坐标