精华内容
下载资源
问答
  • 地图坐标转换

    2018-10-27 14:43:00
    地图坐标转换 高德,百度 /// <summary> /// 坐标转换 /// </summary> public class GpsUtil { public static double pi = 3.1415926535897932384626; public static...

    地图坐标转换  高德,百度

    /// <summary>
        /// 坐标转换
        /// </summary>
        public class GpsUtil
        {
    
            public static double pi = 3.1415926535897932384626;
            public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
            public static double a = 6378245.0;
            public static double ee = 0.00669342162296594323;
    
            public static double TransformLat(double x, double y)
            {
                double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                        + 0.2 * Math.Sqrt(Math.Abs(x));
                ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
                ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
                ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
                return ret;
            }
    
            public static double TransformLon(double x, double y)
            {
                double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                        * Math.Sqrt(Math.Abs(x));
                ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
                ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
                ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0
                        * pi)) * 2.0 / 3.0;
                return ret;
            }
    
            public static double[] transform(double lat, double lon)
            {
                if (OutOfChina(lat, lon))
                {
                    return new double[] { lat, lon };
                }
                double dLat = TransformLat(lon - 105.0, lat - 35.0);
                double dLon = TransformLon(lon - 105.0, lat - 35.0);
                double radLat = lat / 180.0 * pi;
                double magic = Math.Sin(radLat);
                magic = 1 - ee * magic * magic;
                double SqrtMagic = Math.Sqrt(magic);
                dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi);
                dLon = (dLon * 180.0) / (a / SqrtMagic * Math.Cos(radLat) * pi);
                double mgLat = lat + dLat;
                double mgLon = lon + dLon;
                return new double[] { mgLat, mgLon };
            }
    
            public static bool OutOfChina(double lat, double lon)
            {
                if (lon < 72.004 || lon > 137.8347)
                    return true;
                if (lat < 0.8293 || lat > 55.8271)
                    return true;
                return false;
            }
    
            /** 
                * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System 
                * 
                * @param lat 
                * @param lon 
                * @return 
                */
            public static double[] Gps84ToGcj02(double lat, double lon)
            {
                if (OutOfChina(lat, lon))
                {
                    return new double[] { lat, lon };
                }
                double dLat = TransformLat(lon - 105.0, lat - 35.0);
                double dLon = TransformLon(lon - 105.0, lat - 35.0);
                double radLat = lat / 180.0 * pi;
                double magic = Math.Sin(radLat);
                magic = 1 - ee * magic * magic;
                double SqrtMagic = Math.Sqrt(magic);
                dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi);
                dLon = (dLon * 180.0) / (a / SqrtMagic * Math.Cos(radLat) * pi);
                double mgLat = lat + dLat;
                double mgLon = lon + dLon;
                return new double[] { mgLat, mgLon };
            }
    
            /** 
                * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return 
                * */
            public static double[] Gcj02ToGps84(double lat, double lon)
            {
                double[] gps = transform(lat, lon);
                double lontitude = lon * 2 - gps[1];
                double latitude = lat * 2 - gps[0];
                return new double[] { latitude, lontitude };
            }
            /// <summary>
            /// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 
            /// 高德谷歌转为百度
            /// </summary>
            /// <param name="lat"></param>
            /// <param name="lon"></param>
            /// <returns></returns>
            public static double[] Gcj02ToBd09(double lat, double lon)
            {
                double x = lon, y = lat;
                double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
                double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
                double tempLon = z * Math.Cos(theta) + 0.0065;
                double tempLat = z * Math.Sin(theta) + 0.006;
                double[] gps = { tempLat, tempLon };
                return gps;
            }
    
            /// <summary>
            /// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标
            /// 百度坐标转为高德谷歌坐标
            /// </summary>
            /// <param name="lat"></param>
            /// <param name="lon"></param>
            /// <returns></returns>
            public static double[] Bd09ToGcj02(double lat, double lon)
            {
                double x = lon - 0.0065, y = lat - 0.006;
                double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_pi);
                double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * x_pi);
                double tempLon = z * Math.Cos(theta);
                double tempLat = z * Math.Sin(theta);
                double[] gps = { tempLat, tempLon };
                return gps;
            }
    
            /// <summary>
            /// gps84转为bd09
            /// GPS坐标转为百度坐标
            /// </summary>
            /// <param name="lat"></param>
            /// <param name="lon"></param>
            /// <returns></returns>
            public static double[] Gps84ToBd09(double lat, double lon)
            {
                double[] gcj02 = Gps84ToGcj02(lat, lon);
                double[] bd09 = Gcj02ToBd09(gcj02[0], gcj02[1]);
                return bd09;
            }
            /// <summary>
            /// 百度坐标转成GPS坐标
            /// </summary>
            /// <param name="lat"></param>
            /// <param name="lon"></param>
            /// <returns></returns>
            public static double[] Bd09ToGps84(double lat, double lon)
            {
                double[] gcj02 = Bd09ToGcj02(lat, lon);
                double[] gps84 = Gcj02ToGps84(gcj02[0], gcj02[1]);
                //保留小数点后六位  
                gps84[0] = Retain6(gps84[0]);
                gps84[1] = Retain6(gps84[1]);
                return gps84;
            }
    
            /// <summary>
            /// 保留小数点后六位 
            /// </summary>
            /// <param name="num"></param>
            /// <returns></returns>
            private static double Retain6(double num)
            {
                String result = String.Format("{0:0.000000}", num);
                return Double.Parse(result);
            }
    
            
        }
    

      

     

    转载于:https://www.cnblogs.com/OleRookie/p/9861146.html

    展开全文
  • 最近做项目需要百度地图坐标转换到高德地图坐标,高德官方也给出了转换接口(百度地图也给出了转换接口)http://lbs.amap.com/api/javascript-api/reference/lnglat-to-address#t1但是还想想直接通过后台一次性处理好...

    最近做项目需要百度地图坐标转换到高德地图坐标,高德官方也给出了转换接口(百度地图也给出了转换接口)

    http://lbs.amap.com/api/javascript-api/reference/lnglat-to-address#t1

    但是还想想直接通过后台一次性处理好坐标,因此需要找到坐标转换算法,封装起来调用。

    1 百度官方对百度坐标为何有偏移的解释

    国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。

    2 火星坐标系(GCJ-02)与百度坐标系(BD-09)的转换算法

    GCJ-02(火星坐标) 和 BD-09 (百度坐标)

    算法代码如下,其中bd_encrypt将 GCJ-02 坐标转换成 BD-09 坐标,bd_decrypt反之。

    封装经纬度:

    /** 经纬度点封装

    * Created by 明明如月 on 2017-03-22.

    */

    public class LngLat {

    private double longitude;//经度

    private double lantitude;//维度

    public LngLat() {

    }

    public LngLat(double longitude, double lantitude) {

    this.longitude = longitude;

    this.lantitude = lantitude;

    }

    public double getLongitude() {

    return longitude;

    }

    public void setLongitude(double longitude) {

    this.longitude = longitude;

    }

    public double getLantitude() {

    return lantitude;

    }

    public void setLantitude(double lantitude) {

    this.lantitude = lantitude;

    }

    @Override

    public String toString() {

    return "LngLat{" +

    "longitude=" + longitude +

    ", lantitude=" + lantitude +

    '}';

    }

    }

    /** 百度地图坐标和火星坐标转换

    * Created by 明明如月 on 2017-03-22.

    */

    public class CoodinateCovertor {

    private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

    /**

    * 对double类型数据保留小数点后多少位

    * 高德地图转码返回的就是 小数点后6位,为了统一封装一下

    * @param digit 位数

    * @param in 输入

    * @return 保留小数位后的数

    */

    static double dataDigit(int digit,double in){

    return new BigDecimal(in).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();

    }

    /**

    * 将火星坐标转变成百度坐标

    * @param lngLat_gd 火星坐标(高德、腾讯地图坐标等)

    * @return 百度坐标

    */

    public static LngLat bd_encrypt(LngLat lngLat_gd)

    {

    double x = lngLat_gd.getLongitude(), y = lngLat_gd.getLantitude();

    double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);

    double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);

    return new LngLat(dataDigit(6,z * cos(theta) + 0.0065),dataDigit(6,z * sin(theta) + 0.006));

    }

    /**

    * 将百度坐标转变成火星坐标

    * @param lngLat_bd 百度坐标(百度地图坐标)

    * @return 火星坐标(高德、腾讯地图等)

    */

    static LngLat bd_decrypt(LngLat lngLat_bd)

    {

    double x = lngLat_bd.getLongitude() - 0.0065, y = lngLat_bd.getLantitude() - 0.006;

    double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);

    double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);

    return new LngLat( dataDigit(6,z * cos(theta)),dataDigit(6,z * sin(theta)));

    }

    //测试代码

    public static void main(String[] args) {

    LngLat lngLat_bd = new LngLat(120.153192,30.25897);

    System.out.println(bd_decrypt(lngLat_bd));

    }

    }

    经验证和高德地图自带接口转换出效果一致。

    展开全文
  • 地图坐标转换工具

    2017-06-02 09:32:29
    地图坐标转换工具
  • GeoPoint工具类,百度地图坐标转换jar,地图坐标转换...
  • 主要介绍了Python地图坐标转换的相关知识点以及分享了相关的代码实例,对此有兴趣的朋友学习下。
  • 最近做项目需要百度地图坐标转换到高德地图坐标,高德官方也给出了转换接口(百度地图也给出了转换接口) http://lbs.amap.com/api/javascript-api/reference/lnglat-to-address#t1 但是还想想直接通过后台一次性...

    最近做项目需要百度地图坐标转换到高德地图坐标,高德官方也给出了转换接口(百度地图也给出了转换接口)

    http://lbs.amap.com/api/javascript-api/reference/lnglat-to-address#t1

    但是还想想直接通过后台一次性处理好坐标,因此需要找到坐标转换算法,封装起来调用。



    1 百度官方对百度坐标为何有偏移的解释

      国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。


    2 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法

    GCJ-02(火星坐标 BD-09 (百度坐标)

    算法代码如下,其中 bd_encrypt 将 GCJ-02 坐标转换成 BD-09 坐标, bd_decrypt 反之。


    封装经纬度:

    /** 经纬度点封装
     * Created by 明明如月 on 2017-03-22.
     */
    public class LngLat {
        private double longitude;//经度
        private double lantitude;//维度
    
        public LngLat() {
        }
    
        public LngLat(double longitude, double lantitude) {
            this.longitude = longitude;
            this.lantitude = lantitude;
        }
    
        public double getLongitude() {
            return longitude;
        }
    
        public void setLongitude(double longitude) {
            this.longitude = longitude;
        }
    
        public double getLantitude() {
            return lantitude;
        }
    
        public void setLantitude(double lantitude) {
            this.lantitude = lantitude;
        }
    
        @Override
        public String toString() {
            return "LngLat{" +
                    "longitude=" + longitude +
                    ", lantitude=" + lantitude +
                    '}';
        }
    }


    /** 百度地图坐标和火星坐标转换
     * Created by 明明如月 on 2017-03-22.
     */
    public class CoodinateCovertor {
    
    
        private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    
        /**
         * 对double类型数据保留小数点后多少位
         *  高德地图转码返回的就是 小数点后6位,为了统一封装一下
         * @param digit 位数
         * @param in 输入
         * @return 保留小数位后的数
         */
         static double dataDigit(int digit,double in){
            return new   BigDecimal(in).setScale(6,   BigDecimal.ROUND_HALF_UP).doubleValue();
    
        }
    
        /**
         * 将火星坐标转变成百度坐标
         * @param lngLat_gd 火星坐标(高德、腾讯地图坐标等)
         * @return 百度坐标
         */
        
     public static LngLat bd_encrypt(LngLat lngLat_gd)
        {
            double x = lngLat_gd.getLongitude(), y = lngLat_gd.getLantitude();
            double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
            double theta = atan2(y, x) + 0.000003 * cos(x *  x_pi);
            return new LngLat(dataDigit(6,z * cos(theta) + 0.0065),dataDigit(6,z * sin(theta) + 0.006));
    
        }
        /**
         * 将百度坐标转变成火星坐标
         * @param lngLat_bd 百度坐标(百度地图坐标)
         * @return 火星坐标(高德、腾讯地图等)
         */
        static LngLat bd_decrypt(LngLat lngLat_bd)
        {
            double x = lngLat_bd.getLongitude() - 0.0065, y = lngLat_bd.getLantitude() - 0.006;
            double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
            double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
            return new LngLat( dataDigit(6,z * cos(theta)),dataDigit(6,z * sin(theta)));
    
        }
    
    //测试代码
        public static void main(String[] args) {
            LngLat lngLat_bd = new LngLat(120.153192,30.25897);
            System.out.println(bd_decrypt(lngLat_bd));
        }
    }
    


    经验证和高德地图自带接口转换出效果一致。


    展开全文
  • OpenLayers地图坐标转换屏幕坐标

    千次阅读 2017-06-09 21:12:07
    最近因工作原因开始接触OpenLayers地图,遇到需要将地图坐标转换成屏幕坐标,因为技术有限,在大量查看API、与大神写的文章时候还是有写地方疏忽了,先将整个地图坐标转换地图坐标进行记录。
    
    

    最近因工作原因开始接触OpenLayers地图,遇到需要将地图坐标转换成屏幕坐标,因为技术有限,在大量查看API、与大神写的文章时候还是有写地方疏忽了,先将整个地图坐标转换地图坐标进行记录。

    第一步为指定的代码获取投影对象。

    ol.proj.get('EPSG:4326') 在得到投影对象后需要取到投影有效范围,get接口为ol.proj.Projection下有getExtent方法获取投影有效性范围。

    ol.proj.get('EPSG:4326').getExtent()

         第二步

    获取地图的宽度范围,ol.extent.getWidth(ol.proj.get('EPSG:4326').getExtent());到这里基本操作结束。

    接下来就是

    //地图坐标转屏幕坐标:
    screenPt.x=screen.center.x+ ((mapPt.x-mapExtent.center.x)/resolution+0.5);
    screenPt.y=screen.center.y- (mapPt.y-mapExtent.center.y)/resolution+0.5);

    在这个公式中screen是屏幕坐标,mapPt是地图坐标,mapExtent是地图中心坐标,resolution 就是地图宽度范围,这个公式网上搜索到的,经测试无误。只是这里偏移了0.5。本人不喜欢写记录,但只因这个问题困扰我一天,希望对迷茫的朋友有一点帮助。谢谢,也希望朋友们提出我的缺点,加以改正。

    展开全文
  • 百度地图坐标转换为墨卡托坐标

    千次阅读 2019-03-18 20:46:39
    百度地图坐标转换为墨卡托坐标 转换思路 百度坐标系 (BD-09)首先转换为火星坐标系 (GCJ-02) ,根据gci坐标的经纬度再转成墨卡托坐标; 功能代码 /** * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * ...
  • 屏幕坐标和地图坐标转换,就是字面意思,将电脑屏幕的坐标转换为带有空间信息的地图坐标,主要运用PIE SDK地图控件的ToMapPoint()方法,而地图坐标转换为设备坐标(屏幕),用的是FromMapPoint()方法。 2.功能实现...
  • 百度地图坐标转换工具,java后台代码,java后台处理坐标代码
  • * 坐标转换,百度地图坐标转换成腾讯地图坐标 * lng 腾讯经度(pointy) * lat 腾讯纬度(pointx) * 经度>纬度 */ function bMapToQQMap(lng, lat) { if (lng == null || lng == '' || lat == null || lat...
  • 然而一些地图SDK给出的地图坐标转换接口的实现是在服务器进行的,那么这些接口的调用不但会发起网络请求而效率上也会非常的慢,无论是对于客户端离线操作还是在自己的服务后台批量转换坐标数据,都需
  • 地图坐标转换算法

    2018-07-31 14:20:37
    地图工具都有坐标转换 API 可用,但是成千上万的 GPS 数据通过 API 转换是一件很消耗资源的事,所以需要提供一种离线转换的方式。 本人在项目中曾也用过 API 转换的方式,但是当设备数量一增加,在坐标转换这一个...
  • 地图坐标转换,火星、WGS84、BD09 火星、WGS84、BD09、GCJ02,地图坐标转换
  • 百度地图 坐标转换 顺序问题

    千次阅读 2017-11-20 15:58:57
    集中处理了百度地图坐标转换的一些问题,坐标批量转换,回调函数的异步性。
  • 主要介绍了微信小程序把百度地图坐标转腾讯地图坐标过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,208
精华内容 1,283
关键字:

地图坐标转换