前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >坐标系转换工具类

坐标系转换工具类

作者头像
Cheng_Blog
发布于 2022-02-25 01:40:07
发布于 2022-02-25 01:40:07
42100
代码可运行
举报
文章被收录于专栏:Cheng's BlogCheng's Blog
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 坐标工具
 *
 * @author Cheng
 * @date 2021/04/07
 */
public class CoordinatesUtil {
    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;

    /**
     * 84 ==》 高德
     *
     * @param lon 经度
     * @param lat 纬度
     * @return
     */
    public static String gps84_To_Gcj02(double lon, double lat) {
        if (outOfChina(lat, lon)) {
            return lon + "," + lat;
        }
        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 mgLon + "," + mgLat;
    }

    /**
     * 高德 ==》 84
     *
     * @param lon * @param lat * @return
     * @param lat 纬度
     * @param lon 经度
     */
    public static String gcj02_To_Gps84(double lon, double lat) {
        double[] gps = transform(lat, lon);
        double lontitude = lon * 2 - gps[1];
        double latitude = lat * 2 - gps[0];
        return lontitude + "," + latitude;
    }

    /**
     * 百度转高德
     *
     * @param bd_lon 经度
     * @param bd_lat 纬度
     * @return {@link String}
     */
    private static String bdToGaoDe(double bd_lon, double bd_lat) {
        double[] gd_lat_lon = new double[2];
        double PI = 3.14159265358979324 * 3000.0 / 180.0;
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI);
        gd_lat_lon[0] = z * Math.cos(theta);
        gd_lat_lon[1] = z * Math.sin(theta);
        return gd_lat_lon[0] + "," + gd_lat_lon[1];
    }

    /**
     * 百度转84
     *
     * @param lon 经度
     * @param lat 纬度
     * @return {@link String}
     */
    public static String bd09_To_gps84(double lon, double lat) {
        String[] gcj02 = bdToGaoDe(lon, lat).split(",");
        return gcj02_To_Gps84(Double.parseDouble(gcj02[0]), Double.parseDouble(gcj02[1]));
    }

    /**
     * 高德 == 》 百度
     *
     * @param lon 经度
     * @param lat 纬度
     */
    public static String gcj02_To_Bd09(double lon, double lat) {
        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;
        return tempLon + "," + tempLat;
    }

    /**
     * 84 == 》 百度
     *
     * @param lat 纬度
     * @param lon 经度
     * @return
     */
    public static String gps84_To_bd09(double lon, double lat) {
        String[] Gcj02 = gps84_To_Gcj02(lon, lat).split(",");
        return gcj02_To_Bd09(Double.parseDouble(Gcj02[0]), Double.parseDouble(Gcj02[1]));
    }
    
	/**
     * wgs84to墨卡托
     *
     * @param lng 经度
     * @param lat 纬度
     * @return {@link String}
     */
    public static String wgs84toMercator(double lng, double lat) {
        Map<String, Object> toMercator = new HashMap(3);
        toMercator.put("coords", lng + "," + lat);
        toMercator.put("from", 1);
        toMercator.put("to", 6);
        toMercator.put("ak", "UpCmCBcWeKShAgw46m6xwxT5QmBssBKy");
        try {
            return HttpUtils.httpGetRequest("http://api.map.baidu.com/geoconv/v1/", toMercator);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 判断是否在中国
     *
     * @param lat
     * @param lon
     * @return
     */
    public static boolean outOfChina(double lat, double lon) {
        if (lon < 72.004 || lon > 137.8347) {
            return true;
        }
        return lat < 0.8293 || lat > 55.8271;
    }

    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};
    }
}

发表时间:2021-08-25

本站文章除注明转载/出处外,皆为作者原创,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高德,百度,Google地图定位偏移以及坐标系转换
一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;
麦克劳林
2018/09/11
7.4K0
FreeJTS部标视频平台:车载坐标系与地图坐标系转换
最近在开发部标平台中进行轨迹回放的定位接口中,返发现回的是WSG-84坐标系下的经纬度信息,但项目前端使用的是高德地图,发现位置有偏移。经了解,需要进行车载坐标系和地图坐标系进行转换。
TSINGEYE清眸物联
2023/01/04
9210
FreeJTS部标视频平台:车载坐标系与地图坐标系转换
结合Geotools实现百度09,国测局02和经纬度的相互转换
本文讲述在Java中,结合结合Geotools实现百度09,国测局02和经纬度shp数据的相互转换。
牛老师讲GIS
2018/10/23
2.3K0
结合Geotools实现百度09,国测局02和经纬度的相互转换
用Python实现WGS84、火星坐标系、百度坐标系、web墨卡托四种坐标相互转换
  主流被使用的地理坐标系并不统一,常用的有WGS84、GCJ02(火星坐标系)、BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用Python编写相关类以实现4种坐标系统之间的互相转换。
Feffery
2019/06/16
7.4K3
gis经纬度坐标转换多格式兼容:支持字符串/数组/GeoJSON
代码,https://www.npmjs.com/package/coordtransform2
周陆军博客
2023/04/09
8430
python实现地理位置类数据爬取与geohash应用初探
最近想做一个简单的地理位置分析,比如获取一些城市公交站点对应的geohash,geohash其实是将平时常见的经纬度进行了降维,这样可以进行类似附近的餐馆等内容的分析。
流川疯
2019/01/18
3.6K0
WebGis技术汇总
WebGIS系统通常都围绕地图进行内容表达,但并不是有地图就一定是WebGIS,所以有必要讨论下基于Web的地图API分类及应用场景。
码客说
2023/07/11
8530
自学HarmonyOS应用开发(54)- 校正定位偏差
经过一番调查,结论是gps信号使用的是WGS-84坐标系,而高德地图使用的是GCJ-02火星坐标系,只有经过坐标变换才能显示正确的位置。这方面的文章网上有很多,这里采用以下博客文章中的代码:
面向对象思考
2021/07/15
3480
(数据科学学习手札59)从抓取数据到生成shp文件并展示
  shp格式的文件是地理信息领域最常见的文件格式之一,很好的结合了矢量数据与对应的标量数据,而在Python中我们可以使用pyshp来完成创建shp文件的过程,本文将从如何从高德地图获取矢量信息开始,最终构造出相应的shp文件,并利用R中的leaflet进行可视化;
