常见GIS坐标系的坐标转换

几种常见的 GIS 坐标系的简单介绍及坐标数据的相互转换方法。


一、坐标系介绍

1. WGS-84:大地坐标系

  • 国际通用坐标系,也叫地球坐标系。
  • 各 GPS 设备、境外地图(包括但不限于谷歌地图、高德地图、百度地图的境外版)等使用的坐标系。

2. GCJ-02:国测局坐标系

  • 国内通用坐标系,也叫火星坐标系。
  • 各境内地图(高德地图、腾讯地图等)等使用的坐标系。

3. BD-09:百度坐标系

  • GCJ-02 基础上的二次加密。
  • 百度标准,百度 SDK,百度地图,百度 GeoCoding 等使用的坐标系。

二、坐标数据转换方法-Java 版

1. 准备工作

1.1 定义依赖的一些常量和转换方法

    private static final double PI = Math.PI;private static final double X_PI = PI * 3000.0 / 180.0;private static final double AA = 6378245.0;private static final double EE = 0.00669342162296594323;/*** 经纬度偏移转换-经度** @param lng* @param lat* @return*/private static double transformLng(double lng, double lat) {double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;}/*** 经纬度偏移转换-维度** @param lng* @param lat* @return*/private static double transformLat(double lng, double lat) {double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;}/*** 判断坐标是否超出境内** @param lng* @param lat* @return*/private static boolean outOfChina(double lng, double lat) {// 纬度3.86~53.55,经度73.66~135.05;非精确判断,可能误判return !(73.66 < lng && lng < 135.05 && 3.86 < lat && lat < 53.55);}

2. WGS-84 和 GCJ-02 的相互转换

2.1 WGS-84 转 GCJ-02

    /*** WGS-84转GCJ-02** @param lng* @param lat* @return*/public static double[] wgs84ToGcj02(double lng, double lat) {if (outOfChina(lng, lat)) {return new double[]{lng, lat};} else {double dlat = transformLat(lng - 105.0, lat - 35.0);double dlng = transformLng(lng - 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) / ((AA * (1 - EE)) / (magic * sqrtMagic) * PI);dlng = (dlng * 180.0) / (AA / sqrtMagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;return new double[]{mglng, mglat};}}

2.2 GCJ-02 转 WGS-84

    /*** GCJ-02转WGS-84** @param lng* @param lat* @return*/public static double[] gcj02ToWgs84(double lng, double lat) {if (outOfChina(lng, lat)) {return new double[]{lng, lat};} else {double dlat = transformLat(lng - 105.0, lat - 35.0);double dlng = transformLng(lng - 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) / ((AA * (1 - EE)) / (magic * sqrtMagic) * PI);dlng = (dlng * 180.0) / (AA / sqrtMagic * Math.cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;return new double[]{lng * 2 - mglng, lat * 2 - mglat};}}

3. GCJ-02 和 BD-09 的相互转换

3.1 GCJ-02 转 BD-09

    /*** GCJ-02转BD-09** @param lng* @param lat* @return*/public static double[] gcj02ToBd09(double lng, double lat) {double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * X_PI);double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * X_PI);double bdLng = z * Math.cos(theta) + 0.0065;double bdLat = z * Math.sin(theta) + 0.006;return new double[]{bdLng, bdLat};}

3.2 BD-09 转 GCJ-02

    /*** BD-09转GCJ-02** @param lng* @param lat* @return*/public static double[] bd09ToGcj02(double lng, double lat) {double x = lng - 0.0065;double 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 gcjLng = z * Math.cos(theta);double gcjLat = z * Math.sin(theta);return new double[]{gcjLng, gcjLat};}

4. WGS-84 和 BD-09 的相互转换

4.1 WGS-84 转 BD-09

    /*** WGS-84转BD-09** @param lng* @param lat* @return*/public static double[] wgs84ToBd09(double lng, double lat) {double[] gcjPoint = wgs84ToGcj02(lng, lat);return gcj02ToBd09(gcjPoint[0], gcjPoint[1]);}

4.2 BD-09 转 WGS-84

    /*** BD-09转WGS-84** @param lng* @param lat* @return*/public static double[] bd09ToWgs84(double lng, double lat) {double[] gcjPoint = bd09ToGcj02(lng, lat);return gcj02ToWgs84(gcjPoint[0], gcjPoint[1]);}

三、坐标数据转换方法-Python 版

1. 准备工作

1.1 依赖的一些常量和转换方法

import math# 常量定义
PI = math.pi
x_PI = float(PI * float(3000.0) / float(180.0))
aa = float(6378245.0)
ee = 0.00669342162296594323# 经纬度偏移转换
def transform_lat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0return retdef transform_lng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * PI) + 40.0 * math.sin(lng / 3.0 * PI)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * math.sin(lng / 30.0 * PI)) * 2.0 / 3.0return ret# 判断坐标是否超出境内
def out_of_china(lng, lat):# 纬度3.86~53.55,经度73.66~135.05;非精确判断,可能误判if 73.66 < lng < 135.05 and 3.86 < lat < 53.55:return False

