2016-06-07 3 views
1

ich der Bibliothek bin mit sp wie vorgeschlagen here und here von Grad-Minute-Sekunde (dms) Darstellung Dezimalgraden (dd) zu konvertieren.Umrechnen in Dezimalgraden mit birk Bibliothek in R

Wenn ich versuche, den folgenden Code verwendet sp, das ist das Ergebnis:

loc$Lat<-sp::char2dms(loc$Lat) 

Fehler bei rep (Wert, length.out = nrows): Versuch, ein Objekt des Typs zu replizieren 'S4'

Eine Probe meiner Daten ist wie folgt:

c("39d47m01s N", "15d38m08s N", "12d45m01s N", "13d17m25s N", 
    "36d34m29s N", "24d46m34s S", "11d52m39s S", "39d47m01s N", "30d52m34s N", 
    "34d59m47s S") 

Ich muss von dms zu dd konvertieren, da ich Haversine (große Kreisabstände) zwischen Punkten berechnen möchte.

Ich bin auch offen für die Verwendung anderer Pakete, um die Konvertierung durchzuführen.

Ich habe versucht, die Bibliothek birk verwenden, aber es mir ein paar sinnlose Antworten geben wird, wo die Länge/Breite größer als 1000. Vor, birk versucht, hatte ich die lat/long Darstellung zu einem umgewandelt, die birk in nimmt seine conv_unit Funktion

+0

Können Sie Beispieldaten einschließen, mit denen 'conv_unit' nicht funktioniert? – beetroot

Antwort

1

Dies kann sein, vielleicht jemand besser kenntnisreich als ich kann in, aber hier geht.

Ich fand eine thread from R-help mailing list (from 6 years ago), die über die Konvertierung von DMS in Dezimalgrade mit Formel Decimal degrees = Degrees + (Minutes/60) + (Seconds/3600) spricht.

Mit regulären Ausdrücken, um das entsprechende Element zu finden, konstruiere ich ein data.frame, das verwendet wird, um die oben genannte Formel anzuwenden. Multiplizieren Sie die Koordinaten von Süden und Westen mit -1, um sie negativ zu machen.

xy <- c("39d47m01s N", "15d38m08s N", "12d45m01s N", "13d17m25s N", 
    "36d34m29s N", "24d46m34s S", "11d52m39s S", "39d47m01s N", "30d52m34s N", 
    "34d59m47s S") 

nxy <- data.frame(degs = as.numeric(gsub("(^\\d+)(.+$)", "\\1", xy)), 
        mins = as.numeric(gsub("(^.+d)(\\d+)(m.+$)", "\\2", xy)), 
        secs = as.numeric(gsub("(^.+m)(\\d+)(s [A-Z]$)", "\\2", xy)), 
        direction = gsub("(^.+)([A-Z])$", "\\2", xy)) 

nxy$indec <- with(nxy, degs + (mins/60) + (secs/3600)) 

nxy[nxy$direction %in% c("W", "S"), "indec"] <- nxy[nxy$direction %in% c("W", "S"), "indec"] * -1 

nxy 

    degs mins secs direction  indec 
1 39 47 1   N 39.78361 
2 15 38 8   N 15.63556 
3 12 45 1   N 12.75028 
4 13 17 25   N 13.29028 
5 36 34 29   N 36.57472 
6 24 46 34   S -24.77611 
7 11 52 39   S -11.87750 
8 39 47 1   N 39.78361 
9 30 52 34   N 30.87611 
10 34 59 47   S -34.99639 

Oder Sie könnten char2dms für Sie arbeiten lassen.

nxy$char2dms <- as.numeric(sp::char2dms(xy, chd = "d", chm = "m", chs = "s")) 

    degs mins secs direction  indec char2dms 
1 39 47 1   N 39.78361 39.78361 
2 15 38 8   N 15.63556 15.63556 
3 12 45 1   N 12.75028 12.75028 
4 13 17 25   N 13.29028 13.29028 
5 36 34 29   N 36.57472 36.57472 
6 24 46 34   S -24.77611 -24.77611 
7 11 52 39   S -11.87750 -11.87750 
8 39 47 1   N 39.78361 39.78361 
9 30 52 34   N 30.87611 30.87611 
10 34 59 47   S -34.99639 -34.99639 
0

Ich habe es gerade herausgefunden.

Auch wenn sp::char2dms akzeptiert Argumente genannt chd, chm and chs, die uns die Trennzeichen für Grad, Minuten und Sekunden angeben sollen, scheinen sie nicht zu funktionieren.

Nachdem ich das Format geändert habe, in dem die Koordinaten dargestellt werden, funktioniert die Funktion wie erwartet. Also, ich brauchte nur um sicherzustellen, dass meine Koordinaten im Format sind die sp :: char2dms erwartet standardmäßig, die von der Form:

15d5'52.4394" N 145d40'26.04" E 

Die seperators für Grad, Minuten und Sekunden sind d‘, und

+0

' chd', 'chm' und' chs' arbeiten. Siehe letzten Teil meiner (bearbeiteten) Antwort. –

+0

Es funktionierte nicht für Ich habe leider Stunden damit verbracht, es auszuprobieren, aber ich werde deine Antwort akzeptieren, da sie umfassender ist und auch den Code für Berechnungen ohne Bibliotheken hat. – DotPi

+0

Ich arbeite mit 'sp' version sp_1.2-2 ein kleines Detail? –