Преобразование широты и долготы в десятичные значения - PullRequest
27 голосов
/ 17 июля 2009

У меня есть информация GPS, представленная в виде:

36 ° 57'9 "N 110 ° 4'21" W

Я могу использовать функции JavaScript Chris Veness для преобразования градусов, минут и секунд в числовые градусы, но сначала необходимо проанализировать информацию GPS в отдельных строках широты и долготы (с суффиксами NSEW). Я прочитал соответствующие посты на stackoverflow, но я не эксперт по регулярным выражениям (и не программист) и мне нужна помощь с функцией синтаксического анализа. Каков наилучший способ разбить эту строку на широту и долготу для использования в функции преобразования?

Результатом всего этого будет веб-ссылка, по которой можно щелкнуть, чтобы увидеть местоположение на карте Google.

Ответы [ 7 ]

50 голосов
/ 17 июля 2009

Для анализа вашего ввода используйте следующее.

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

Десятичные координаты можно вводить в карты Google для получения баллов через GLatLng(lat, lng) ( API Карт Google )

12 голосов
/ 22 октября 2015

Исправил вышеперечисленные функции и сделал вывод объектом.

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;
}
6 голосов
/ 09 сентября 2015

Моя измененная версия приводит части строк в числа, так что они могут быть фактически добавлены вместе, а не объединены. Он также обрабатывает десятичные значения, общие для компонента 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;
}
3 голосов
/ 06 августа 2010

Я получил несколько 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;
}
2 голосов
/ 04 сентября 2013

вот мой взгляд на это:

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

Что мне и нужно.

2 голосов
/ 17 июля 2009

Джо, сценарий, который вы упомянули, уже сделал то, что вы хотите. С его помощью вы можете конвертировать 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()
0 голосов
/ 27 октября 2017

Я использовал \ 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;
   }
...