「GIS算法」GIS中的经纬度与度分秒互相转换算法
发布时间: 2023-12-15
所属分类: GIS百科
我们常见的经纬度通常有两种表达格式,一种是小数点的方式,如 23.12345
度,另外一种是度分秒的形式,如 23°7'24.42"
、23度7分24.42秒
。这两种格式我们在数据处理的时候都会用到,本文简要介绍下经纬度与度分秒互相转换的方式。
PS:其实这是高中数学的东西,果然我人生中智力的巅峰在高中。
转换原理
经纬度 转 度分秒:
假设有个纬度是23.12345,整数的部分23 这个就是转换后的度数(°); 小数的部分0.12345 * 60 = 7.407 ,取整数的部分,7(')就是转换后的分数;分数计算后的小数部分,也就是0.407 * 60 = 24.42,24.42(")就是转换后的秒数。因此23.12345转换后就是23° 7' 24.42"。
度分秒 转 经纬度:
假设有个度数是23° 7' 24.42",转换公式 : x度 y分 z秒 = x + y/60 + z/3600 度
(23) + (7/60) + (24.42/3600) = 23 + 0.11666 + 0.00678333 = 23.123443
实现代码(JavaScript)
JS代码实现如下:
// 经纬度转度分秒
function transformDMS(degree, direction) {
var D = plusZeroAtHead(Math.floor(degree));
var M = plusZeroAtHead(Math.floor((degree - D) * 60));
var S = plusZeroAtHead(Math.floor(((degree - D) * 60 - M) * 60));
var result = D + "°" + M + "′" + S + "″";
// 如果是个位数, 则在首位加 0
function plusZeroAtHead(num) {
if (num > -10 && num < 0) {
num = "-0" + Math.abs(num)
}
if (num > 0 && num < 10) {
return "0" + num
}
return num;
}
if (direction === "lon") {
D > 0 ? result += "E" : result += "W";
return result;
}
if (direction === "lat") {
D > 0 ? result += "N" : result += "S";
return result;
}
return result;
}
// 度分秒 转 经纬度
function dsturnDeg(value){
var du = value.split("°")[0];//度
var fen = value.split("°")[1].split("'")[0];//分
var miao = value.split("°")[1].split("'")[1].split('"')[0];//秒
return Math.abs(du) + "." + (Math.abs(fen)/60 + Math.abs(miao)/3600);
}
实现代码(C#)
使用 C# 实现代码如下:
// 经纬度转度分秒
private string LatLngToGPS(string text)
{
string result = "";
string[] ary = text.Trim().Split('.');
if (ary.Length == 2)
{
double degree, minute, second, temp;
//ex. 21.12345
if (double.TryParse(ary[0], out degree) && double.TryParse(ary[1], out temp))
{
//取小數位 0.12345
temp = temp / System.Math.Pow(10, ary[1].Length);
//分只留下整數位
minute = Math.Floor(temp * 60);
//取分剩下的小數位
double temp1 = (temp * 60) - Math.Floor(temp * 60);
second = temp1 * 60;
result = degree.ToString() + "°" + minute.ToString("00") + "\'" + second.ToString() + "\"";
}
}
return result;
}
// 度分秒 转 经纬度
private string GPSToLatLng(string text)
{
string result = "";
text = text.Trim();
//必須有度分秒才可進行轉換
if (text.IndexOf('°') != -1 && text.IndexOf('\'') != -1 && text.IndexOf('\"') != -1)
{
double degree, minute, second;
//取得度分秒
if (double.TryParse(text.Split('°')[0], out degree) &&
double.TryParse(text.Split('°')[1].Split('\'')[0], out minute) &&
double.TryParse(text.Split('°')[1].Split('\'')[1].Split('\"')[0], out second)
)
{
//x度 y分 z秒 = x + y/60 + z/3600 度
result = (degree + (minute / 60) + (second / 3600)).ToString();
}
}
return result;
}
参考
- https://lawrencetech.blogspot.com/2011/12/gps_28.html
- https://gist.github.com/gooin/c877f7a198db44960fa9e73d4fb67ef2
后话
其他语言版本的代码请自行实现,这基本是学习编程的入门题目了。
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子
上一篇:「GIS百科」什么是城市坐标系
没有下文