2016-04-07 10 views
1

Ich verwende Längen- und Breitengraddaten und versuche, Metriken an jedem Punkt einer Karte von Stockholm grafisch darzustellen (basierend auf der Nähe zu diesem Punkt) . Ich interessiere mich mehr dafür, dass die Punkte auf dem Bild gleichmäßig verteilt sind und nicht in gleichem Abstand voneinander. In diesem Sinne verstehe ich, dass die Abstände zwischen Breitenpunkten am Äquator länger sind als entlang der Polarkreise, und das könnte auch sein ein entscheidender Faktor für die Frage.Breite und Länge, x und y und Unterschiede beim Plotten: geosphere und ggmap

Mein Ziel war es, die Karte in ein Raster von ca. 1 km Schritten in x- und y-Richtung aufzuteilen. Als solche habe ich den minimalen und maximalen Breiten- und Längengrad genommen, ihre x- und y-Abstände vom Stockholmer Zentrum berechnet und dann die Spanne der Breiten- und Längengrade durch die Spanne der x- und y-Koordinaten geteilt (mit Geosphäre). Ich tat dies, weil ich wollte, dass die Punkte beim Zeichnen gleichmäßig verteilt waren (sonst würde es aufgrund der Nähe zum Äquator weniger Abstand zwischen den x-Punkten im Vergleich zum unteren Rand der Karte geben).

Ich zeichnete dann diese Punkte auf der Karte (mit ggmap), und beobachtet, dass es mehr Abstand zwischen Punkten in der y-Richtung als der x-Richtung ist. Ich nehme an, die Karte könnte einfach verzerrt gezeichnet werden, aber es scheint ein bisschen zu verzerrt zu sein, um es zu glauben. Ich vermute, dass ich etwas falsch mache, aber nicht finden kann, was es sein könnte.

Code-Beispiel unten:

library("ggmap") 
library("RgoogleMaps") 
library("geosphere") 

stockholm <- get_map("stockholm", zoom=11) 
ggmap(stockholm) 

places <- c('Tensta', 'Hanviken') 

pos <- data.frame(Places = places, lat = NA, lon = NA, x = NA, y = NA) 
reflatlon = getGeoCode('Stockholm, Sweden') 

for(i in 1:length(places)) { 
    latlon <- getGeoCode(paste0(places[i], ', Stockholm')) 
    pos$lat[i] <- as.numeric(latlon[1]) 
    pos$lon[i] <- as.numeric(latlon[2]) 

    dist_y <- distGeo(c(latlon[1], reflatlon[2]), reflatlon) * sign(latlon[1] - reflatlon[1]) # same longitude 
    dist_x <- distGeo(c(reflatlon[1], latlon[2]), reflatlon) * sign(latlon[2] - reflatlon[2]) # same latitude 

    pos$x[i] <- dist_x 
    pos$y[i] <- dist_y 
} 

deglatperm <- (max(pos$lat) - min(pos$lat))/(max(pos$y) - min(pos$y)) # degrees latitude per metre 
deglonperm <- (max(pos$lon) - min(pos$lon))/(max(pos$x) - min(pos$x)) # degrees longitude per metre 

seqlat <- seq(min(pos$lat), max(pos$lat), by = deglatperm*1000) # sequence with a point every ~1km 
seqlon <- seq(min(pos$lon), max(pos$lon), by = deglonperm*1000) # sequence with a point every ~1km 

seqlatlon <- expand.grid(seqlat, seqlon) 
names(seqlatlon) <- c('lat', 'lon') 

ggmap(stockholm) + geom_point(aes(x = lon, y = lat), data=seqlatlon) 

output plot

Wie Sie aus der Ausgabe Plot sehen können, gibt es mindestens doppelt so vielen Abstand zwischen den Punkten in der y-Richtung in Bezug auf die x-Richtung verglichen.

Zusammengefasst: Die x- und y-Koordinaten werden mithilfe der Geosphäre erhalten. Die Karte wird mit ggmap geplottet.

Mache ich etwas falsch mit Geosphäre? Oder sind Karten von Längen- und Breitengrad SO verzerrt? Wenn ich Google Maps öffne und das Werkzeug "Entfernung messen" ungefähr zwischen den oberen und unteren sowie linken und rechten Punkten verwende, erhalte ich Schätzungen von 16,3 und 16,9 km, während die Werte der Geosphäre 17 und 32 km betragen (x und y)) beziehungsweise.

