如何找到最接近R中点的多边形? [英] How do I find the polygon nearest to a point in R?

查看:92
本文介绍了如何找到最接近R中点的多边形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个空间点数据框和一个空间多边形数据框.例如,我的多边形将是曼哈顿中每个街区的多边形.这些点是分散在各处的人,有时落在不属于多边形一部分的街道中间.

I have a spatial points data frame and a spatial polygons data frame. For example, my polygons would be a polygon for each block in Manhattan. And the points are people, which are scattered all over, sometimes falling in the middle of a street, which is not part of a polygon.

我知道如何检查多边形中是否包含点,但是如何将点分配给它们最近的多边形?

I know how to check if a point is contained inside a polygon, but how could I assign points to their closest polygon?

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

推荐答案

以下是使用mdsumner在

Here's an answer that uses an approach based on that described by mdsumner in this excellent answer from a few years back.

一个重要说明(在2015年2月8日添加为 EDIT 编辑): rgeos (此处用于计算距离)期望其几何形状操作将以平面坐标投影.对于这些示例数据,这意味着它们应该首先转换为UTM坐标(或其他平面投影).如果您错误地将数据保留在其原始的经纬度坐标中,则计算出的距离将是不正确的,因为它们将纬度和经度视为具有相等的长度.

One important note (added as an EDIT on 2/8/2015): rgeos, which is here used to compute distances, expects that the geometries on which it operates will be projected in planar coordinates. For these example data, that means that they should be first transformed into UTM coordinates (or some other planar projection). If you make the mistake of leaving the data in their original lat-long coordinates, the computed distances will be incorrect, as they will have treated degrees of latitude and longitude as having equal lengths.

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)

这篇关于如何找到最接近R中点的多边形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