主流被使用的地理坐标系并不统一,常用的有WGS84、GCJ02(火星坐标系)、BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用C++实现几种坐标系统之间的互相转换。

一、GCJ-02和BD-09互转

1. 通用

struct Point {double lon;double lat;
};double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
double PI = 3.1415926535897932384626;
double a = 6378245.0;
double ee = 0.00669342162296594323;//判断是否在国内,不在国内不做偏移
bool isOutOfChina(double lng, double lat)
{/*if (lng < 72.004 || lng > 137.8347){return true;//国外}if (lat < 0.8293 || lat > 55.8271){return true;//国外}    return false;//国内*/if ((lng >= 72.004 || lng <= 137.8347) && (lat >= 0.8293 || lat <= 55.8271)){return false;//国内}else {return true;//国外}
}//转纬度
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 * sqrt(abs(lng));ret += (20.0 * sin(6.0 * lng * PI) + 20.0 * sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * sin(lat * PI) + 40.0 * sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * sin(lat / 12.0 * PI) + 320 * sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;
}//转经度
double transformlng(double lng, double lat){double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * sqrt(abs(lng));ret += (20.0 * sin(6.0 * lng * PI) + 20.0 * sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * sin(lng * PI) + 40.0 * sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * sin(lng / 12.0 * PI) + 300.0 * sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;
}

2. GCJ-02转WGS-84

//gcj-02转wgs-84
Point gcj02towgs84(double lng, double lat)
{if(isOutOfChina(lng, lat)){Point point;point.lon = lng;point.lat = lat;return point;}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 = sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = sqrt(magic);dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;Point point;point.lon = lng * 2.0 - mglng;point.lat = lat * 2.0 - mglat;return point;
}

3. WGS-84转GCJ-02

//wgs-84转gcj-02
Point wgs84togcj02(double lng, double lat)
{if (isOutOfChina(lng, lat)){Point point;point.lon = lng;point.lat = lat;return point;}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 = sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = sqrt(magic);dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;Point point;point.lon = mglng;point.lat = mglat;return point;}
}

二、GCJ-02和BD-09互转

1. GCJ-02转BD-09

Point gcj02tobd09(double lng,double lat)
{double z = sqrt(lng * lng + lat * lat) + 0.00002 * sin(lat * x_PI);double theta = atan2(lat, lng) + 0.000003 * cos(lng * x_PI);double bd_lng = z * cos(theta) + 0.0065;double bd_lat = z * sin(theta) + 0.006;Point point;point.lon = bd_lng;point.lat = bd_lat;return point;
}

2. BD-09转GCj-02

Point bd09togcj02(double bd_lon, double  bd_lat)
{double x_pi = 3.14159265358979324 * 3000.0 / 180.0;double x = bd_lon - 0.0065;double y = bd_lat - 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);double gg_lng = z * cos(theta);double gg_lat = z * sin(theta);Point point;point.lon = gg_lng;point.lat = gg_lat;return point;
}

