作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用世界的球形性质(不是它的投影)制作带有 voronoi 镶嵌的世界地图,类似于 this using D3.js ,但与 R。
据我了解(“Goodbye flat Earth, welcome S2 spherical geometry”)sf
软件包现在完全基于 s2
包,应该按照我的需要执行。但我不认为我得到了预期的结果。一个可重现的例子:
library(tidyverse)
library(sf)
library(rnaturalearth)
library(tidygeocoder)
# just to be sure
sf::sf_use_s2(TRUE)
# download map
world_map <- rnaturalearth::ne_countries(
scale = 'small',
type = 'map_units',
returnclass = 'sf')
# addresses that you want to find lat long and to become centroids of the voronoi tessellation
addresses <- tribble(
~addr,
"Juneau, Alaska" ,
"Saint Petersburg, Russia" ,
"Melbourne, Australia"
)
# retrive lat long using tidygeocoder
points <- addresses %>%
tidygeocoder::geocode(addr, method = 'osm')
# Transform lat long in a single geometry point and join with sf-base of the world
points <- points %>%
dplyr::rowwise() %>%
dplyr::mutate(point = list(sf::st_point(c(long, lat)))) %>%
sf::st_as_sf() %>%
sf::st_set_crs(4326)
# voronoi tessellation
voronoi <- sf::st_voronoi(sf::st_union( points ) ) %>%
sf::st_as_sf() %>%
sf::st_set_crs(4326)
# plot
ggplot2::ggplot() +
geom_sf(data = world_map,
mapping = aes(geometry = geometry),
fill = "gray95") +
geom_sf(data = points,
mapping = aes(geometry = point),
colour = "red") +
geom_sf(data = voronoi,
mapping = aes(geometry = x),
colour = "red",
alpha = 0.5)
sf
计算球体上的 voronoi ?
最佳答案
(这个答案没有告诉你怎么做,但确实告诉你出了什么问题。)
当我运行这段代码时,我得到了
Warning message:In st_voronoi.sfc(sf::st_union(points)) :st_voronoi does not correctly triangulate longitude/latitude data
sf
格式导出到 Python 需要的任何格式,然后将结果重新导入适当的
sf
格式...)
sf:::st_voronoi.sfc
的代码:
function (x, envelope = st_polygon(), dTolerance = 0, bOnlyEdges = FALSE)
{
if (compareVersion(CPL_geos_version(), "3.5.0") > -1) {
if (isTRUE(st_is_longlat(x)))
warning("st_voronoi does not correctly triangulate longitude/latitude data")
st_sfc(CPL_geos_voronoi(x, st_sfc(envelope), dTolerance = dTolerance,
bOnlyEdges = as.integer(bOnlyEdges)))
}
else stop("for voronoi, GEOS version 3.5.0 or higher is required")
}
换句话说,如果 GEOS 版本低于 3.5.0,则操作完全失败。如果 >= 3.5.0(
sf:::CPL_geos_version()
报告我有 3.8.1 版),并且正在使用长纬度数据,则警告为
假设 将被发布(但无论如何计算已经完成)。
options("warn")
被设置为 -1(抑制警告)。我不知道为什么 - 从干净的 session 中运行确实给了我警告。也许管道中的某些东西(例如
rnaturalearth
告诉我我需要安装
rnaturalearthdata
包)不小心设置了该选项?
关于r - 如何使用 sf 真正计算球形 voronoi 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68324079/
我找到了以下 answer在 Stackoverflow 上。 据我了解,这不是正确的做法。数学是线性的,但是,坐标映射到球面。那么正确的做法是什么? 我有一个计算中点的函数,如何修改它以接受百分比作
我是一名优秀的程序员,十分优秀!