坐标系的转换 - 地图纠偏

了解下各个厂家使用的坐标系:

国家测绘局规定国内的地理位置信息至少进过一次加密,发布GCJ-02加密算法,对真实坐标进行加密处理,称为火星坐标系/国测局坐标。

高德地图使用的就火星坐标系(GCJ-02)

百度地图在此基础上又进行了一次加密处理,称为百度坐标系(BD-09)

世界标准地理坐标(WGS-84),又称原始坐标,一般国际的GPS使用的就是这种坐标系

坐标转换的话,各个厂家都有提供,但是是不公开,得调用接口。

下面用eviltransform来进行坐标转换,提供坐标系之间的转换,还提供了各种语言的版本

接下来的转换我们用的javascript版本的

1. 标准坐标转换成火星坐标/国测局坐标    WGS-84 >> GCJ-02

eviltransform.wgs2gcj(wgsLat,wgsLng)

2.火星坐标系/国测局坐标转换成标准坐标    GCJ-02 >> WGS-84

eviltransform.gcj2wgs(gcjLat,gcjLng)

3.百度坐标转换成标准坐标  BD-09 >> WGS-84

eviltransform.bd2wgs(bdLat,bdLng)

4.标准坐标转换成百度坐标   WGS-84 >> BD-09

eviltransform.wgs2bd(wgsLat,wgsLng)

5.百度坐标转换成火星坐标  BD-09 >> GCJ-02

eviltransform.bd2gcj(bdLat,bdLng)

6.火星坐标转换成百度坐标   GCJ-02 >> BD-09