2. WGS-84 和 GCJ-02 的相互转换

2.1 WGS-84 转 GCJ-02

# WGS-84转GCJ-02
def wgs84_to_gcj02(lng, lat):if out_of_china(lng, lat):return [lng, lat]else:dlat = transform_lat(lng - 105.0, lat - 35.0)dlng = transform_lng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * PImagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((aa * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (aa / sqrtmagic * math.cos(radlat) * PI)mglat = lat + dlatmglng = lng + dlngreturn [mglng, mglat]

2.2 GCJ-02 转 WGS-84

# GCJ-02转WGS-84
def gcj02_to_wgs84(lng, lat):if out_of_china(lng, lat):return [lng, lat]else:dlat = transform_lat(lng - 105.0, lat - 35.0)dlng = transform_lng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * PImagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((aa * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (aa / sqrtmagic * math.cos(radlat) * PI)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]

3. GCJ-02 和 BD-09 的相互转换

3.1 GCJ-02 转 BD-09

# GCJ-02转BD-09
def gcj02_to_bd09(lng, lat):z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_PI)theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_PI)bd_lng = z * math.cos(theta) + 0.0065bd_lat = z * math.sin(theta) + 0.006return [bd_lng, bd_lat]

3.2 BD-09 转 GCJ-02

# BD-09转GCJ-02
def bd09_to_gcj02(bd_lon, bd_lat):x = bd_lon - 0.0065y = bd_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_PI)theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_PI)gg_lng = z * math.cos(theta)gg_lat = z * math.sin(theta)return [gg_lng, gg_lat]

4. WGS-84 和 BD-09 的相互转换

4.1 WGS-84 转 BD-09

# WGS-84转BD-09
def wgs84_to_bd09(lng, lat):gcj_point = wgs84_to_gcj02(lng, lat)bd_point = gcj02_to_bd09(gcj_point[0], gcj_point[1])return [bd_point[0], bd_point[1]]

4.2 BD-09 转 WGS-84

