开发地图的时最烦的就是不同的地图工具以及数据来源坐标系不同造成偏移甚至报错。以下整理了部分的地图坐标转换,一个文件直接搞定所有情况。

一.地图坐标系分类

常见的地图技术:openlayers、cesium、高德、百度等。不同的地图框架地图地图的坐标系缺也略有不同。

  • WGS84(GPS) :一般从国际标准的GPS设备获取的坐标都是WGS84,以及国际地图提供商使用的坐标系,如ArcGIS、必应的底图是WGS84坐标系。

  • GCJ02:国测局02年发布的坐标系,又称“火星坐标”。在中国,WGS84不能直接使用,需要国家测绘局的加密。比如谷歌中国、高德、腾讯都在用这个坐标系。

  • BD09 百度标准,加密算法不同。

下面是针对高德地图坐标转换的方法封装

export default class CoorsOffset {constructor () {this.x_pi = (3.14159265358979324 * 3000.0) / 180.0;this.pi = 3.14159265358979324;this.a = 6378245.0;this.ee = 0.00669342162296594323;}/*** 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换* 即 百度 转 谷歌、高德* @param {*} DBLon* @param {*} DBLat* @returns {*[longitude, latitude]}*/bd09togcj02 = (DBLon, DBLat) => {const x = DBLon - 0.0065;const y = DBLat - 0.006;const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi);const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi);const lon = z * Math.cos(theta);const lat = z * Math.sin(theta);return [lon, lat];}/*** 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换* 即谷歌、高德 转 百度* @param lng* @param lat* @returns {*[longitude, latitude]}*/gcj02tobd09 = (lng, lat) => {const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * this.x_pi);const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * this.x_pi);const BDLng = z * Math.cos(theta) + 0.0065;const DBLat = z * Math.sin(theta) + 0.006;return [BDLng, DBLat];}/*** WGS84转GCj02* @param lng* @param lat* @returns {*[longitude, latitude]}*/wgs84togcj02 = (lng, lat) => {const radlat = (lat / 180.0) * this.pi;const magic = 1 - this.ee * Math.sin(radlat) * Math.sin(radlat);const sqrtmagic = Math.sqrt(magic);let dlat = this.transformlat(lng - 105.0, lat - 35.0);let dlng = this.transformlng(lng - 105.0, lat - 35.0);dlat = (dlat * 180.0) / (((this.a * (1 - this.ee)) / (magic * sqrtmagic)) * this.pi);dlng = (dlng * 180.0) / ((this.a / sqrtmagic) * Math.cos(radlat) * this.pi);let mglat = lat + dlat;let mglng = lng + dlng;return [mglng, mglat];}/*** GCJ02 转换为 WGS84* @param lng* @param lat* @returns {*[longitude, latitude]}*/gcj02towgs84 = (lng, lat) => {var dlat = this.transformlat(lng - 105.0, lat - 35.0);var dlng = this.transformlng(lng - 105.0, lat - 35.0);const radlat = (lat / 180.0) * this.pi;const magic = 1 - this.ee * Math.sin(radlat) * Math.sin(radlat);const sqrtmagic = Math.sqrt(magic);dlat = (dlat * 180.0) / (((this.a * (1 - this.ee)) / (magic * sqrtmagic)) * this.pi);dlng = (dlng * 180.0) / ((this.a / sqrtmagic) * Math.cos(radlat) * this.pi);const mglat = lat + dlat;const mglng = lng + dlng;return [lng * 2 - mglng, lat * 2 - mglat];}transformlat = (lng, lat) => {let 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 * this.pi) + 20.0 *Math.sin(2.0 * lng * this.pi)) * (2.0 / 3.0);ret += (20.0 * Math.sin(lat * this.pi) + 40.0 * Math.sin((lat / 3.0) * this.pi)) * (2.0 / 3.0);ret += (160.0 * Math.sin((lat / 12.0) * this.pi) + 320 * Math.sin((lat * this.pi) / 30.0)) * (2.0 / 3.0);return ret;}transformlng = (lng, lat) => {let 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 * this.pi) + 20.0 * Math.sin(2.0 * lng * this.pi)) * (2.0 / 3.0);ret += (20.0 * Math.sin(lng * this.pi) + 40.0 * Math.sin((lng / 3.0) * this.pi)) * (2.0 / 3.0);ret += (150.0 * Math.sin((lng / 12.0) * this.pi) + 300.0 * Math.sin((lng / 30.0) * this.pi)) * (2.0 / 3.0);return ret;}
}

二.cesium三维地图中常用的坐标分类

  • WGS84坐标:经纬度坐标,坐标原点为,经度范围[-180,180],纬度范围[-90,90]。
  • WGS84弧度坐标(Cartographic):Cesium中的地理坐标单位默认是弧度制
  • 笛卡尔空间直角坐标(Cartesian3):世界坐标,原点就是椭球的中心,坐标(x,y,z)
  • -屏幕坐标(Cartesian2):平面直角坐标系,是一个二维笛卡尔坐标系,坐标为(x,y)

