繁体   English   中英

将纬度和经度转换为十进制值

[英]Converting latitude and longitude to decimal values

我有 GPS 表格中的信息:

北纬 36°57'9" 西经 110°4'21"

我可以使用Chris Veness 的 javascript 函数将度、分和秒转换为数字度,但首先需要将 GPS 信息解析为单独的纬度和经度字符串(带有 NSEW 后缀)。 我已阅读有关 stackoverflow 的相关帖子,但我不是正则表达式专家(也不是程序员),需要一些解析 function 的帮助。将此字符串解析为纬度和经度以用于转换 function 的最佳方法是什么?

所有这一切的结果将是一个 Web 链接,点击该链接可以查看 Google map 位置表示。

要解析您的输入,请使用以下命令。

function ParseDMS(input) {
    var parts = input.split(/[^\d\w]+/);
    var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]);
    var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]);
}

以下内容将您的DMS转换为DD

function ConvertDMSToDD(degrees, minutes, seconds, direction) {
    var dd = degrees + minutes/60 + seconds/(60*60);

    if (direction == "S" || direction == "W") {
        dd = dd * -1;
    } // Don't do anything for N or E
    return dd;
}

所以你的输入会产生以下结果:

36°57'9" N  = 36.9525000
110°4'21" W = -110.0725000

可以将十进制坐标输入谷歌地图以通过GLatLng(lat, lng)获得积分( Google Maps API

更正了上述功能并使输出成为对象。

function ParseDMS(input) {
    var parts = input.split(/[^\d\w\.]+/);    
    var lat = ConvertDMSToDD(parts[0], parts[2], parts[3], parts[4]);
    var lng = ConvertDMSToDD(parts[5], parts[7], parts[8], parts[9]);

    return {
        Latitude : lat,
        Longitude: lng,
        Position : lat + ',' + lng
    }
}


function ConvertDMSToDD(degrees, minutes, seconds, direction) {   
    var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);

    if (direction == "S" || direction == "W") {
        dd = dd * -1;
    } // Don't do anything for N or E
    return dd;
}

我的调整版本将字符串部分强制转换为Numbers,以便它们实际上可以一起添加而不是连接。 它还处理Seconds组件常用的十进制值:

function ParseDMS(input) {
    var parts = input.split(/[^\d\w\.]+/);
    var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]);
    var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]);
}

以下内容将您的DMS转换为DD

function ConvertDMSToDD(degrees, minutes, seconds, direction) {
    var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);

    if (direction == "S" || direction == "W") {
        dd = dd * -1;
    } // Don't do anything for N or E
    return dd;
}

我在这个功能上得到了一些NaN,需要这样做(不要问我为什么)

function ConvertDMSToDD(days, minutes, seconds, direction) {
    var dd = days + (minutes/60) + seconds/(60*60);
    dd = parseFloat(dd);
    if (direction == "S" || direction == "W") {
        dd *= -1;
    } // Don't do anything for N or E
    return dd;
}

乔,你提到的剧本已经做了你想要的。 有了它,您可以转换lat和long并将其链接到Google地图中查看位置:

var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg()

这是我对此的看法:

