Parsen geografische Breite und Länge mit Rubin
-
19-09-2019 - |
Frage
Ich brauche einige Benutzer übermittelten Zeichenfolge mit Längen- und Breitengrade zu analysieren, unter Rubin.
sollte das Ergebnis in einem Doppel gegeben werden
Beispiel:
08º 04' 49'' 09º 13' 12''
Ergebnis:
8.080278 9.22
Ich habe sowohl Geokit und GeoRuby sieht aber noch keine Lösung gefunden. Jeder Hinweis?
Lösung
"08° 04' 49'' 09° 13' 12''".gsub(/(\d+)° (\d+)' (\d+)''/) do
$1.to_f + $2.to_f/60 + $3.to_f/3600
end
#=> "8.08027777777778 9.22"
Edit: oder das Ergebnis als ein Array von Schwimmern zu bekommen:
"08° 04' 49'' 09° 13' 12''".scan(/(\d+)° (\d+)' (\d+)''/).map do |d,m,s|
d.to_f + m.to_f/60 + s.to_f/3600
end
#=> [8.08027777777778, 9.22]
Andere Tipps
Wie wäre es mit einem regulären Ausdruck verwenden? Zum Beispiel:
def latlong(dms_pair)
match = dms_pair.match(/(\d\d)º (\d\d)' (\d\d)'' (\d\d)º (\d\d)' (\d\d)''/)
latitude = match[1].to_f + match[2].to_f / 60 + match[3].to_f / 3600
longitude = match[4].to_f + match[5].to_f / 60 + match[6].to_f / 3600
{:latitude=>latitude, :longitude=>longitude}
end
Hier ist eine komplexere Version, die mit negativen Koordinaten meistert:
def dms_to_degrees(d, m, s)
degrees = d
fractional = m / 60 + s / 3600
if d > 0
degrees + fractional
else
degrees - fractional
end
end
def latlong(dms_pair)
match = dms_pair.match(/(-?\d+)º (\d+)' (\d+)'' (-?\d+)º (\d+)' (\d+)''/)
latitude = dms_to_degrees(*match[1..3].map {|x| x.to_f})
longitude = dms_to_degrees(*match[4..6].map {|x| x.to_f})
{:latitude=>latitude, :longitude=>longitude}
end
Auf der Grundlage der Form Ihrer Frage, erwarten Sie die Lösung negative Koordinaten richtig zu handhaben. Wenn Sie nicht wären, dann würden Sie eine N oder S folgende Breite und eine E oder W folgende Länge erwarten.
Bitte beachten Sie, dass die akzeptierte Lösung nicht korrekte Ergebnisse liefern mit einem negativen koordinieren. Es werden nur die Grade negativ sein, und die Minuten und Sekunden werden positiv sein. In jenen Fällen, in denen die Grade negativ sind, die Minuten und Sekunden von 0 ° die Koordinate näher an 0 ° und nicht weiter weg bewegen.
Will Harris' zweite Lösung ist der bessere Weg zu gehen.
Viel Glück!