下面是针对cesium地图坐标转换的方法封装

 /*** 坐标转换 84转笛卡尔* @param {Position} position 位置* @param {number} alt 高度* @returns {any} 笛卡尔坐标*/transformWGS84ToCartesian = (position, alt = 0) => (position ?Cesium.Cartesian3.fromDegrees(position.lon,position.lat,alt || position.alt,Cesium.Ellipsoid.WGS84) :Cesium.Cartesian3.ZERO)/*** 坐标转换 笛卡尔转84* @param {Object} cartesian 三维位置坐标* @return {Object} {lon,lat,alt} 地理坐标*/transformCartesianToWGS84 = (cartesian) => {const ellipsoid = Cesium.Ellipsoid.WGS84;const cartographic = ellipsoid.cartesianToCartographic(cartesian);return {lon: Cesium.Math.toDegrees(cartographic.longitude),lat: Cesium.Math.toDegrees(cartographic.latitude),alt: cartographic.height,};}/*** 84坐标转弧度坐标* @param {Object} position wgs84* @return {Object} Cartographic 弧度坐标*/transformWGS84ToCartographic = (position) => (position ?Cesium.Cartographic.fromDegrees(position.lon || position.lon,position.lat,position.alt) :Cesium.Cartographic.ZERO)/*** 经纬度转Cartesian2。* 注意这里的 Cartesian2 是屏幕坐标,不能直接使用 Cartesian2.fromCartesian3* @param {number} lon 经度* @param {number} lat 纬度* @returns {void}*/lonLatToCartesian2 = (lon: number, lat: number): any => {const Cartesian3Result = Cesium.Cartesian3.fromDegrees(lon, lat);const Cartesian2Result = Cesium.SceneTransforms.wgs84ToWindowCoordinates(this.scene, Cartesian3Result);return Cartesian2Result;}

GIS地图坐标系转换方法,快快收藏相关推荐

  1. 地图坐标系大全:常用地图坐标系详解与转换指南

    介绍地图坐标系的基本概念和原理 地图坐标系是用于描述地图上位置的数学模型.它可以用来表示地球表面上的任意一个点,使得这个点的位置可以在地图上精确定位.不同的地图坐标系采用不同的基准面和投影方式,因此会 ...

  2. 转载 GIS地图知识

    GIS地图知识 转载自:http://blog.csdn.net/sx811125/article/details/4361203   1. 地图.地图制图学 .  2. 地图基本概念-特性.分类.用 ...

  3. GIS地图基础知识--入门教程

    wenzhanhttp://www.gisbbs.net/viewthread.php?tid=106&extra=page%3D1 GIS地图基础知识--入门教程 GIS 地 图 知 识 1 ...

  4. GIS地图学习笔记一之基础概念

    要做GIS地图的开发,我们需要先了解GIS地图相关的概念. 相关概念可以在这里了解-->ArcGIS 帮助库 本文是从上述网站中学习,摘抄的. 基础概念 地理信息系统 (GIS) 是以可视化和分 ...

  5. 构建GIS地图常用知识

    构建GIS地图常用知识 坐标系 地球是一个不规则的球体,为方便用平面的地图表示地球表面的现实世界,需采用椭球参数.投影方法等 把空间的球体 映射到平面图上,而平面图 对应的就是 二维的坐标系统. 坐标 ...

  6. Visum中导入GIS地图

    翻译了一天,感觉人都快变成翻译机器了.终于可以看些其他的了. 在刚用visum的时候就觉得虽然它network的编辑挺方便的,但是偷懒的我还是不希望一条link一条link的往上加.况且现在地图文件那 ...

  7. (Inside Out) Web地图坐标系——TDT的神奇

    一个GIS科班出生的研究生,把已还到课本的基础GIS知识,准备重新学习,并结合这几年下来自身在行业中GIS的应用,总结一些实用的GIS知识点.一备不时之需,二为积累沉淀,三则是年龄越大,记性越差,加上 ...

  8. python地图坐标系转换(bd09,gcj02,wgs84三种投影坐标系相互转化)

    1.介绍 1.1 GIS之坐标系 坐标系是GIS的重中之重,一般来说,工作底图平面坐标系应采用国家大地坐标系CGCS2000(或相当于精度WGS84坐标系),投影方式采用高斯-克吕格投影,高程基准采用 ...

  9. 如何批量轻松实现地图坐标系转换

    很多小伙伴在开发GIS平台的过程中,需要用到地图坐标系转换,比如说地心坐标系.BD09坐标系,需要在统一转换成WGS84坐标系在地图上标出来,做导航用. 但是地图坐标系批量转换的代码学习起来需要一定的 ...

最新文章

  1. centOS 7 安装man中文版手册
  2. oracle管道化表函数
  3. 一文带你搞懂 MySQL 中的分区!
  4. 线索二叉树怎么画_固原超级记忆技巧课程怎么学_蒙正智升教育
  5. “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
  6. POJ 2096 Collecting Bugs:期望dp
  7. VC多线程编程(转)
  8. 网络不通时自动重启网卡的脚本
  9. Hive TopN+分组TopN
  10. Redis 菜鸟教程学习笔记- Redis 数据结构
  11. 符号_特殊符号大全狐狸符号加字和复制
  12. 54、消防控制室的设置要求
  13. Codeforces Round #521 (Div. 3) B. Disturbed People
  14. 修改多台远程服务器,电脑默认用户名Administrator
  15. 从零开始搭建仿抖音短视频APP-开发用户业务模块(3)
  16. 爪哇国新游记之七----使用ArrayList统计水果出现次数
  17. CSP 2022 游寄
  18. linux 街机列表,linux下街机模拟器联机
  19. H指数问题(USACO)
  20. 关于小程序订单中心页设置的公告

热门文章

  1. 1833 雪糕的最大数量(排序)
  2. 数据结构课程主页-2016级
  3. 包装类中Integer类最全详解
  4. Oracle数据库建立表空间数据库表
  5. java的web项目分工_JavaWeb中Servlet和JSP的分工案例
  6. KITTI结果评测流程
  7. 病毒、木马、蠕虫与恶意代码关键点
  8. 我的java学习之路之Spring
  9. 网关短信php,通过ICQ网关发送手机短信的PHP源程序-PHP教程,PHP应用
  10. 能否在虚拟平台里构建真实的生活体验?