2014-10-10 22 views
5

Tôi có khung dữ liệu điểm không gian và khung dữ liệu đa giác không gian. Ví dụ: đa giác của tôi sẽ là đa giác cho mỗi khối ở Manhattan. Và các điểm là những người, nằm rải rác khắp nơi, đôi khi rơi vào giữa một con phố, mà không phải là một phần của một đa giác.Làm cách nào để tìm đa giác gần nhất với một điểm trong R?

Tôi biết cách kiểm tra xem một điểm có được chứa bên trong đa giác hay không, nhưng làm cách nào tôi có thể gán điểm cho đa giác gần nhất?

## 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

Trước tiên, bạn mang lại một số mã và dữ liệu, .... sau đó chúng tôi sửa chữa nó. –

+1

Xem [cách tạo ví dụ có thể tái tạo] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) để giúp chúng tôi trả lời câu hỏi của bạn dễ dàng hơn – MrFlick

+0

Tôi không chắc chắn cách thực hiện vì đây không thực sự là lỗi và tôi không có quyền xuất bản dữ liệu của mình. Tôi sẽ cố tạo một số dữ liệu. – Kiefer

Trả lời

14

Dưới đây là một câu trả lời có sử dụng một cách tiếp cận dựa trên mô tả bởi mdsumner trong this excellent answer từ một vài năm trở lại.

Một lưu ý quan trọng (thêm vào như là một EDIT trên 2015/02/08): rgeos, mà là ở đây sử dụng để tính toán khoảng cách, hy vọng rằng hình học mà trên đó nó hoạt động sẽ được chiếu ở tọa độ phẳng. Đối với các dữ liệu ví dụ này, điều đó có nghĩa là chúng phải được chuyển thành các tọa độ UTM đầu tiên (hoặc một số phép chiếu phẳng khác). Nếu bạn phạm sai lầm khi để lại dữ liệu trong các tọa độ dài ban đầu của chúng, khoảng cách tính toán sẽ không chính xác, vì chúng sẽ có độ vĩ độ và kinh độ được coi là có độ dài bằng nhau.

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

Mất một lúc để chạy vì tôi có nhiều dữ liệu và nó hoạt động hoàn hảo! Không thể cảm ơn đủ, Josh. Kinh ngạc. – Kiefer

+0

@Lucho - Rất vui khi biết điều đó! Nếu bạn không nhớ chia sẻ, khoảng bao nhiêu điểm và đa giác bạn đã xử lý, và mất bao lâu? –

+0

Tôi vẫn chưa xử lý tất cả những gì tôi cần. Tôi đã xử lý khoảng 100.000 điểm và 1000 đa giác, khoảng 1% những gì tôi phải làm. Mất khoảng 30 phút. – Kiefer

Các vấn đề liên quan