麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

「GIS算法」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; 
}

参考

  1. https://lawrencetech.blogspot.com/2011/12/gps_28.html
  2. https://gist.github.com/gooin/c877f7a198db44960fa9e73d4fb67ef2

后话

其他语言版本的代码请自行实现,这基本是学习编程的入门题目了。

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子
没有下文

留言板(小编看到第一时间回复)