簡體   English   中英

在 R 中圍繞坐標繪制多邊形

[英]Draw polygons around coordinates in R

我有來自不同地理區域收集的不同數據集的點集群。 我想在地圖上繪制每個區域的空間范圍,為此我需要每個區域一個多邊形。 我可以通過“連接點”找到將點轉換為多邊形的命令,但沒有通過繪制輪廓(幾何方法不是非常重要,因為這僅用於繪圖)。 這是一個 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)

對於對象dat ,我想在每個region的點周圍生成一個簡單的多邊形,如果可能的話使用 sf 。 (我不太擔心弄清楚如何迭代區域,但我什至不知道如何圍繞一組點繪制多邊形!)

library(sf)
library(dplyr)

hulls <- dat %>%
  st_as_sf(coords = c("lon", "lat")) %>%
  group_by(region) %>%
  summarize(geometry = st_union(geometry)) %>%
  st_convex_hull()
plot(hulls)

在此處輸入圖片說明

一種使用sf進行“地理計算”、 tmaptmaptools進行可視化的方法。

請找到以下reprex。

正品

library(sf)
library(tmap)
library(tmaptools)

sf_use_s2(TRUE)
  • nor_datus_datak_datdat轉換為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"))

  • 最后,如果你想要一些上下文背景,你可以使用調用leaflettmap_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

reprex 包(v2.0.1) 於 2021 年 10 月 20 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM