c#坐标系互相转换
转自群友的博客: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);
c#坐标系互相转换的更多相关文章
- 获取全国市以及地理坐标,各大坐标系北斗,百度,WGS-84坐标系的转换,有图,有代码
1 先上坐标取到的值: 获取到的坐标部分如下: '北京市':[116.39564503788,39.92998577808], '天津市':[117.21081309155,39.1439299033 ...
- 【PHP版】火星坐标系 (GCJ-02) 与百度坐标系 (BD-09ll)转换算法
首先感谢java版作者@宋宋宋伟,java版我是看http://blog.csdn.net/coolypf/article/details/8569813 然后根据java代码修改成了php代码. & ...
- C#实现地图坐标系的转换(WGS-84、GCJ-02、BD-09)
WGS-84坐标系:全球定位系统使用,GPS.北斗等 GCJ-02坐标系:中国地区使用,由WGS-84偏移而来 BD-09坐标系:百度专用,由GCJ-02偏移而来 (PS:源于项目需求,本来是想读图 ...
- Cesium中的坐标系及转换
在我们开始学习Entity之前,我们首先需要先学习下Cesium中的坐标系,Cesium中有多个坐标系,在进行添加Entity时经常会使用到. 一.坐标系介绍 我们先来列举下Cesium中的坐标系:W ...
- NX二次开发-从一个坐标系到另一个坐标系的转换
函数:UF_MTX4_csys_to_csys().UF_MTX4_vec3_multiply() 函数说明:从一个坐标系统到另一个坐标系统的转换.如下图红色坐标系下有个红色的点,将红色的点转到绿色的 ...
- js不同地图坐标系经纬度转换(天地图,高德地图,百度地图,腾讯地图)
1.js转换代码 1 //转换常数 2 var x_pi = 3.14159265358979324 * 3000.0 / 180.0; 3 var pi = 3.14159265358979324; ...
- CAD输出的局部平面坐标数据配准转换到WGS84坐标系
局部平面坐标 平移纠正到常用平面坐标系下的坐标 转换后的地理坐标 采用两 ...
- 关于Cocos2d-x中坐标系的种类和转换
注意: 当一个节点有一个子节点的时候,如果移动父节点,子节点也会跟着做相应的移动变化,只要被添加到父节点中,子节点就被绑定了,所以子节点的位置,坐标就会被动地变化. 当一个节点有一个子节点的时候,如果 ...
- GIS中的坐标系定义与转换
GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...
随机推荐
- combine_lat_dirs.sh
#!/bin/bash # Copyright 2018 Jarvan Wang Apache 2.0. # Copyright 2016 Xiaohui Zhang Apache 2.0. ...
- 浅入深出Vue系列
浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...
- BZOJ4314 倍数?倍数!
好神仙啊.... 题意 在$ [0,n) $中选$ k$个不同的数使和为$ n$的倍数 求方案数 $ n \leq 10^9, \ k \leq 10^3$ 题解 k可以放大到1e6的 先不考虑$ k ...
- Win 10中使用图片查看器
在Win10中,照片应用提供了时间线.专辑等更丰富的图片管理功能,但是对于基于文件夹打开浏览图片的方式显得笨拙, 放大缩小操作略繁琐,有时还会出现当前文件夹图片加载迟缓导致无法快速浏览的问题. 此时你 ...
- php 7.3 新特性
2018-12-10 14:51:35 星期一 官方原文: https://github.com/php/php-src/blob/43329e85e682bed4919bb37c15acb8fb3e ...
- IIS+nginx反向代理 负载均衡
本文没有过多的讲述,只讲述重点地方.由这两个转自的文章进行中和 1.nginx+iis实现负载均衡(这篇文章主要是有第2篇文章的工具) 2.nginx+iis使用(这篇文章讲得很详细,配置文件直接复制 ...
- mysql 利用druid 为访问密码加密
在原来数据库配置文件jdbc.properties 文件中增加几行加密文件 jdbc.username=rootjdbc.password=KqYkfcQkQOdOpCnaokLfb9Kbzdf+NG ...
- 高可用Redis(一):通用命令,数据结构和内部编码,单线程架构
1.通用API 1.1 keys命令和dbsize命令 keys * 遍历所有key keys [pattern] 遍历模式下所有的key dbsize 计算Redis中所有key的总数 例子: 12 ...
- Percona 5.7.13 已经发布
Percona 5.7.13 已经正式发布,需要的人士可以去官方网站下载 https://www.percona.com/downloads/Percona-Server-5.7/Percona-Se ...
- Kali Linux的vi编辑器/vim编辑器使用方法
转载声明:本文为转载文章 原文地址:https://www.52host.cn/blog/kali-linux-vi-editor/ Kali Linux系统的vi编辑器/vim编辑器的使用和Cent ...