如何使用R来将shapefile分割为200米的正方形/子多边形,
绘制此网格(包括下面原始地图的每个正方形的ID号),并
评估特定正方形的地理坐标所在的位置。
我是GIS的初学者,这也许是一个基本问题,但是我还没有在R中找到有关如何执行此操作的教程。
到目前为止,我所做的是加载NYC的shapefile并绘制一些示例性地理坐标。 />我正在寻找一个使用以下数据的示例(R代码)。
# Load packages
library(maptools)
# Download shapefile for NYC
# OLD URL (no longer working)
# shpurl <- "http://www.nyc.gov/html/dcp/download/bytes/nybb_13a.zip"
shpurl <- "https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nybb_13a.zip"
tmp <- tempfile(fileext=".zip")
download.file(shpurl, destfile=tmp)
files <- unzip(tmp, exdir=getwd())
# Load & plot shapefile
shp <- readShapePoly(files[grep(".shp$", files)])
plot(shp)
# Define coordinates
points_of_interest <- data.frame(y=c(919500, 959500, 1019500, 1049500, 1029500, 989500),
x =c(130600, 150600, 180600, 198000, 248000, 218000),
id =c("A"), stringsAsFactors=F)
# Plot coordinates
points(points_of_interest$y, points_of_interest$x, pch=19, col="red")
#1 楼
这是一个使用SpatialGrid
对象的示例:### read shapefile
library("rgdal")
shp <- readOGR("nybb_13a", "nybb")
proj4string(shp) # units us-ft
# [1] "+proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333
# +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +datum=NAD83
# +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0"
### define coordinates and convert to SpatialPointsDataFrame
poi <- data.frame(x=c(919500, 959500, 1019500, 1049500, 1029500, 989500),
y=c(130600, 150600, 180600, 198000, 248000, 218000),
id="A", stringsAsFactors=F)
coordinates(poi) <- ~ x + y
proj4string(poi) <- proj4string(shp)
### define SpatialGrid object
bb <- bbox(shp)
cs <- c(3.28084, 3.28084)*6000 # cell size 6km x 6km (for illustration)
# 1 ft = 3.28084 m
cc <- bb[, 1] + (cs/2) # cell offset
cd <- ceiling(diff(t(bb))/cs) # number of cells per direction
grd <- GridTopology(cellcentre.offset=cc, cellsize=cs, cells.dim=cd)
grd
# cellcentre.offset 923018 129964
# cellsize 19685 19685
# cells.dim 8 8
sp_grd <- SpatialGridDataFrame(grd,
data=data.frame(id=1:prod(cd)),
proj4string=CRS(proj4string(shp)))
summary(sp_grd)
# Object of class SpatialGridDataFrame
# Coordinates:
# min max
# x 913175 1070655
# y 120122 277602
# Is projected: TRUE
# ...
现在您可以使用已实现的
over
-方法获取单元格ID: 要绘制带有单元格ID的shapefile和网格,请执行以下操作:彩色键:
over(poi, sp_grd)
# id
# 1 57
# 2 51
# 3 38
# 4 39
# 5 14
# 6 28
评论
这看起来像是对我的答案,但是如果您正在寻找其他东西。尝试在stackoverflow stackoverflow.com/search?q=R+tag中使用r标签
–布拉德·尼索姆(Brad Nesom)
2014年3月14日在2:26
@rcs此代码看起来就像我要执行的操作,但是我的shapefile在不同的投影中:proj4string(DK_reg1)[1]“ + proj = longlat + datum = WGS84 + no_defs + ellps = WGS84 + towgs84 = 0,0 ,0“,关于将这个投影的shapefile分解为1000个相等大小的网格像元,是否有人有任何建议?然后随机选择其中100个并突出显示它们?
–我是德尔·托罗
2014年9月13日上午11:34
#2 楼
问题中提供的纽约数据集不再可供下载。我使用sf包中的nc数据集来演示使用sf包的解决方案:评论
谢谢。我更新了问题中的链接,以反映其网页上的更改。现在它应该可以再次工作。
– majom
15:18在18年5月18日标记
我真的需要开始使用sf包。这太棒了!
– philiporlando
18 Mar 23 '18 at 20:41
是否有一种简单的方法来仅绘制与状态多边形相交的网格单元?
– philiporlando
18 Mar 23 '18 at 22:09
st_intersection(grid_50,nc)应该这样做
–sebdalgarno
18 Mar 24 '18在23:18
有没有办法复制相同的东西,但是点在每个网格的中心,因此绘制的网格是以纬度/经度为网格的中心@sebdalgarno
– Vijay Ramesh
19年8月15日在17:58
#3 楼
如果您没有看过R栅格数据包,则它具有用于与矢量GIS对象之间进行转换的工具,因此您应该能够a)创建具有200x200m像元的栅格(网格),以及b)使用以下方法将其转换为一组多边形某种逻辑ID。从那里,我将看一下sp程序包,以帮助将点和多边形网格相交。此http://cran.r-project.org/web/packages/sp/vignettes/over.pdf页面可能是一个不错的开始。在sp包文档中徘徊,您也许可以从SpatialGrid类开始,而完全跳过栅格部分。#4 楼
“ GIS世界”很复杂,并且有许多必须符合您的数据标准。所有“ GIS工具”均按GIS标准进行互操作。今天(2014年)的所有“严重GIS数据”都存储在数据库中。在SQL环境中,与其他FOSS工具一起,在GIS上下文中“使用R”的最佳方法已嵌入。最好的工具是PostgreSQL 9.X(请参阅PL / R)和PostGIS。
您回答:
导入/导出形状文件:请使用
shp2pgsql
和pgsql2shp
。要“将形状文件分割为200米见方/子多边形”:请参见
ST_SnapToGrid()
和ST_AsRaster()
等。我们需要更好地了解您表达为“食谱”的需求。 >您说需要“定位地理坐标” ..也许ST_Centroid()
是正方形(?)...您可以表达“更多数学式”,所以我理解。任何栅格转换,仅是规则采样点的矩阵。一种原始方法是在通常的外部编译器中使用不带PL / R的R:仅转换多边形并将其导出为形状或为WKT(请参阅
ST_AsText
),然后使用awk或其他过滤器将数据转换为R格式。评论
谢谢你的帮助。但是,我强烈希望完全依赖R和现有软件包的解决方案。当我能够将形状文件分割为200m * 200m个子多边形时,可以使用point.in.polygon检查哪些坐标位于哪个多边形中。我的问题是在这些子多边形中拆分原始shapefile。
– majom
2014年9月9日在21:38
评论
另请参见stackoverflow.com/q/17801398/287948