eviltransform.gcj2bd(gcjLat,gcjLng)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
≡≡≡≡≡≡≡≡≡≡≡≡≡『软件介绍』≡≡≡≡≡≡≡≡≡≡≡≡≡ 邮箱:[email protected] 『太乐地图下载器』支持谷歌、天地图、百度、诺基亚、搜搜、ArcGIS Online、高德、超图云服务、必应、雅虎的街道地图、卫星地图(卫片)、标签/卫星混合地图、地表地形图的高速下载、无缝拼接、无损压缩、地图纠偏坐标系转换、离线浏览和地图服务发布(WMTS\WMS)。 【支持无偏移的谷歌国外服务器卫星地图的下载,避免纠偏带来的二次花费】 【支持地图纠偏,独家纠偏算法,纠偏后可与矢量数据完美叠加】 主要功能: 01.支持10个主流地图厂商的40多款在线地图的浏览、下载 02.支持按行政区划下载、画框下载、多边形下载、导入KML下载 (下载方式灵活) 03.Web地图服务发布 -- 灵活搭建自己的局域网地图服务器 (将下载地图发布为Web服务(WMTS/WMS),供ArcGIS、SuperMap、Openlayers等客户端直接远程访问,支持Openlayers的离线浏览) 04.支持无缝拼接成单张大图 (支持无损压缩、分块拼接,可在ArcMap、Erdas Imagine中直接打开,包含坐标范围\投影信息等) 05.支持导出成ArcGIS切片缓存格式 (可在ArcMap中直接打开,也可用于ArcGIS Server发布为底图服务) 06.支持导出成Google格式切片 (导出后可直接在浏览器中调用Google API离线浏览) 07.支持导出成TMS标准切片 08.支持导出SQLite格式切片 09.支持影像投影转换 (支持任意投影之间的影像投影转换,如将具备谷歌投影的地图转为WGS84等) 10.支持影像金字塔构建 (更快速的在第三方软件中浏览大图) 11.支持多任务、多线程的高速下载,支持任务的断点续传 12.支持地理标注,支持读取GPX路线、轨迹信息 13.更为简洁的Win8操作界面,更为简便的地图下载流程
以下是ENU坐标系到ECEF坐标系转换代码: ```c #include <math.h> // WGS84椭球体参数 const double a = 6378137.0; // 地球长半轴 const double b = 6356752.314245; // 地球短半轴 const double f = 1 / 298.257223563; // 地球扁率 const double e = sqrt(2 * f - f * f); // 地球第一偏心率 const double e2 = e * e; // 地球第二偏心率 // ENU坐标系到ECEF坐标系转换函数 void enu2ecef(double enu[3], double lat, double lon, double alt, double ecef[3]) { // 计算ENU坐标系到NED坐标系转换矩阵 double cosLat = cos(lat); double sinLat = sin(lat); double cosLon = cos(lon); double sinLon = sin(lon); double R_ENU2NED[3][3] = { {-sinLon, cosLon, 0}, {-sinLat * cosLon, -sinLat * sinLon, cosLat}, {cosLat * cosLon, cosLat * sinLon, sinLat} }; // 计算ENU坐标系到ECEF坐标系转换矩阵 double R_NED2ECEF[3][3] = { {-sinLon, -sinLat * cosLon, cosLat * cosLon}, {cosLon, -sinLat * sinLon, cosLat * sinLon}, {0, cosLat, sinLat} }; // 计算ENU坐标系到ECEF坐标系转换矩阵 double R_ENU2ECEF[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { R_ENU2ECEF[i][j] = 0; for (int k = 0; k < 3; k++) { R_ENU2ECEF[i][j] += R_NED2ECEF[i][k] * R_ENU2NED[k][j]; } } } // 计算ENU坐标系到ECEF坐标系转换向量 double ECEF_Origin[3], NED_Origin[3]; llh2ecef(lat, lon, alt, ECEF_Origin); llh2ned(lat, lon, alt, enu[0], enu[1], enu[2], NED_Origin); double ENU_Origin[3] = {NED_Origin[1], NED_Origin[0], -NED_Origin[2]}; double ECEF_enu[3]; for (int i = 0; i < 3; i++) { ECEF_enu[i] = 0; for (int j = 0; j < 3; j++) { ECEF_enu[i] += R_ENU2ECEF[i][j] * ENU_Origin[j]; } } // 计算ENU坐标点在ECEF坐标系中的位置 for (int i = 0; i < 3; i++) { ecef[i] = ECEF_Origin[i] + ECEF_enu[i]; } } // 经纬高坐标系到ECEF坐标系转换函数 void llh2ecef(double lat, double lon, double alt, double ecef[3]) { double N = a / sqrt(1 - e2 * sin(lat) * sin(lat)); ecef[0] = (N + alt) * cos(lat) * cos(lon); ecef[1] = (N + alt) * cos(lat) * sin(lon); ecef[2] = (N * (1 - e2) + alt) * sin(lat); } // 经纬高坐标系到NED坐标系转换函数 void llh2ned(double lat, double lon, double alt, double lat0, double lon0, double alt0, double ned[3]) { double cosLat = cos(lat); double sinLat = sin(lat); double cosLon = cos(lon); double sinLon = sin(lon); double cosLat0 = cos(lat0); double sinLat0 = sin(lat0); double cosLon0 = cos(lon0); double sinLon0 = sin(lon0); double R_ENU2NED[3][3] = { {-sinLon0 * cosLat0, -sinLat0 * cosLon0, cosLat0}, {-sinLon0 * sinLat0, cosLat0 * cosLon0, sinLat0}, {cosLon0, sinLon0, 0} }; double ecef[3], ecef0[3]; llh2ecef(lat, lon, alt, ecef); llh2ecef(lat0, lon0, alt0, ecef0); for (int i = 0; i < 3; i++) { ned[i] = 0; for (int j = 0; j < 3; j++) { ned[i] += R_ENU2NED[i][j] * (ecef[i] - ecef0[j]); } } } ``` 以上是ENU坐标系到ECEF坐标系转换代码,其中 `enu` 表示ENU坐标系下的坐标,`lat`、`lon`、`alt` 分别表示参考点的纬度、经度和高度,`ecef` 表示转换后的ECEF坐标系下的坐标。 如果需要进行其他坐标系之间的转换,可以根据上面的代码进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值