2014-10-10 12 views
5

Ich habe einen räumlichen Punktdatenrahmen und einen räumlichen Polygondatenrahmen. Zum Beispiel wären meine Polygone ein Polygon für jeden Block in Manhattan. Und die Punkte sind Menschen, die überall verstreut sind und manchmal in die Mitte einer Straße fallen, die nicht Teil eines Polygons ist.Wie finde ich das Polygon, das einem Punkt in R am nächsten ist?

Ich weiß, wie man überprüft, ob ein Punkt in einem Polygon enthalten ist, aber wie kann ich dem nächsten Polygon Punkte zuweisen?

## Make some example data 
set.seed(1) 
library(raster) 
library(rgdal) 
library(rgeos) 
p <- shapefile(system.file("external/lux.shp", package="raster")) 
p2 <- as(1.5*extent(p), "SpatialPolygons") 
proj4string(p2) <- proj4string(p) 
pts <- spsample(p2-p, n=10, type="random") 

## Plot to visualize 
plot(pts, pch=16, cex=.5,col="red") 
plot(p, col=colorRampPalette(blues9)(12), add=TRUE) 

enter image description here

+4

Zuerst Sie einen Code und Daten, bringen .... wir es dann zu beheben. –

+1

Siehe [Erstellen eines reproduzierbaren Beispiels] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), um die Beantwortung Ihrer Frage – MrFlick

+0

zu erleichtern Ich bin nicht sicher, wie es geht, da dies kein Fehler ist und ich keine Erlaubnis habe, meine Daten zu veröffentlichen. Ich werde versuchen, einige Daten zu erstellen. – Kiefer

Antwort

14

Hier ist eine Antwort, die einen Ansatz auf, dass durch mdsumner von einigen Jahren in this excellent answer Rückseite beschrieben Basis verwendet.

Eine wichtige Anmerkung (hinzugefügt als EDIT am 2015.02.08): rgeos, der hier verwendet wird, Abstände zu berechnen, erwartet, dass die Geometrien, auf das es in planarer Koordinaten projiziert werden arbeitet. Für diese Beispieldaten bedeutet das, dass sie zuerst in UTM-Koordinaten (oder eine andere planare Projektion) transformiert werden sollten. Wenn Sie den Fehler machen, die Daten in ihren ursprünglichen Koordinaten zu belassen, sind die berechneten Abstände inkorrekt, da sie Breitengrade und Längengrade als gleich lang behandelt haben.

library(rgeos) 

## First project data into a planar coordinate system (here UTM zone 32) 
utmStr <- "+proj=utm +zone=%d +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0" 
crs <- CRS(sprintf(utmStr, 32)) 
pUTM <- spTransform(p, crs) 
ptsUTM <- spTransform(pts, crs) 

## Set up container for results 
n <- length(ptsUTM) 
nearestCantons <- character(n) 

## For each point, find name of nearest polygon (in this case, Belgian cantons) 
for (i in seq_along(nearestCantons)) { 
    nearestCantons[i] <- pUTM$NAME_2[which.min(gDistance(ptsUTM[i,], pUTM, byid=TRUE))] 
} 

## Check that it worked 
nearestCantons 
# [1] "Wiltz"   "Echternach"  "Remich"   "Clervaux"   
# [5] "Echternach"  "Clervaux"   "Redange"   "Remich"   
# [9] "Esch-sur-Alzette" "Remich" 

plot(pts, pch=16, col="red") 
text(pts, 1:10, pos=3) 
plot(p, add=TRUE) 
text(p, p$NAME_2, cex=0.7) 

enter image description here

+0

Es hat eine Weile gedauert, um zu laufen, da ich viele Daten habe, und es funktionierte einwandfrei! Ich kann dir nicht genug danken, Josh. Tolle. – Kiefer

+0

@Lucho - Froh, das zu hören! Wenn es Ihnen nichts ausmacht, zu teilen, ungefähr wie viele Punkte und Polygone haben Sie verarbeitet und wie lange hat es gedauert? –

+0

Ich habe immer noch nicht alles verarbeitet, was ich brauche. Ich habe ungefähr 100.000 Punkte und 1.000 Polygone verarbeitet, was ungefähr 1% von dem entspricht, was ich tun muss. Es dauerte ungefähr 30 Minuten. – Kiefer

Verwandte Themen