GCJ-02和BD-09互转、GCJ-02和WGS-84互转相关推荐

  1. 地球坐标系(WGS - 84)转火星坐标系(GCJ)

    地球坐标系(WGS - 84)转火星坐标系(GCJ) package com.tdt.convert.utils;import java.math.BigDecimal;/*** @author Mr ...

  2. 网站互点工具_如何利用关键词互点互刷提升网站关键词排名?

    最近老是点击一个网站进去看,几天后发现关键词排名提高了,就在想是不是通过点击网站可以提高关键词排名了?网上不是有好多朋友都在寻求关键词互点,而且要求点击某篇文章,并且要在页面停留多少分钟,说这样才以提 ...

  3. 双机互备是什么意思?双机互备就是双机热备吗?

    看到不少小伙伴在问,双机互备是什么意思?双机互备就是双机热备吗?今天我们就来一起简单了解了解吧! 双机互备是什么意思?双机互备就是双机热备吗? 双机互备是指在双机热备的基础上,两个相对独立的应用在两台 ...

  4. oracle wgs gcj,坐标转换,百度、高德、GCJ、WGS84等转换

    坐标转换,网上的,百度.高德.GCJ.WGS84..转换,不啰嗦,直接上代码,这种转换网上很多!最近几年一直在用这个,很不错. class GPSTransformation{ constructor ...

  5. 如何判断LSTM模型中的过拟合和欠拟合 By 机器之心2017年10月02日 11:09 判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事。也许你会得到一个不错的模型技术得分,但了解

    判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事.也许你会得到一个不错的模型技术得分,但了解模型是较好的拟合,还是欠拟合/过拟合,以及模型在不同的配置条件下能否实现更好的性能是非常重要 ...

  6. java byte与char互转原理_java byte与char互转原理

    一.字节和unicode Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的.因此Java要对这些字节流经行转化. char是unicode的, ...

  7. 电脑手机wifi互传文件_手机之间怎么互传文件?几则小技巧了解下

    生活中或者工作中经常会涉及到传送文件,免不了需要通过手机来互传一些文件了,那么手机之间要怎么来实现互传文件呢?今天笔者就给大家分享四种实用却鲜为人知的文件互传小技巧,小本本记起来! 通过微信QQ互传 ...

  8. 电脑手机wifi互传文件_安卓手机文件互传

    怎么不借用第三方工具,安卓手机实现相互文件快传呢? 苹果: 首先不用多说,苹果可以使用Air Drop功能,苹果全家桶可以无障碍互传. 长期以来,除开微信和QQ,不同品牌安卓手机互传文件依靠的途径只有 ...

  9. 两个云服务器怎么互传文件,两个云服务器互传数据

    两个云服务器互传数据 内容精选 换一换 云上容灾有三种场景,如表1所示.跨AZ容灾的方案如图1所示.该架构适用云上同城容灾,要求RPO等于0的场景.该方案下,RPO等于0,RTO小于30分钟.在平时业 ...

  10. iphone和mac互传文件_mac和windows怎么互传文件_让mac和windows电脑互传文件的方法-系统城...

    由于工作需要要用到两台电脑,一台是安装windows电脑,一个则是使用macbook系统.偶尔会需要在两台电脑之间互传文件的需求,虽说QQ和微信可以实现传输,但是如果文件太大还得压缩,显得很麻烦.有什 ...

最新文章

  1. Github 年度最受欢迎的 TOP30 Python 项目,超值
  2. 字节 位 比特的关系
  3. HTML5响应式企业集团织梦模板,响应式HTML5信息产业企业集团网站织梦模板
  4. 用Mysql创建设备管理信息系统数据库(图解)
  5. web图片铺满网页_web单页面实现多个echarts图表铺满整个div(柱状图,折线图,饼形图……)...
  6. jar包 热加载/卸载 的初步实现
  7. python实验七答案_Python实验报告七
  8. 有了Unicode为啥还需要UTF-8
  9. JS的Date.setMonth()方法坑
  10. 收藏 | 计算机视觉中的自注意力
  11. vt linux tty中文,Linux输入子系统和tty关系影述
  12. python xmlrpc_Python xmlrpc用法
  13. python变量标识符_Python 1基础语法三(变量和标识符的区别)
  14. Contiki Etimer 模块
  15. 病毒及攻击防御手册之六
  16. windows 编译xvidcore-1.1.3.tar
  17. 2022.5.23-5.29 AI行业周刊(第99期):AI创业道路
  18. ubuntu16.04之间实现桌面共享
  19. octobercms mysql_OctoberCMS插件形成数据库关系(OctoberCMS plugin form database relationships)...
  20. Sh.k6p index.php,第二篇:shell基础命令(部分)

热门文章

  1. 掌握云服务器使用的基本方法
  2. oracle安装点下一步退出,学习笔记:oracle之win10安装卸载oracle 11gR2步骤及常见问题解决...
  3. C++作业5 求和 、数组选择
  4. Python软件编程等级考试四级——20211205
  5. PSPICE 仿真故障
  6. 我的世界java甘蔗机_我的世界全自动甘蔗机器制作教程
  7. linux中的setenv命令
  8. C#将数据导入固定word模板
  9. Openstack-nove
  10. Python 标准库之 shutil 高阶文件操作『详细』