java中wgs84转高德_2020-06-11关于WGS84 高德坐标 百度坐标的相互转换
在地图学中,一般将坐标分为投影坐标和地理坐标。地理坐标和投影坐标的联系和区别对于一般的地图使用者而言可能并不需要掌握的非常清楚。通俗一点来说,地理坐标是一个球体的坐标,而投影坐标是一个平面的坐标。常用的GPS、百度地图、高德地图等都是采用的地理坐标。
确定了地理坐标之后,常见的地图应用分别采用的都是什么坐标系呢?一般来说,国外的一些地图,都是采用WGS84坐标系,比如谷歌地图、OMS地图、Bing地图(非中国区域)等。而国内的地图,处于保密需求,大多采用火星坐标系,在WGS84的基础上作了一些偏移,如高德地图、腾讯地图等。而百度又在火星坐标系的基础上又作了一定偏移,生成了自己的百度坐标系。
WGS84:谷歌地图 OMS
火星坐标系:高德地图 腾讯地图
百度坐标系:百度地图
这些加密算法,一般是无法准确还原的,但是在小范围内的数据,可以通过一定的变换相互转化。具体的C#代码如下
public struct Cor
{
public double lng;
public double lat;
}
public class Transformer
{
const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
const double pi = 3.1415926535897932384626; // π
const double a = 6378245.0;// 长半轴
const double ee = 0.00669342162296594323; // 扁率
//火星转百度
public static Cor gcj02tobd09(Cor HxCor)
{
double z = Math.Sqrt(HxCor.lng * HxCor.lng + HxCor.lat * HxCor.lat) + 0.00002 * Math.Sin(HxCor.lat * x_pi);
double theta = Math.Atan2(HxCor.lat, HxCor.lng) + 0.000003 * Math.Cos(HxCor.lng * x_pi);
Cor BaiduCor;
BaiduCor.lng = z * Math.Cos(theta) + 0.0065;
BaiduCor.lat = z * Math.Sin(theta) + 0.006;
return BaiduCor;
}
//百度转火星
public static Cor bd09togcj02(Cor Bd)
{
double x = Bd.lng - 0.0065;
double y = Bd.lat - 0.006;
double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_pi);
double theta = Math.Atan2(y, x) - .000003 * Math.Cos(x * x_pi);
Cor hx;
hx.lng = z * Math.Cos(theta);
hx.lat = z * Math.Sin(theta);
return hx;
}
//WGS84转火星
public static Cor wgs84togcj02(Cor wgs84)
{
if (OutOfChina(wgs84))
{
return wgs84;
}
double dlat = transformlat(wgs84.lng - 105.0, wgs84.lat - 35.0);
double dlng = transformlng(wgs84.lng - 105.0, wgs84.lat - 35.0);
double radlat = wgs84.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);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * pi);
Cor hx;
hx.lat = wgs84.lat + dlat;
hx.lng = wgs84.lng + dlng;
return hx;
}
//火星转84
public static Cor gcj02towgs84(Cor hx)
{
if (OutOfChina(hx))
{
return hx;
}
double dlat = transformlat(hx.lng - 105.0, hx.lat - 35.0);
double dlng = transformlng(hx.lng - 105.0, hx.lat - 35.0);
double radlat = hx.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);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * pi);
Cor wgs84;
double mglat = hx.lat + dlat;
double mglng = hx.lng + dlng;
wgs84.lat = hx.lat * 2 -mglat;
wgs84.lng = hx.lng *2-mglng;
return wgs84;
}
//百度转84
public static Cor bd09towgs84(Cor bd)
{
Cor hx = bd09togcj02(bd);
Cor wgs84 = gcj02towgs84(hx);
return wgs84;
}
//84转百度
public static Cor wgs84tobd09(Cor wgs84)
{
Cor hx = wgs84togcj02(wgs84);
Cor bd = gcj02tobd09(hx);
return bd;
}
/*辅助函数*/
//判断是否在国内
private static Boolean OutOfChina(Cor wgs84)
{
if (wgs84.lng < 72.004 || wgs84.lng > 137.8347)
{
return true;
}
if (wgs84.lat < 0.8293 || wgs84.lat > 55.8271)
{
return true;
}
return false;
}
/*辅助函数*/
//转换lat
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;
}
/*辅助函数*/
//转换lng
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;
}
// 按类计算
public static Cor transform(Cor corOld,string transType)
{
switch (transType)
{
case "百度转火星":
return Transformer.bd09togcj02(corOld);
case "百度转84":
return Transformer.bd09towgs84(corOld);
case "火星转84":
return Transformer.gcj02towgs84(corOld);
case "84转火星":
return Transformer.wgs84togcj02(corOld);
case "火星转百度":
return Transformer.gcj02tobd09(corOld);
case "84转百度":
return Transformer.wgs84tobd09(corOld);
default:
return corOld;
}
}
}
单个转换
文件转换
CSV文件格式,一行一个坐标,半角逗号隔开经纬度
java中wgs84转高德_2020-06-11关于WGS84 高德坐标 百度坐标的相互转换相关推荐
- 地图--WGS84 高德坐标 百度坐标的相互转换(好用推荐)
在地图学中,一般将坐标分为投影坐标和地理坐标.地理坐标和投影坐标的联系和区别对于一般的地图使用者而言可能并不需要掌握的非常清楚.通俗一点来说,地理坐标是一个球体的坐标,而投影坐标是一个平面的坐标.常用 ...
- 火星坐标, WGS84坐标, 百度坐标
地图坐标系目前包括: 地球坐标 (WGS84) WGS84:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统. 国际标准,从 GPS 设备中取出的数据的 ...
- 24张图带你彻底理解Java中的21种锁
本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观 ...
- 多图带你彻底理解Java中的21种锁!
作者 | 悟空聊架构 来源 | 悟空聊架构(ID:PassJava666) 本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持 ...
- Java中的21种锁
本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号锁名称应用1乐观锁CAS2悲观锁synchr ...
- 百度坐标转WGS84(即GPS)坐标
此坐标转换用的是GPSspg的API,如果您需要转几个的话还是在线转效率比较高:如果量比较大的话,转换不超过2000次/天,可以用此方法(免费):如果量很大的话,推荐订阅较高级的套餐. 单个在线转换: ...
- 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版...
转自:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标.百度坐标.WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版 火星坐标 ...
- 【转】火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版...
原文地址:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地 ...
- 06.ElasticSearch在Java中的使用
ElasticSearch在Java中的使用 引入依赖 索引.类型和映射的操作 1.创建客户端操作对象 2.创建索引 3.删除索引 4.创建索引.类型和映射 文档的操作 1.准备工作 1. 引入依赖 ...
- java中do loop的使用_Java中do-while循环——通过示例学编程(11)
作者:CHAITANYA SINGH 在上一篇教程中,我们讨论了while循环.在本教程中,我们将讨论java中的do-while循环.do-while循环类似于while循环,但是它们之间有一个区别 ...
最新文章
- 美国五大科技巨头的人工智能竞赛
- python 培训-Python培训周末班|python是什么?能干什么?
- 理解ASP.NET MVC Framework Action Filters(翻的)
- 不使用Ajax,如何实现表单提交不刷新页面
- 写一些脚本的心得总结系列第3篇------同步数据到其他表
- php搜索图片不显示不出来了,PHP CURL采集百度搜寻结果图片不显示问题的解决方法【第1/4页】...
- MATLAB——PLOT绘图
- python字符串说法错误的是_【单选题】关于Python字符串的表示方法,下列说法错误的是:
A. 字符串是字符的序列表示,只能由...
- java怎么拦截数据库查询结果_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
- FT1248开发笔记
- python某公司为员工发放奖品_python实现年会抽奖程序
- 三星手机怎么把html,三星手机怎么连接电脑 只要四步轻松搞定【图文】
- A[1062]德才论 好题
- mysql 数据恢复 (.ibdata1, bin log)
- android电容触摸屏的驱动及其上层工作原理,电容触摸屏驱动原理
- OSChina 周五乱弹 ——我们测算过无数代码却依旧算不准没钱的这一生
- 计算机老掉线 路由器网络,路由器无线掉线怎么办?
- # 3 网页实现吃豆子动画
- css3 实现星空动画 -- 星星闪烁 - 流星划过 - 月亮上升
- openwrt系统理解