我有社区的 shapefile 边界。我如何确定一个点位于哪些边界内?
I have shapefile boundaries of neighborhoods. How do I identify which boundaries a point lies within?
我正在处理一些地理数据,查看波士顿街区的边界,并试图确定哪些街区获得了某些建筑许可。
到目前为止我已经:
- 读入 shapefile 并使用 maptools 包中的 readshapePoly 将其转换为经纬度数据框。
- 将名称与每个社区边界相关联 - 布莱顿、唐人街等
long lat order hole piece id group name
1 -71.12593 42.27201 1 FALSE 1 0 0.1 Roslindale
2 -71.12575 42.27235 2 FALSE 1 0 0.1 Roslindale
3 -71.12566 42.27248 3 FALSE 1 0 0.1 Roslindale
4 -71.12555 42.27258 4 FALSE 1 0 0.1 Roslindale
5 -71.12573 42.27249 5 FALSE 1 0 0.1 Roslindale
6 -71.12638 42.27217 6 FALSE 1 0 0.1 Roslindale
7 -71.12652 42.27210 7 FALSE 1 0 0.1 Roslindale
8 -71.12660 42.27218 8 FALSE 1 0 0.1 Roslindale
9 -71.12666 42.27224 9 FALSE 1 0 0.1 Roslindale
10 -71.12691 42.27210 10 FALSE 1 0 0.1 Roslindale
11 -71.12726 42.27200 11 FALSE 1 0 0.1 Roslindale
12 -71.12740 42.27196 12 FALSE 1 0 0.1 Roslindale
....
- 为我的所有建筑许可生成了一长串纬度和经度 - 这最初不是一个 shapefile,这意味着我不知道我是否可以使用 "sf"[=30= 叠加这两个集合]
Latitude Longitude
<dbl> <dbl>
1 42.3 -71.1
2 0 0
3 42.4 -71.1
4 42.3 -71.1
5 42.4 -71.1
6 42.4 -71.1
7 42.4 -71.1
8 42.4 -71.1
9 0 0
10 42.4 -71.1
我的问题是我有所有这些建筑许可证,但他们没有相关的社区,这正是我想研究的。从概念上讲,我知道我想做这样的事情:
- 使用步骤 1 和 2 中的多边形确定每个坐标所在的多边形
- 使用第一步中的标识将多边形 "name" 附加到坐标邻域。
这可以使用 sf
包来完成。假设您将点和多边形存储为 shapefile,您可以执行以下操作:
library('sf')
polygonSF <- read_sf(dsn = 'polygonShapeFile')
pointSF <- read_sf(dsn = 'pointShapeFile')
st_intersection(pointSF, polygonSF)
如果它们还不是形状文件,则需要几个中间步骤。
例如,假设点(您的示例中的许可证)存储在具有纬度和经度列的数据框 (pointDF
) 中。您需要将数据框转换为 shapefile,然后告诉 R
为您的点使用与用于多边形边界相同的坐标参考系统 (CRS):
pointSF <- st_as_sf(x = pointDF,
coords = c("longitude", "latitude"),
crs = "+init=epsg:4326")
pointSF <- st_transform(pointSF, crs = st_crs(poloygonSF))
我正在处理一些地理数据,查看波士顿街区的边界,并试图确定哪些街区获得了某些建筑许可。
到目前为止我已经:
- 读入 shapefile 并使用 maptools 包中的 readshapePoly 将其转换为经纬度数据框。
- 将名称与每个社区边界相关联 - 布莱顿、唐人街等
long lat order hole piece id group name 1 -71.12593 42.27201 1 FALSE 1 0 0.1 Roslindale 2 -71.12575 42.27235 2 FALSE 1 0 0.1 Roslindale 3 -71.12566 42.27248 3 FALSE 1 0 0.1 Roslindale 4 -71.12555 42.27258 4 FALSE 1 0 0.1 Roslindale 5 -71.12573 42.27249 5 FALSE 1 0 0.1 Roslindale 6 -71.12638 42.27217 6 FALSE 1 0 0.1 Roslindale 7 -71.12652 42.27210 7 FALSE 1 0 0.1 Roslindale 8 -71.12660 42.27218 8 FALSE 1 0 0.1 Roslindale 9 -71.12666 42.27224 9 FALSE 1 0 0.1 Roslindale 10 -71.12691 42.27210 10 FALSE 1 0 0.1 Roslindale 11 -71.12726 42.27200 11 FALSE 1 0 0.1 Roslindale 12 -71.12740 42.27196 12 FALSE 1 0 0.1 Roslindale
....
- 为我的所有建筑许可生成了一长串纬度和经度 - 这最初不是一个 shapefile,这意味着我不知道我是否可以使用 "sf"[=30= 叠加这两个集合]
Latitude Longitude <dbl> <dbl> 1 42.3 -71.1 2 0 0 3 42.4 -71.1 4 42.3 -71.1 5 42.4 -71.1 6 42.4 -71.1 7 42.4 -71.1 8 42.4 -71.1 9 0 0 10 42.4 -71.1
我的问题是我有所有这些建筑许可证,但他们没有相关的社区,这正是我想研究的。从概念上讲,我知道我想做这样的事情:
- 使用步骤 1 和 2 中的多边形确定每个坐标所在的多边形
- 使用第一步中的标识将多边形 "name" 附加到坐标邻域。
这可以使用 sf
包来完成。假设您将点和多边形存储为 shapefile,您可以执行以下操作:
library('sf')
polygonSF <- read_sf(dsn = 'polygonShapeFile')
pointSF <- read_sf(dsn = 'pointShapeFile')
st_intersection(pointSF, polygonSF)
如果它们还不是形状文件,则需要几个中间步骤。
例如,假设点(您的示例中的许可证)存储在具有纬度和经度列的数据框 (pointDF
) 中。您需要将数据框转换为 shapefile,然后告诉 R
为您的点使用与用于多边形边界相同的坐标参考系统 (CRS):
pointSF <- st_as_sf(x = pointDF,
coords = c("longitude", "latitude"),
crs = "+init=epsg:4326")
pointSF <- st_transform(pointSF, crs = st_crs(poloygonSF))