[英]Draw polygons around coordinates in R
I have clusters of points from different datasets collected in different geographical regions.我有来自不同地理区域收集的不同数据集的点集群。 I'd like to plot the spatial extent of each region on a map, for which I need a single polygon per region.我想在地图上绘制每个区域的空间范围,为此我需要每个区域一个多边形。 I can find commands to convert points to polygons by "connecting the dots", but none by drawing an outline (the geometric method isn't terribly important since this is just for plotting).我可以通过“连接点”找到将点转换为多边形的命令,但没有通过绘制轮廓(几何方法不是非常重要,因为这仅用于绘图)。 Here's a reprex to generate a simplified dataframe like the one I'm using, for points in Norway, Alaska, and the continental US:这是一个 reprex,用于生成像我正在使用的那样的简化数据框,用于挪威、阿拉斯加和美国大陆的点:
nor_lat <- c(72.117, 71.05, 71.717, 71.167, 71.817, 72.333, 71.25, 70.917,
70.85, 70.933)
nor_lon <- c(33.217, 30.333, 26.3, 22.333, 22.333, 22.333, 18.517, 20.133,
21.333, 19.917)
us_lat <- c(41.283333, 41, 40.95, 40.95, 38.683333, 40.783333, 40.733333,
40.516667, 38.566667, 41.266667)
us_lon <- c(-71.116667, -70.733333, -70.583333, -70.483333, -74.816667,
-70.5, -70.566667, -70.266667, -74.85, -71.366667)
ak_lat <- c(58.015, 57.67167, 57.33833, 56.685, 56.99333, 57.31667, 57.65,
57.99667, 58.32167, 58.33333)
ak_lon <- c(-158.31667, -158.36, -158.41, -159.76, -159.72333, -159.66333,
-159.64167, -159.605, -159.54, -160.72167)
nor_dat <- data.frame(lat=nor_lat, lon=nor_lon)
us_dat <- data.frame(lat=us_lat, lon=us_lon)
ak_dat <- data.frame(lat=ak_lat, lon=ak_lon)
nor_dat$region <- "nor"
us_dat$region <- "us"
ak_dat$region <- "ak"
dat <- rbind(nor_dat, us_dat, ak_dat)
For the object dat
, I'd like to generate a simple polygon around the points in each region
, using sf if possible.对于对象dat
,我想在每个region
的点周围生成一个简单的多边形,如果可能的话使用 sf 。 (I'm not too worried about figuring out how to iterate over the regions, but I can't even figure out how to draw a polygon around one set of points!) (我不太担心弄清楚如何迭代区域,但我什至不知道如何围绕一组点绘制多边形!)
One approach using sf
for "geocomputation", tmap
and tmaptools
for visualization.一种使用sf
进行“地理计算”、 tmap
和tmaptools
进行可视化的方法。
Please find the following reprex.请找到以下reprex。
Reprex正品
library(sf)
library(tmap)
library(tmaptools)
sf_use_s2(TRUE)
nor_dat
, us_dat
, ak_dat
and dat
into sf
object将nor_dat
、 us_dat
、 ak_dat
和dat
转换为sf
对象nor_sf <- st_as_sf(nor_dat, coords = c("lon", "lat"), crs = 4326)
us_sf <- st_as_sf(us_dat, coords = c("lon", "lat"), crs = 4326)
ak_sf <- st_as_sf(ak_dat, coords = c("lon", "lat"), crs = 4326)
dat_sf <- st_as_sf(dat, coords = c("lon", "lat"), crs = 4326)
conv_nor <- st_simplify(st_buffer(st_convex_hull(st_union(st_geometry(nor_sf))), dist = 15000), dTolerance = 5000)
conv_us <- st_simplify(st_buffer(st_convex_hull(st_union(st_geometry(us_sf))), dist = 15000), dTolerance = 5000)
conv_ak <- st_simplify(st_buffer(st_convex_hull(st_union(st_geometry(ak_sf))), dist = 15000), dTolerance = 5000)
tm_shape(dat_sf)+
tm_dots(size = 0.2, col = "black", shape = 21, alpha = 0.3)+
tm_shape(conv_nor)+
tm_borders(col = "gray", lwd = 2)+
tm_shape(conv_us)+
tm_borders(col = "blue", lwd = 2)+
tm_shape(conv_ak)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE)
tm_shape(nor_sf, bbox = bb(conv_nor, ext = 1))+
tm_dots(size = 0.5, alpha = 0.5)+
tm_shape(conv_nor)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE, title = "'nor' area",
title.size = 1.5, title.position = c(0.85, "bottom"))
tm_shape(us_sf, bbox = bb(conv_us, ext = 1))+
tm_dots(size = 0.5, alpha = 0.5)+
tm_shape(conv_us)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE, title = "'us' area",
title.size = 1.5, title.position = c(0., "top"))
tm_shape(ak_sf, bbox = bb(conv_ak, ext = 1))+
tm_dots(size = 0.5, alpha = 0.5)+
tm_shape(conv_ak)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE, title = "'ak' area",
title.size = 1.5, title.position = c(0.75, "top"))
tmap_mode("view")
which call leaflet
- apparently you work on the marine environment ;-)最后,如果你想要一些上下文背景,你可以使用调用leaflet
的tmap_mode("view")
- 显然你在海洋环境工作;-)tmap_mode("view")
#> tmap mode set to interactive viewing
tm_shape(nor_sf, bbox = bb(conv_nor, ext = 1))+
tm_dots(size = 0.5, alpha = 0.5)+
tm_shape(conv_nor)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE, title = "'nor' area",
title.size = 1.5, title.position = c(0.85, "bottom"))
tm_shape(us_sf, bbox = bb(conv_us, ext = 1))+
tm_dots(size = 0.5, alpha = 0.5)+
tm_shape(conv_us)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE, title = "'us' area",
title.size = 1.5, title.position = c(0., "top"))
tm_shape(ak_sf, bbox = bb(conv_ak, ext = 1))+
tm_dots(size = 0.5, alpha = 0.5)+
tm_shape(conv_ak)+
tm_borders(col = "gray", lwd = 2)+
tm_layout(frame = FALSE, title = "'ak' area",
title.size = 1.5, title.position = c(0.75, "top"))
tmap_mode("plot")
#> tmap mode set to plotting
Created on 2021-10-20 by the reprex package (v2.0.1)由reprex 包(v2.0.1) 于 2021 年 10 月 20 日创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.