# BD-09转WGS-84
def bd09_to_wgs84(lng, lat):gcj_point = bd09_to_gcj02(lng, lat)wgs_point = gcj02_to_wgs84(gcj_point[0], gcj_point[1])return [wgs_point[0], wgs_point[1]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 监听音频焦点变化

在 Android 中&#xff0c;监听音频焦点变化意味着您可以获得关于音频焦点状态的通知&#xff0c;并针对焦点变化执行相应的操作。音频焦点是指哪个应用程序或组件有权播放音频的能力。 通过监听音频焦点变化&#xff0c;您可以根据不同的焦点状态进行适当的音频处理&#xff…

苹果一次性开源了8个大模型! 包含模型权重、训练日志和设置,OpenELM全面开源

不以开放性著称的苹果居然同时开源了大模型的权重、训练和评估框架&#xff0c;涵盖训练日志、多个保存点和预训练设置。同时升级计算机视觉工具包 CVNets 为 CoreNet&#xff01;支持 OpenELM&#xff01; ▲图1.由Stable Diffusion3生成。 OpenELM是Apple苹果公司最新推出的…

律师口才训练技巧课程介绍?

律师口才训练技巧课程介绍 一、课程背景与目标 律师口才作为法律职业的核心能力之一&#xff0c;对于律师在**辩论、法律咨询、谈判协商等场合的表现具有至关重要的作用。然而&#xff0c;许多律师在口才方面存在不足&#xff0c;难以充分发挥自己的专业能力。因此&#xff0c;…

底层逻辑(1) 是非对错

底层逻辑(1) 是非对错 关于本书 这本书的副标题叫做&#xff1a;看清这个世界的底牌。让我想起电影《教父》中的一句名言&#xff1a;花半秒钟就看透事物本质的人&#xff0c;和花一辈子都看不清事物本质的人&#xff0c;注定是截然不同的命运。 如果你看过梅多丝的《系统之美…

从ElasticSearch7开始一个索引里面只允许有一个映射

从ElasticSearch7开始一个索引里面只允许有一个映射 在ElasticSearch7版本之前&#xff0c;ES的一个索引里面可以有多个映射关系。为什么呢&#xff1f;因为ES最初设计的时候是类比于像mysql这样的关系型数据库&#xff0c;比如说ES的索引就相当于是关系型数据库中的数据库&am…

桶排序(Bucket Sort)

. - 力扣&#xff08;LeetCode&#xff09; 这道题可以使用桶排序来做 桶排序&#xff08;Bucket Sort&#xff09;是一种排序算法&#xff0c;其工作原理是将数组分到有限数量的桶子里。每个桶子再个别排序&#xff08;有可能再使用别的排序算法或是以递归方式继续使用桶排序…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏&#xff1a;《体验AI》 期待您的点赞&#x1f44d;收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

Flutter Get国际化和实现原理简析

Flutter Get国际化入门和实现原理简析 前言使用方法1、配置依赖包2、配置国际化相关参数3、配置en_US和zh_CN4、配置Translations5、 构建的页面:原理分析1、tr原理分析2、 updateLocale原理分析参考资料:前言 Flutter的Get插件提供了国际化功能,使用起来很方便,下面就其简…

设计模式:里氏代换原则(Liskov Substitution Principle,LSP)介绍

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是面向对象设计原则的一部分&#xff0c;它强调子类对象应该能够替换其父类对象而不影响程序的正确性。换句话说&#xff0c;子类对象应该可以在不改变程序正确性的前提下替换掉父类对象。 …

为什么单片机控制电机需要加电机驱动

通常很多地方只是单纯的单片机MCU没有对电机的驱动能力&#xff0c;或者是介绍关于电机驱动的作用&#xff0c;如&#xff1a; 提高电机的效率和精度。驱动器采用先进的电子技术和控制算法&#xff0c;能够精准控制电机的参数和运行状态&#xff0c;提高了电机的效率和精度。拓…

Git命令汇总(持续更新)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Flutter 面试题】 setState 在哪种场景下可能会失效?

【Flutter 面试题】 setState 在哪种场景下可能会失效? 文章目录 写在前面口述回答补充说明示例1:`setState` 在已销毁的Widget中使用示例2:在构建过程中调用`setState`写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家…

【Hello算法】 > 第 3 关 >栈与队列

数据结构 之 数组与链表 1 栈 / 栈的常见操作、实现、应用2 队列 /队列的常见操作、实现、应用3 双向队列4 Tips ———————————————————————————————————————————————————————————- ————————————————…

Hybrid Homomorphic Encryption:SE + HE

参考文献&#xff1a; [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[MJS16] Maux P, Journault A, Standaert F X, et al. To…

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标&#xff1a;1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议&#xff08;UART、I2C、SPI等&#xff09;之一&#xff0c;全称叫做通用异步收发传输器&#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

Android isNetworkConnected如何判断APP连接到了无网络热点

在开发移动应用时&#xff0c;处理网络状态是一项基础且关键的任务。尤其是辨别出设备是否连接到了一个实际上没有互联网接入的WiFi热点&#xff08;比如需要登录或者付费才能上网的公共Wi-Fi&#xff09;&#xff0c;对于保持良好用户体验非常重要。 第一步&#xff1a;基本网…

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1&#xff09;为了避免区域间的环路&#xff0c;OSPF规定不同区域间的路由交互只能通过ABR实现。 2&#xff09;ABR是连接到骨干区域的&#xff0c;所以在区域设计上规定&#xff0c;所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…

Spring Gateway 网关常见配置说明

前言 Spring Gateway 是基于 Spring Framework 的 API 网关&#xff0c;它为微服务架构提供了路由、监控、弹性以及安全性等功能。Spring Gateway 使用非阻塞 API 和高性能的反应式编程模型来提供服务。 版本说明 本文的选项在多个最近的 Spring Cloud Gateway 版本中都是有…