映射 R 中每个位置的半径内有多少点
Mapping how many points are within a radius of every location in R
在 R 中,我正在尝试创建等值线图。我建立了一个企业数据库,有些是连锁店的一部分(例如麦当劳),有些是独立的。我想计算地图上每个点 30 公里范围内有多少家企业,但将连锁店的不同位置视为单个企业。
例如,如果你的一个点是:
- 距麦当劳 5 公里,
- 距塔可钟 10 公里
- 距 Chick-Fil-A 15 公里
- 距肯德基 20 公里
- 距麦当劳 25 公里
- 距五个人 35 公里
颜色会显示30公里范围内有4家快餐店。
我很乐意使用任何 R 包,但我最熟悉的是 tmaps 和 ggplot2 地图。
在这个阶段,我能想到的最佳方法是为每个链创建多边形并将它们堆叠为相同颜色的透明层。我不认为这会非常有效,也不会创建一个非常漂亮的等值线。
我能找到的其他答案是计数点(例如 https://gis.stackexchange.com/questions/229066/counting-how-many-times-a-point-is-inside-a-set-of-intersecting-polygons-in-r)或 GIS 软件。
编辑:
我设法从每条链的每个位置创建了一个 30 公里的半径(使用 rgeos gIntersection)。我现在有一系列的多边形。
要解决我的问题,我需要做的额外事情是为以下位置创建多边形:
- 只有一个多边形覆盖该区域,
- 两个多边形覆盖该区域,
- 等等
为了尝试视觉化,我使用了来自 https://gis.stackexchange.com/questions/229066/counting-how-many-times-a-point-is-inside-a-set-of-intersecting-polygons-in-r
的答案
在链接的问题中,他们试图计算有多少多边形覆盖了编号点(右图)。我想要做的是在左侧创建图像,其中有不重叠的多边形 (1)、两个重叠的多边形 (2) 等等。
我认为最好使用栅格方法而不是叶绿素来解决您要完成的任务。要制作一个 chorlopleth,您可以定义一组(通常是不规则的)多边形,在每个多边形中总结一些东西,然后根据属性为多边形着色。如果您想说每个州或县内有多少家快餐店,或者每个州的人均快餐店数量,这将是一个很好的方法。
但是,根据您的描述,您正在寻找所有点在设定半径内有多少快餐店。这更像是一个栅格问题,因为您可以在规则网格上表示您的数据。
raster
包是处理栅格数据的良好开端,并且与 sf
包配合使用效果很好。
您需要确定实现目标所需的密度,然后使用它来确定光栅的分辨率。一旦你得到了你可以使用 raster::rasterize() 来总结你的(我假设)点数据。
我假设您有一个包含每家餐厅位置的对象,我将称这个对象为“点”。
library(raster)
library(sf)
# create raster template with 30km resolution (I'm assuming your projection is in meters)
raster_template = raster((extent(points),
resolution = 30000,
crs = st_crs(points)
)
# rasterize your point data
r = rasterize(points, raster_template, fun = "count")
这应该创建一个网格,其中每个单元格在每个 30 公里单元格内都有点数。然后您应该能够绘制光栅,但可能想要对其进行裁剪或遮罩以仅显示新西兰境内的部分
在 R 中,我正在尝试创建等值线图。我建立了一个企业数据库,有些是连锁店的一部分(例如麦当劳),有些是独立的。我想计算地图上每个点 30 公里范围内有多少家企业,但将连锁店的不同位置视为单个企业。
例如,如果你的一个点是:
- 距麦当劳 5 公里,
- 距塔可钟 10 公里
- 距 Chick-Fil-A 15 公里
- 距肯德基 20 公里
- 距麦当劳 25 公里
- 距五个人 35 公里
颜色会显示30公里范围内有4家快餐店。
我很乐意使用任何 R 包,但我最熟悉的是 tmaps 和 ggplot2 地图。
在这个阶段,我能想到的最佳方法是为每个链创建多边形并将它们堆叠为相同颜色的透明层。我不认为这会非常有效,也不会创建一个非常漂亮的等值线。
我能找到的其他答案是计数点(例如 https://gis.stackexchange.com/questions/229066/counting-how-many-times-a-point-is-inside-a-set-of-intersecting-polygons-in-r)或 GIS 软件。
编辑: 我设法从每条链的每个位置创建了一个 30 公里的半径(使用 rgeos gIntersection)。我现在有一系列的多边形。
要解决我的问题,我需要做的额外事情是为以下位置创建多边形:
- 只有一个多边形覆盖该区域,
- 两个多边形覆盖该区域,
- 等等
为了尝试视觉化,我使用了来自 https://gis.stackexchange.com/questions/229066/counting-how-many-times-a-point-is-inside-a-set-of-intersecting-polygons-in-r
的答案在链接的问题中,他们试图计算有多少多边形覆盖了编号点(右图)。我想要做的是在左侧创建图像,其中有不重叠的多边形 (1)、两个重叠的多边形 (2) 等等。
我认为最好使用栅格方法而不是叶绿素来解决您要完成的任务。要制作一个 chorlopleth,您可以定义一组(通常是不规则的)多边形,在每个多边形中总结一些东西,然后根据属性为多边形着色。如果您想说每个州或县内有多少家快餐店,或者每个州的人均快餐店数量,这将是一个很好的方法。
但是,根据您的描述,您正在寻找所有点在设定半径内有多少快餐店。这更像是一个栅格问题,因为您可以在规则网格上表示您的数据。
raster
包是处理栅格数据的良好开端,并且与 sf
包配合使用效果很好。
您需要确定实现目标所需的密度,然后使用它来确定光栅的分辨率。一旦你得到了你可以使用 raster::rasterize() 来总结你的(我假设)点数据。
我假设您有一个包含每家餐厅位置的对象,我将称这个对象为“点”。
library(raster)
library(sf)
# create raster template with 30km resolution (I'm assuming your projection is in meters)
raster_template = raster((extent(points),
resolution = 30000,
crs = st_crs(points)
)
# rasterize your point data
r = rasterize(points, raster_template, fun = "count")
这应该创建一个网格,其中每个单元格在每个 30 公里单元格内都有点数。然后您应该能够绘制光栅,但可能想要对其进行裁剪或遮罩以仅显示新西兰境内的部分