转自群友的博客:https://www.xiaofengyu.com/?p=108

群友的github地址:https://github.com/jfwangncs/GPSConvert

 各种坐标系的各种转换

 public class TempGps
{ public double Tlng;
public double Tlat;
} public class GPS
{
public string oLng;//经度 度分秒坐标
public string oLat;//纬度 度分秒坐标 public double lng;//经度 WGS-84
public double lat;//纬度 WGS-84 public double gLng;//经度 GCJ-02 中国坐标偏移标准 Google Map、高德、腾讯使用
public double gLat;//纬度 GCJ-02 中国坐标偏移标准 Google Map、高德、腾讯使用 public double bLng;//经度 BD-09 百度坐标偏移标准,Baidu Map使用
public double bLat;//纬度 BD-09 百度坐标偏移标准,Baidu Map使用 public double PI = Math.PI;
double xPI = Math.PI * 3000.0 / 180.0; public TempGps delta(TempGps t)
{
var a = 6378245.0; // a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
var ee = 0.00669342162296594323; // ee: 椭球的偏心率。
var dLat = this.transformLat(t.Tlng - 105.0, t.Tlat - 35.0);
var dLng = this.transformLng(t.Tlng - 105.0, t.Tlat - 35.0);
var radLat = t.Tlat / 180.0 * PI;
var magic = Math.Sin(radLat);
magic = 1 - ee * magic * magic;
var sqrtMagic = Math.Sqrt(magic);
return new TempGps() { Tlat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI), Tlng= (dLng * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * PI) };
}
//WGS-84 to GCJ-02
public void gcj_encrypt()
{
if (this.outOfChina(lng, lat))
{
gLng = lng;
gLat = lat;
}
var t = this.delta(new TempGps() { Tlng = lng, Tlat = lat });
gLng = t.Tlng+lng;
gLat = t.Tlat+lat;
} //GCJ-02 to WGS-84
public void gcj_decrypt()
{ if (this.outOfChina(gLng, gLat))
{
lng = gLng;
lat = gLat; }
var t = this.delta(new TempGps() { Tlng = gLng, Tlat = gLat });
lng = gLng-t.Tlng;
lat = gLat-t.Tlat;
} //GCJ-02 to BD-09
public void bd_encrypt()
{
double x = gLng;
double y = gLat;
double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * xPI);
double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * xPI);
bLng = z * Math.Cos(theta) + 0.0065;
bLat = z * Math.Sin(theta) + 0.006;
}
//BD-09 to GCJ-02
public void bd_decrypt()
{
double x = bLng - 0.0065;
double y = bLat - 0.006;
double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * xPI);
double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * xPI);
gLng = z * Math.Cos(theta);
gLat = z * Math.Sin(theta);
} //WGS-84 to 度分秒坐标
public void wgs_decrypt()
{
oLng = TranDegreeToDMs(lng);
oLat = TranDegreeToDMs(lat);
} //度分秒坐标 to WGS-84
public void wgs_encrypt()
{
lng = TranDMsToDegree(oLng);
lat = TranDMsToDegree(oLat);
} public double TranDMsToDegree(string _dms)
{
string[] dms = _dms.Split('.');
if (dms.Length > 2)
return double.Parse(dms[0]) + double.Parse(dms[1]) / 60 + double.Parse(dms[2] + "." + dms[3] ?? "0") / 3600;
else
return 0d; } private static string TranDegreeToDMs(double d)
{
int Degree = Convert.ToInt16(Math.Truncate(d));//度
d = d - Degree;
int M = Convert.ToInt16(Math.Truncate((d) * 60));//分
int S = Convert.ToInt16(Math.Round((d * 60 - M) * 60));
if (S == 60)
{
M = M + 1;
S = 0;
}
if (M == 60)
{
M = 0;
Degree = Degree + 1;
}
string rstr = Degree.ToString() + ".";
if (M < 10)
rstr = rstr + "0" + M.ToString();
else
rstr = rstr + M.ToString();
if (S < 10)
rstr = rstr + "0" + S.ToString();
else
rstr = rstr + S.ToString();
return rstr;
} private bool outOfChina(double _lng, double _lat)
{
if (lng < 72.004 || lng > 137.8347)
return true;
if (lat < 0.8293 || lat > 55.8271)
return true;
return false;
} private double transformLat(double x, double y)
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
ret += (20.0 * Math.Sin(6.0 * x * PI) + 20.0 * Math.Sin(2.0 * x * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.Sin(y * PI) + 40.0 * Math.Sin(y / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * Math.Sin(y / 12.0 * PI) + 320 * Math.Sin(y * PI / 30.0)) * 2.0 / 3.0;
return ret;
} private double transformLng(double x, double y)
{
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
ret += (20.0 * Math.Sin(6.0 * x * PI) + 20.0 * Math.Sin(2.0 * x * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.Sin(x * PI) + 40.0 * Math.Sin(x / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * Math.Sin(x / 12.0 * PI) + 300.0 * Math.Sin(x / 30.0 * PI)) * 2.0 / 3.0;
return ret;
}
}

调用

  GPS t = new GPS();
t.oLng = dt.Rows[i][1].ToString();
t.oLat = dt.Rows[i][2].ToString();
t.wgs_encrypt();
t.gcj_encrypt();
t.bd_encrypt();
cells[i+1, 3].PutValue(t.bLng);
cells[i+1, 4].PutValue(t.bLat);

最新文章

  1. Spring PropertyPlaceholderConfigurer数据库配置
  2. 【学习笔记】oracle 比较运算符,逻辑运算符,特殊运算符,判断空值,大小写敏感
  3. vue在多级联动时,一些情况不用watch而用onchange会更好
  4. iOS 使用证书时遇到的错误一
  5. centos7 安装拼音输入法(转载)
  6. ERROR 1130 (HY000) Host ‘hostname’ is not allowed to connect to this MySQL server
  7. Excel 导入并导出结果集
  8. spring_150801_autowired_qualifier
  9. Android读取assets目录下的资源
  10. 谷歌Flash不是最新版
  11. bzoj1706
  12. web服务器小记
  13. zMPLS的安装与配置
  14. javascript时间戳与日期格式之间的互转
  15. 检测web界面不能访问后重启
  16. leetcode 4:Median of Two Sorted Arrays
  17. C#结婚吧(if else if)
  18. 初次接触Jenkins遇到的几个问题
  19. Spring-Cache 注解 @Cacheable,@CachePut , @CacheEvict
  20. yarn基本命令

热门文章

  1. 第31月第10天 tableview头部空白 Other Linker Flags rtmp
  2. linux 性能分析
  3. codeforces gym 101611C 重链剖分构造
  4. Gitlab_ansible_jenkins三剑客⑥Jenkins和ansible集成
  5. Java线程池(待续)
  6. vue请求网络图片403错误,图片有占位但是显示不出来解决办法
  7. 定义一个javascript方法,实现对数组集合的正向排序
  8. js中字符串的replace方法区分单双引号
  9. tomcat 网页管理tomcat
  10. Django提交表单时遇到403错误:CSRF verification failed