R - 在栅格化的美国地图上找到距离点最远的点

时间:2016-07-07 19:23:45

标签: r gis geospatial r-raster rgdal

此处对R进行空间分析的新内容。我有一个我从HERE下载的美国shapefile。我还有一组位于相邻美国的纬度/长点(50万)。

我想找到最偏远的地方" - 连续美国境内距离点数最远的地方。

我正在使用rgdal,raster和sp包。这是一个可重复的例子,随机抽样为10分:

# Set wd to the folder tl_2010_us_state_10
usa <- readOGR(dsn = ".", layer = "tl_2010_us_state10")

# Sample 10 points in USA
sample <- spsample(usa, 10, type = "random")

# Set extent for contiguous united states
ext <- extent(-124.848974, -66.885444, 24.396308, 49.384358)

# Rasterize USA
r <- raster(ext, nrow = 500, ncol = 500)
rr <- rasterize(usa, r)

# Find distance from sample points to cells of USA raster
D <- distanceFromPoints(object = rr, xy = sample) 

# Plot distances and points
plot(D)
points(sample)

在最后两行代码之后,我得到了这个情节。

plot distances from points

然而,我希望它能够超越美国的栅格化地图。并且,我希望只考虑距离连续美国的细胞的距离,而不是边界框中的所有细胞。我该怎么做呢?

我也很欣赏有关我使用的形状文件的任何其他提示 - 它是最好的吗?我应该担心使用正确的投影,因为我的实际数据集是纬度/经度? distanceFromPoints能否有效地处理如此庞大的数据集,还是有更好的功能?

2 个答案:

答案 0 :(得分:1)

要将光栅D限制为连续的美国,您可以找到rr指定的NA值的元素(即在边界框内但在美国多边形之外的栅格单元格),并为这些相同的元素分配一个NA值。

D[which(is.na(rr[]))] <- NA

plot(D)
lines(usa)

您可以使用'proj4string(usa)'查找usa shapefile的投影信息。如果您感兴趣的坐标基于不同的投影,您可以将它们转换为匹配USA shapefile投影,如下所示:

my_coords_xform <- spTransform(my_coords, CRS(proj4string(usa)))

不确定distanceFromPoints的相对效率,但使用10分的示例在我的计算机上运行只需约1秒。

答案 1 :(得分:0)

我认为您正在寻找mask功能。

library(raster)
usa <- getData('GADM', country='USA', level=1)

# exclude Alaska and Hawaii
usa <- usa[!usa$NAME_1 %in% c( "Alaska" , "Hawaii"), ]

# get the extent and create raster with preferred resolution
r <- raster(floor(extent(usa)), res=1)
# rasterize polygons
rr <- rasterize(usa, r)

set.seed(89)
sample <- spsample(usa, 10, type = "random")

# Find distance from sample points to cells of USA raster
D <- distanceFromPoints(object = rr, xy = sample) 
# remove areas outside of polygons
Dm <- mask(D, rr)
# an alternative would be mask(D, usa)

# cell with highest value
mxd <- which.max(Dm)

# coordinates of that cell
pt <- xyFromCell(r, mxd)

plot(Dm)
points(pt)

当使用长/纬数据时,距离应该很好。但是rasterFromPoints对于大数据集确实有点慢,因为它使用强力算法。