Wenn mir jemand sagen könnte, was hier vor sich geht, wäre ich sehr dankbar!

Antwort

2

Ich versuche zu vermeiden, in irgendeinem Koordinatensystem zu arbeiten, verwendet Grad statt Entfernungen. In den USA benutze ich ständig unser State Plane System. Es scheint, dass Schweden das RT-System verwendet. Sobald Sie Ihre Koordinaten aus Grad und in Entfernungen von einem Bezugspunkt erhalten haben, können Sie Ihr Gitter mit konventionelleren Abständen erstellen. Von dort können Sie Ihre Koordinaten wieder in Grad setzen, wenn Sie möchten.

Ich verwende die spTranform Funktion für Koordinatenumrechnungen und benutze die Spatial Reference Anleitung, um die Referenzcodes für die Koordinatensysteme zu erhalten.

library("ggmap") 
library("RgoogleMaps") 
library("geosphere") 
library("sp") 

stockholm <- get_map("stockholm", zoom=11) 
ggmap(stockholm) 

places <- c('Tensta', 'Hanviken') 

pos <- data.frame(Places = places, lat = NA, lon = NA) 
reflatlon <- getGeoCode('Stockholm, Sweden') 

for(i in 1:length(places)) { 
    latlon <- getGeoCode(paste0(places[i], ', Stockholm')) 
    pos$lat[i] <- as.numeric(latlon[1]) 
    pos$lon[i] <- as.numeric(latlon[2]) 
} 

p <- SpatialPoints(data.frame(pos$lon, pos$lat), proj4string = CRS("+init=epsg:4326")) 
p <- spTransform(p, CRS("+init=epsg:3022")) 

seqx <- seq(min([email protected][,1]), max([email protected][,1]), by = 1000) 
seqy <- seq(min([email protected][,2]), max([email protected][,2]), by = 1000) 

pgrid <- expand.grid(seqx, seqy) 
pgrid <- SpatialPoints(pgrid, proj4string = CRS("+init=epsg:3022")) 
pgrid <- spTransform(pgrid, CRS("+init=epsg:4326")) 
pgrid <- data.frame([email protected]) 

names(pgrid) <- c('lon', 'lat') 

ggmap(stockholm) + geom_point(aes(x = lon, y = lat), data=pgrid) 
+1

Große Antwort - danke! Das Problem lag also in meiner Nutzung der Geosphäre: Ich wusste nicht, dass Koordinatensysteme so komplex sind, aber im Nachhinein macht es Sinn. Also, wenn ich richtig verstanden habe, transformiert man die Koordinaten in einer Welt epsg: 4362 in ein lokales topgraphisches Koordinatensystem epsg: 3022? Und, bei der Wahl von epsg: 3022, haben Sie dies getan, indem Sie spatialreference.org? Ich habe in Stockholm gesucht und diese Referenz nicht erhalten, aber 11 verschiedene Codes erhalten.Oder gibt es einen bestimmten/automatisierten Weg/Ort, um herauszufinden, welcher epsg-Code für eine bestimmte Region verwendet werden soll? Danke nochmal! –

+0

Die Umwandlung in ein Koordinatensystem in Entfernungseinheiten ist der Schlüssel. Um das RT90-Koordinatensystem zu finden, suchte ich nach google für "Schwedisches Koordinatensystem". Sie werden feststellen, dass es in SR.org mehrere RT-Koordinatensysteme gibt. Ich habe zuerst versucht, Stockholm in SR zu suchen, kam aber auch mit leeren Händen. Ich kenne keine bestimmte Quelle für das Finden von lokalen Koordinatensystemen (projfinder.org tut das Gegenteil, was ziemlich cool ist). EPSG ist nur eine Katalognummer. Jedes Koordinatensystem ist einzigartig und die meisten werden von EPSG erkannt. Suche "geografische Koordinatensysteme". Schweres Zeug. – JMT2080AD

+0

Sie können auch nach GIS Stack Exchange schreiben, wenn Sie nach anderen Antworten suchen. Wenn dies für Sie funktioniert, können Sie es abstimmen oder als Antwort markieren. – JMT2080AD