2009-07-16 14 views
20

mam informacji GPS przedstawionej w postaci:Konwersja szerokości i długości na dziesiętny wartości

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

można użyć javascript functions of Chris Veness konwersji stopni minuty i sekundy do stopni numerycznych, ale najpierw trzeba przeanalizować informacje GPS w poszczególnych ciągach szerokości i długości geograficznej (z przyrostkami NSEW). Czytałem podobne posty na stackoverflow, ale nie jestem ekspertem regex (ani programistą) i potrzebuję pomocy z funkcją parsowania. Jaki jest najlepszy sposób na przeanalizowanie tego ciągu na szerokość i długość geograficzną do wykorzystania w funkcji konwersji?

Rezultatem tego będzie łącze internetowe, które można kliknąć, aby wyświetlić mapę lokalizacji w mapie Google.

+2

Czym dokładnie jest format wyjścia, którego szukasz? Czy jest coś w rodzaju: "36 57 9 N" i "110 4 21 W" dla wprowadzonego sygnału? Czy dane wejściowe zawsze występują w tej formie? –

+0

Dla wejść, które pokazałem, oczekiwałbym, że wyjście będzie dwie wartości: 36.95250 -110,07250 I tak, dane wejściowe są zawsze w tej formie. –

+0

Powinno to brzmieć: "dwie wartości: 36,95250 i -110,07250 (bez" i "oczywiście). Przepraszamy. –

Odpowiedz

41

Aby przeanalizować dane wejściowe, wykonaj następujące czynności.

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

Następujące będzie konwertować DMS do 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; 
} 

Więc wejście da następujący:

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

dziesiętne współrzędne mogą być wprowadzane do google maps, aby zdobyć punkty poprzez GLatLng(lat, lng) (Google Maps API)

+0

Być może trochę lepiej: var parts = input.split (/ [^ \ d \ w] + /). Dostosuj przesunięcia o -1. – Inshallah

+0

@Inshalla - dziękuję! –

+0

To powinno zadziałać, spróbuję dziś wieczorem Dziękuję wszystkim, którzy odpowiedzieli Ta strona jest najlepsza –

2

Joe, skrypt, który masz wspomniano już, co zrobiłeś. Dzięki niemu można przekonwertować lat i długo i umieścić go w link, aby zobaczyć lokalizację na mapie Google:

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

mam jakiś NaN w tej funkcji i trzeba to zrobić (nie pytaj mnie dlaczego)

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

tutaj jest moje zdanie na ten temat:

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; 

}

ta funkcja nie obsługuje wszystkie rodzaje lat/typy długie, ale obsługuje następujące formaty:

-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 

To, czego potrzebowałem.

4

Moja ulepszona wersja wymusza części łańcuchów na Numbers, aby mogły być faktycznie dodawane, a nie łączone. Zajmuje się także wartości dziesiętne, które są wspólne dla komponentu sekundach:

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

Następujące będzie konwertować DMS do 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; 
} 
9

poprawiono powyższe funkcje i wykonane wyjście obiektu.

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

jeśli wiedzieć wcześniej, że 60 * 60 to 3600, dlaczego warto obliczyć? –

0

kiedyś \ D + (\ \ D +) i \ D + (.\ D +) ponieważ może mieć liczb zmiennoprzecinkowych

moim ostatnim funkcję:

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; 
    } 
Powiązane problemy