c#坐标系互相转换
2024-10-18 02:00:59
转自群友的博客: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);
最新文章
- Spring PropertyPlaceholderConfigurer数据库配置
- 【学习笔记】oracle 比较运算符,逻辑运算符,特殊运算符,判断空值,大小写敏感
- vue在多级联动时,一些情况不用watch而用onchange会更好
- iOS 使用证书时遇到的错误一
- centos7 安装拼音输入法(转载)
- ERROR 1130 (HY000) Host ‘hostname’ is not allowed to connect to this MySQL server
- Excel 导入并导出结果集
- spring_150801_autowired_qualifier
- Android读取assets目录下的资源
- 谷歌Flash不是最新版
- bzoj1706
- web服务器小记
- zMPLS的安装与配置
- javascript时间戳与日期格式之间的互转
- 检测web界面不能访问后重启
- leetcode 4:Median of Two Sorted Arrays
- C#结婚吧(if else if)
- 初次接触Jenkins遇到的几个问题
- Spring-Cache 注解 @Cacheable,@CachePut , @CacheEvict
- yarn基本命令
热门文章
- 第31月第10天 tableview头部空白 Other Linker Flags rtmp
- linux 性能分析
- codeforces gym 101611C 重链剖分构造
- Gitlab_ansible_jenkins三剑客⑥Jenkins和ansible集成
- Java线程池(待续)
- vue请求网络图片403错误,图片有占位但是显示不出来解决办法
- 定义一个javascript方法,实现对数组集合的正向排序
- js中字符串的replace方法区分单双引号
- tomcat 网页管理tomcat
- Django提交表单时遇到403错误:CSRF verification failed