2017-11-08 3 views
0

Ich habe die longtitudes und Breiten von ein paar Punkte und Linien (und möglicherweise Polygone), die ich die Abstände zwischen in R.R: Abstand zwischen Punkt und Linie in Metern in GIS-Daten

Die meisten Menschen messen müssen vorschlagen, dass ich die gDistance Funktion aus der rgeos Bibliothek verwenden. Diese Funktion erfordert eine Reihe von Umrechnungen der Längen- und Breitengrade, bevor sie die Ergebnisse in Meter ausgibt. Ich habe viele Tutorials durchgelaufen, aber trotzdem läuft etwas schief. Ich hoffe, Sie können mir helfen, den Fehler zu finden.

Zuerst erstellen wir ein paar Punkte und Linien

# Points 
points <- data.frame(long = c(12.5633074637037,12.54638671875,12.6039819633632,12.54638671875,12.5668119504436,12.54638671875,12.5482921600342,12.5428380966187,12.5983709560864,12.5914064335047), 
        lat = c(55.6730208606487,55.6685371398926,55.6592116097919,55.6685371398926,55.6855954585358,55.6685371398926,55.7007255554199,55.6902847290039,55.663807868529,55.684380959963)) 

# Lines 
lines <- data.frame(id = c("a", "b")) 
lines$matrices <- list(matrix(c(12.5737695648244,12.5736645937496,12.5729168988113,12.5722100725459,12.5720446280546,55.6793201903946,55.6792991790095,55.6791495067552,55.6790112547884,55.6789788981105), ncol = 2), 
         matrix(c(12.5763890840661,12.57598090855,12.5759575726618,12.5757666379295,12.5757392134412,55.6799504343614,55.6797510847791,55.6797426062619,55.6796732345451,55.6796625397541), ncol = 2)) 

Zweitens die Daten in räumlichen Koordinaten umgewandelt wird unter Verwendung der sp Bibliothek. Für die Konvertierung habe ich eine Projektion in Dänemark verwendet, da sich dort meine Daten befinden. Ich setze die Einheiten zusätzlich auf Meter. Das proj.4 wurde von https://epsg.io/23032 geholt.

# Libraries 
library(sp) 
library(rgeos) 

# Converting to spatial coordinates 
points$sp <- lapply(1:10, function(i) SpatialPoints(points[i,c("long", "lat")], proj4string=CRS("+proj=utm +zone=32 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs"))) 
lines$sp <- lapply(lines$matrices, function(x) SpatialLines(list(Lines(Line(x), ID="a")), proj4string=CRS("+proj=utm +zone=32 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs"))) 

Um eine Plausibilitätsprüfung machen ich die Daten Faltblatt mit aufgetragen. Den hässlichen Code nicht stören, ich weiß, dass es mit einem räumlichen Datenrahmen klüger gemacht werden könnte. Die kleinen blauen Linien in der Mitte sind die, zu denen ich die Entfernung messen muss.

# Library 
library(leaflet) 

# Plotting to visualize 
leaflet() %>% addTiles() %>% 
    addLabelOnlyMarkers(data = points$sp[[1]], label = "1", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[2]], label = "2", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[3]], label = "3", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[4]], label = "4", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[5]], label = "5", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[6]], label = "6", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[7]], label = "7", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[8]], label = "8", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[9]], label = "9", labelOptions = labelOptions(noHide = T)) %>% 
    addLabelOnlyMarkers(data = points$sp[[10]], label = "10", labelOptions = labelOptions(noHide = T)) %>% 
    addPolylines(data = lines$sp[[1]]) %>% 
    addPolylines(data = lines$sp[[2]]) 

enter image description here

Da die Daten sieht gut aus ich auf die Berechnung der Entfernung zwischen den Punkten und den Linien in Grad

# Calculating distances to the lines 
## Distance to line 1 
lapply(1:10, function(i) gDistance(points$sp[[i]], lines$sp[[1]])) 

[[1]] 
[1] 0.01057527 

[[2]] 
[1] 0.02770124 

[[3]] 
[1] 0.03629248 

[[4]] 
[1] 0.02770124 

[[5]] 
[1] 0.008435626 

[[6]] 
[1] 0.02770124 

[[7]] 
[1] 0.03220399 

[[8]] 
[1] 0.03131842 

[[9]] 
[1] 0.02908369 

[[10]] 
[1] 0.01834859 

Offensichtlich ist der Ausgang nicht in Metern, sondern möglicherweise fortgesetzt. Kann mir jemand zeigen, wo alles schief geht?

Antwort

0

Ich habe festgestellt, dass, wenn ich eine andere Projektion, und dann Afterworth spTransform verwenden, bekomme ich die gewünschten Ergebnisse. Ich bin mir nicht sicher, ich verstehe diesen Prozess, aber er tut, was ich wollte.

# Converting to spatial coordinates 
points$sp <- lapply(1:10, function(i) SpatialPoints(points[i,c("long", "lat")], proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))) 
points$sp <- lapply(1:10, function(i) spTransform(points$sp[[i]], CRS("+proj=utm +zone=32 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs"))) 

lines$sp <- lapply(lines$matrices, function(x) SpatialLines(list(Lines(Line(x), ID="a")), proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))) 
lines$sp <- lapply(1:2, function(i) spTransform(lines$sp[[i]], CRS("+proj=utm +zone=32 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs"))) 

Die Abstände in Metern

lapply(1:10, function(i) gDistance(points$sp[[i]], lines$sp[[1]])) 
[[1]] 
[1] 861.6909 

[[2]] 
[1] 1989.797 

[[3]] 
[1] 2937.754 

[[4]] 
[1] 1989.797 

[[5]] 
[1] 807.0334 

[[6]] 
[1] 1989.797 

[[7]] 
[1] 2845.563 

[[8]] 
[1] 2227.443 

[[9]] 
[1] 2319.78 

[[10]] 
[1] 1244.597 
Verwandte Themen