Подтвердить что ты не робот

Преобразование широты и долготы в десятичные значения

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

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

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

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

4b9b3361

Ответ 1

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

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)

Ответ 2

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

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;
}

Ответ 3

Моя измененная версия принуждает строки к 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;
}

Ответ 4

У меня есть 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;
}

Ответ 5

Джо, script вы уже упоминали, что вам нужно. С его помощью вы можете преобразовать 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()

Ответ 6

вот мой пример:

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

Это то, что мне нужно.

Ответ 7

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