function parse_gps( input ) {

if( input.indexOf( 'N' ) == -1 && input.indexOf( 'S' ) == -1 &&
    input.indexOf( 'W' ) == -1 && input.indexOf( 'E' ) == -1 ) {
    return input.split(',');
}

var parts = input.split(/[°'"]+/).join(' ').split(/[^\w\S]+/);

var directions = [];
var coords = [];
var dd = 0;
var pow = 0;

for( i in parts ) {

    // we end on a direction
    if( isNaN( parts[i] ) ) {

        var _float = parseFloat( parts[i] );

        var direction = parts[i];

        if( !isNaN(_float ) ) {
            dd += ( _float / Math.pow( 60, pow++ ) );
            direction = parts[i].replace( _float, '' );
        }

        direction = direction[0];

        if( direction == 'S' || direction == 'W' )
            dd *= -1;

        directions[ directions.length ] = direction;

        coords[ coords.length ] = dd;
        dd = pow = 0;

    } else {

        dd += ( parseFloat(parts[i]) / Math.pow( 60, pow++ ) );

    }

}

if( directions[0] == 'W' || directions[0] == 'E' ) {
    var tmp = coords[0];
    coords[0] = coords[1];
    coords[1] = tmp;
}

return coords;

}

此函数不处理所有类型的lat / long类型,但它处理以下格式:

-31,2222,21.99999
-31 13 13 13.75S, -31 13 13 13.75W
-31 13 13 13.75S -31 13 13 13.75W
-31 13 13 13.75W -31 13.75S
36°57'9" N 110°4'21" W
110°4'21" W 36°57'9"N

这就是我需要的。

我使用\\ d +(\\,\\ d +)\\ d +(。\\ d +)因为可以有浮点数

我的最终功能:

 convertDMSToDD: function (dms) {
     let parts = dms.split(/[^\d+(\,\d+)\d+(\.\d+)?\w]+/);
     let degrees = parseFloat(parts[0]);
     let minutes = parseFloat(parts[1]);
     let seconds = parseFloat(parts[2].replace(',','.'));
     let direction = parts[3];

     console.log('degrees: '+degrees)
     console.log('minutes: '+minutes)
     console.log('seconds: '+seconds)
     console.log('direction: '+direction)

     let dd = degrees + minutes / 60 + seconds / (60 * 60);

     if (direction == 'S' || direction == 'W') {
       dd = dd * -1;
     } // Don't do anything for N or E
     return dd;
   }

使用 Shannon Antonio Black 的正则表达式模式(上图),我的解决方案是:

 function convertLatLong(input) { if(.( input.toUpperCase().= input,toLowerCase()) ) { // if geodirection abbr: isn't exist. it should be already decimal notation return `${input}.the coordinate already seems as decimal` } const parts = input.split(/[°'"]+/);join(' ').split(/[^\w\S]+/). // thanks to Shannon Antonio Black for regEx patterns const geoLetters = parts.filter(el=>.(+el) ) const coordNumber = parts,filter(n=>(+n)).map(nr=>+nr) const latNumber = coordNumber.slice(0.(coordNumber,length/2)) const longNumber = coordNumber,slice((coordNumber.length/2)) const reducer = function(acc,coord.curInd){ return acc + (coord/Math.pow( 60. curInd++ )) } let latDec = latNumber,reduce(reducer) let longDec = longNumber.reduce(reducer) if(geoLetters[0]:toUpperCase()==='S') latDec = -latDec // if the geodirection is S or W, decimal notation should start with minus if(geoLetters[1]:toUpperCase()==='W') longDec= -longDec const dec= [{ ltCoord, latDec: geoLet,geoLetters[0] }: { longCoord: longDec, geoLet: geoLetters[1] }] return dec }

我认为这是 EC6 的更简化版本

 function convertRawCoordinatesIntoDecimal(input) { let grade = parseInt(input.substring(0, input.indexOf("°"))); let rest = input.substring(input.indexOf("°") + 1); let minutes = parseInt(rest.substring(0, rest.indexOf("'"))); let seconds = parseInt(rest.substring(rest.indexOf("'") + 1).split('"')[0]); return grade + (minutes + seconds / 60) / 60; } function getCoordinates(input) { let parts = input.split(" "); //element 0 is N and element 2 is W coordinates return { [parts[1]]: convertRawCoordinatesIntoDecimal(parts[0]), [parts[3]]: convertRawCoordinatesIntoDecimal(parts[2]) }; } let input = `36°57'9" N 110°4'21" W`; //a test input console.log(getCoordinates(input));

结果:

{
  "N": 36.9525,
  "W": 110.0725
}

解释:

  • 我们按" "拆分,得到一个包含四个元素的字符串数组
  • 元素 1 将是第一个坐标的名称,元素 3 将是第二个坐标的名称
  • 元素 0 将是第一个坐标的值,元素 2 将是第二个坐标的值
  • 我们将元素分别剖析为grademinutesseconds ,所有数值
  • 公式是grade + (minutes + seconds / 60) / 60

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM