如何将质心(标记)的数据分配给它所属的 voronoi/thiessen 多边形? (右)
How to assign the data of a centroid (marker) to the voronoi/thiessen polygon it belongs to? (R)
在自己的article Kyle Walker showed a method to make Voronoi Polygons in Leaflet. He drew Voronoi polygons around each starbucks coffeehouse in Fort Worth中借助于以下代码:
library(leaflet); library(rgeos)
library(rgdal); library(spatstat)
library(maptools)
starbucks <- read.csv('starbucks.csv')
fw <- subset(starbucks, City == 'Fort Worth')
coords <- cbind(fw$Longitude, fw$Latitude)
## Spatial points w/the WGS84 datum
sp_fw <- SpatialPointsDataFrame(coords = coords, data = fw,
proj4string = CRS("+proj=longlat +datum=WGS84"))
sp_fw_proj <- spTransform(sp_fw, CRS("+init=epsg:26914"))
fw_coords <- sp_fw_proj@coords
## Create the window for the polygons
window <- owin(range(fw_coords[,1]), range(fw_coords[,2]))
## Create the polygons
d <- dirichlet(as.ppp(fw_coords, window))
## Convert to a SpatialPolygonsDataFrame and calculate an "area" field.
dsp <- as(d, "SpatialPolygons")
dsp_df <- SpatialPolygonsDataFrame(dsp,
data = data.frame(id = 1:length(dsp@polygons)))
proj4string(dsp_df) <- CRS("+init=epsg:26914")
dsp_df$area <- round((gArea(dsp_df, byid = TRUE) / 1000000), 1)
dsp_xy <- spTransform(dsp_df, CRS("+proj=longlat +datum=WGS84"))
## Map it!
leaflet() %>%
addMarkers(data = fw,
lat = ~ Latitude,
lng = ~ Longitude,
popup = fw$Name) %>%
addPolygons(data = dsp_xy,
color = "green",
fill = "green",
popup = paste0("Area: ",
as.character(dsp_xy$area),
" square km")) %>%
addTiles()
我想在他的地图上添加一个额外的功能:我想为一个多边形指定一种特定的颜色。这种颜色取决于最近标记(质心)的特征。
例如,用星巴克质心 "green" 和邓肯甜甜圈质心 "purple" 为每个多边形着色。 (假设 starbucks.csv 还包括 Dunkin' Donuts 的坐标)
换句话说,我想将质心 ("fw") 的数据与其所属的多边形 ("dsp_xy") 的数据合并。
有人可以帮我解决这个问题吗?
dismo 包中的 voronoi
函数正是您所需要的。我还将使用这个 post 来演示 R 的新 sf 包。
让我们生成一个可复制的星巴克和邓肯甜甜圈位置的假数据集:
library(leaflet)
library(sf)
library(dismo)
library(sp)
set.seed(1983)
# Get some sample data
long <- sample(seq(-118.4, -118.2, 0.001), 50, replace = TRUE)
lat <- sample(seq(33.9, 34.1, 0.001), 50, replace = TRUE)
type <- sample(c("Starbucks", "Dunkin"), 50, replace = TRUE)
接下来,让我们根据我们的数据创建一个 sf
数据框,然后看一下:
points <- data.frame(long = long, lat = lat, type = type) %>%
st_as_sf(crs = 4326, coords = c("long", "lat"))
plot(points)
接下来,我们使用 dismo 包中的 voronoi
函数创建 Voronoi 多边形,这非常简单,然后为其赋予与我们的点相同的坐标系.在 real-world 工作流程中,您应该使用投影坐标系,但我将仅使用 WGS84(操作将假定为平面)进行说明。另请注意,我在 sf 和 sp 类 之间来回切换; R 世界将及时完全支持 sf,但在此期间强制转换是直截了当的。
polys <- points %>%
as("Spatial") %>%
voronoi() %>%
st_as_sf() %>%
st_set_crs(., 4326)
plot(polys)
现在,使用您想要的颜色使用 Leaflet 将其可视化:
pal <- colorFactor(c("purple", "green"), polys$type)
polys %>%
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(fillColor = ~pal(type), weight = 0.5, color = "grey") %>%
addCircleMarkers(data = points, label = ~type, color = ~pal(type))
我们在这里不需要它,但是 sf 中您还想知道的一个函数是 st_join
,它可以无缝处理空间连接并且适用于您最初提出的叠加层类型。
在自己的article Kyle Walker showed a method to make Voronoi Polygons in Leaflet. He drew Voronoi polygons around each starbucks coffeehouse in Fort Worth中借助于以下代码:
library(leaflet); library(rgeos)
library(rgdal); library(spatstat)
library(maptools)
starbucks <- read.csv('starbucks.csv')
fw <- subset(starbucks, City == 'Fort Worth')
coords <- cbind(fw$Longitude, fw$Latitude)
## Spatial points w/the WGS84 datum
sp_fw <- SpatialPointsDataFrame(coords = coords, data = fw,
proj4string = CRS("+proj=longlat +datum=WGS84"))
sp_fw_proj <- spTransform(sp_fw, CRS("+init=epsg:26914"))
fw_coords <- sp_fw_proj@coords
## Create the window for the polygons
window <- owin(range(fw_coords[,1]), range(fw_coords[,2]))
## Create the polygons
d <- dirichlet(as.ppp(fw_coords, window))
## Convert to a SpatialPolygonsDataFrame and calculate an "area" field.
dsp <- as(d, "SpatialPolygons")
dsp_df <- SpatialPolygonsDataFrame(dsp,
data = data.frame(id = 1:length(dsp@polygons)))
proj4string(dsp_df) <- CRS("+init=epsg:26914")
dsp_df$area <- round((gArea(dsp_df, byid = TRUE) / 1000000), 1)
dsp_xy <- spTransform(dsp_df, CRS("+proj=longlat +datum=WGS84"))
## Map it!
leaflet() %>%
addMarkers(data = fw,
lat = ~ Latitude,
lng = ~ Longitude,
popup = fw$Name) %>%
addPolygons(data = dsp_xy,
color = "green",
fill = "green",
popup = paste0("Area: ",
as.character(dsp_xy$area),
" square km")) %>%
addTiles()
我想在他的地图上添加一个额外的功能:我想为一个多边形指定一种特定的颜色。这种颜色取决于最近标记(质心)的特征。
例如,用星巴克质心 "green" 和邓肯甜甜圈质心 "purple" 为每个多边形着色。 (假设 starbucks.csv 还包括 Dunkin' Donuts 的坐标)
换句话说,我想将质心 ("fw") 的数据与其所属的多边形 ("dsp_xy") 的数据合并。
有人可以帮我解决这个问题吗?
dismo 包中的 voronoi
函数正是您所需要的。我还将使用这个 post 来演示 R 的新 sf 包。
让我们生成一个可复制的星巴克和邓肯甜甜圈位置的假数据集:
library(leaflet)
library(sf)
library(dismo)
library(sp)
set.seed(1983)
# Get some sample data
long <- sample(seq(-118.4, -118.2, 0.001), 50, replace = TRUE)
lat <- sample(seq(33.9, 34.1, 0.001), 50, replace = TRUE)
type <- sample(c("Starbucks", "Dunkin"), 50, replace = TRUE)
接下来,让我们根据我们的数据创建一个 sf
数据框,然后看一下:
points <- data.frame(long = long, lat = lat, type = type) %>%
st_as_sf(crs = 4326, coords = c("long", "lat"))
plot(points)
接下来,我们使用 dismo 包中的 voronoi
函数创建 Voronoi 多边形,这非常简单,然后为其赋予与我们的点相同的坐标系.在 real-world 工作流程中,您应该使用投影坐标系,但我将仅使用 WGS84(操作将假定为平面)进行说明。另请注意,我在 sf 和 sp 类 之间来回切换; R 世界将及时完全支持 sf,但在此期间强制转换是直截了当的。
polys <- points %>%
as("Spatial") %>%
voronoi() %>%
st_as_sf() %>%
st_set_crs(., 4326)
plot(polys)
现在,使用您想要的颜色使用 Leaflet 将其可视化:
pal <- colorFactor(c("purple", "green"), polys$type)
polys %>%
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(fillColor = ~pal(type), weight = 0.5, color = "grey") %>%
addCircleMarkers(data = points, label = ~type, color = ~pal(type))
我们在这里不需要它,但是 sf 中您还想知道的一个函数是 st_join
,它可以无缝处理空间连接并且适用于您最初提出的叠加层类型。