Feffery
2019/06/11
2.2K0
(数据科学学习手札59)从抓取数据到生成shp文件并展示
智能网联汽车开发篇:行驶轨迹跟踪
我使用的是vultr的VPS服务器(最便宜的3.5美元/月就可以,不用买贵的。并且不使用时可以删除掉,不计费的),注册地址(打个广告,可以忽略):
FB客服
2020/05/14
1.1K0
智能网联汽车开发篇:行驶轨迹跟踪
百度地图自定义marker(图标),layer(覆盖层)
本文只要涉及的内容有,web中动态引入百度地图,基于百度地图的本地搜索(公交,地铁,停车场),自定义marker,layer,接入微信内置地图(微信中使用第三方导航)。
j_bleach
2019/07/02
4.6K0
百度地图自定义marker(图标),layer(覆盖层)
从零开始搭建一个GIS开发小框架(三)——扩展功能:搜索地址
"搜索地址"功能是GIS项目最基本的功能,根据地址文字片段以模糊查找的方式寻找精确坐标。
天堂向左
2022/06/14
7630
从零开始搭建一个GIS开发小框架(三)——扩展功能:搜索地址
初学者也能快速写Python脚本啦——通用功能代码分享
满打满算也算是编写了5个应用场景的Python脚本,其实做的工作大多是从高德地图那里“偷”数据(对不起,高德)。编写今天这个“GetDistance”的脚本的时候,发觉,其实有很多操作是通用的,比如交互式输入、请求数据、储存数据为Excel表格等等,所以编的过程中整理了一下,把它们都做成自定义函数,方便后期调用。
Sidchen
2020/10/10
7390
iOS在地图上WGS84、GCJ-02、BD-09互转解决方案
该项目的最新进展包括地图共享模块,android同事集团开始,使用百度地图sdk,我开始回,运用iOS SDK的mapkit做,之后,问题是,用纬度和经度坐标iOS端和Android端出现了比較大偏差。查了下资料苹果地图在大陆的数据源是高德的,查了下高德採用GCJ-02, 百度map sdk 採用的是BD-09。仅仅好写了个类在发送和接收时做好转换,稍微蛋疼。Github上有人写了一个现成的转换类,能够參考參考传送门 。其主要代码见下:
全栈程序员站长
2022/07/06
1.1K0
GCJ-02(高德) BD-09(百度) WGS-84(谷歌)坐标系之间的转换
新建一个 js 文件,直接把下面的代码copy进去。在需要使用的地方导入就可以调用下面的各个转换方法了 —.—
andyhu
2022/12/14
11.9K0
火星坐标系统_怎样算自己的上升星座
其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,GPS终端设备必须集成保密局提供的加密算法(集成工作由保密局完成),把从GPS卫星那里得到的坐标转换成虚拟坐标,然后再去火星地图上查找,这样就在火星坐标系上完成了地图的匹配。 所以大家所用的百度,高德等地图定位准是偏差几百米
全栈程序员站长
2022/09/20
4150
【IoT迷你赛】在中移动标准板上利用tos实现GPS追踪器
因为收到的TencentOS tiny内测开发板只有ESP8266,利用WiFi来实现GPS跟踪有点不太现实。而最近正好从中移动手里薅了一个标准开发板(如下图),上面自带GSM模组M6312,就想着把tos搞到这个开发板上来利用,M6312接入网络来实现地理位置上报。
kernel
2019/08/26
1.1K0
【IoT迷你赛】在中移动标准板上利用tos实现GPS追踪器
【实战】我背着女朋友,用 Python 偷偷抓取了她的行踪
有时候女朋友一个人在外面玩耍,问她在哪个地方,就是不告诉我。但是,你又很想知道女朋友的「位置」,这该如何是好?
昱良
2019/09/02
1.2K0
【实战】我背着女朋友,用 Python 偷偷抓取了她的行踪
iOS地图开发2-坐标系的转换(swift)
代码 // // ZJ_MapKits // // Created by PSVMC on 15/6/8. // Copyright (c) 2015年 PSVMC. All rights reserved. // import Foundation import CoreLocation class ZJ_MapKits{ //WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块) //GCJ-02:中国坐标偏移标准,Google Map、
码客说
2019/10/22
1.5K0
利用python实现地理加权回归(GWR)与网约车订单数据挖掘
说到地理加权回归,相信大家肯定不会陌生。作为一种先进的空间数据分析技术,地理加权回归能够充分捕捉空间关系的非平稳性。举个简单的不恰当的例子,我们要对中国各个城市的奢侈品消费量与人均收入进行建模。正常的的理解是人均收入越高,奢侈品消费量就越大,在全国各个城市都应该是这种关系(这也正是全局模型的前提假设)。但事实真的是这样吗?现实情况可能是在一些比较张扬的地方(比如我们大东百
DataCharm
2021/02/22
5K5
利用python实现地理加权回归(GWR)与网约车订单数据挖掘
推荐阅读
相关推荐
高德,百度,Google地图定位偏移以及坐标系转换
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文