r - R:使用 maptools::elide 缩放阿拉斯加
问题描述
我正在建立一个形状文件,其中阿拉斯加和夏威夷被表示为德克萨斯州南部的某个地方,以便于制作说明性地图。使用 maptools 包和来自 https://rud.is/b/2014/11/16/moving-the-earth-well-alaska-hawaii-with-r/的一些代码,我已经能够使用来自老虎。
但是,现在我想将城市添加到我的地图中,我遇到了麻烦。将我的形状制作成 sp 对象,然后使用 maptools::elide 以前在阿拉斯加工作得很好,但是具有比例的 elide 在点集合上的工作方式不同,所以我的城市最终出现在错误的地方:
library(maptools)
library(sf)
library(tmap)
library(tidyverse)
library(tidygeocoder)
ak_city_sf <-
tribble(~city_name, ~city_search_string,
"Juneau", "Juneau, Alaska, United States",
"Anchorage", "Anchorage, Alaska, United States",
"Utqiagvik", "Utqiagvik, Alaska, United States",
"Scammon Bay", "Scammon Bay, Alaska, United States") %>%
geocode(city_search_string, method = 'osm', lat = latitude , long = longitude) %>%
st_as_sf(coords = c("longitude","latitude"))
st_crs(ak_city_sf) <- 4326
ak_city_sf <-
ak_city_sf %>%
st_transform(2163)
ak_state_sf <-
tigris::states(cb = T) %>%
filter(STUSPS == "AK") %>%
st_transform(2163)
# before transformation, everything looks fine...
tm_shape(ak_state_sf) +
tm_borders() +
tm_shape(ak_city_sf) +
tm_dots(size = .1) +
tm_text("city_name",
size = .5)
SCALE_FACTOR <- 10000
ak_state_sf_scaled <-
ak_state_sf %>%
as("Spatial") %>%
elide(scale = SCALE_FACTOR) %>%
st_as_sf()
st_crs(ak_state_sf_scaled) <- 2163
ak_city_sf_scaled <-
ak_city_sf %>%
as("Spatial") %>%
elide(scale = SCALE_FACTOR) %>%
st_as_sf()
st_crs(ak_city_sf_scaled) <- 2163
# after scaling, things don't look so good
tm_shape(ak_state_sf_scaled) +
tm_borders() +
tm_shape(ak_city_sf_scaled) +
tm_dots(size = .1) +
tm_text("city_name",
size = .5)
maptools::elide 似乎是执行此类操作的最佳命令(即使它强制我转换为 sp 对象)。scale 的文档对我来说意义不大。(我认为我不能将它们组合成一个对象,因为它们是城市的点和州的多面体)。如何以与缩放状态相同的方式缩放点?
解决方案
要缩放或旋转两个单独的几何图形以便将它们映射在一起,有必要定义一个质心,您的州几何图形和城市几何图形都将围绕该质心进行旋转或缩放。这具有一定的逻辑意义,因为除非您(隐式或显式)定义缩放或旋转的中心,否则无法缩放或旋转一组点(在这种情况下代表城市)。
一旦你定义了一个公共质心(在我的例子中,我只是使用了我正在转换的状态的质心),你可以使用这里显示的仿射变换: https ://geocompr.robinlovelace.net/geometric-operations.html #仿射变换。
推荐阅读
- android - Retrofit 2.4.0 将所有参数转换为零
- asp.net-web-api2 - 在 webapi 中使用 Url 下载 SSRS 报告
- javascript - 如何使用 DataTables 和 jQuery 触发行点击事件
- postgresql - SELECT * 禁止访问某些列时
- javascript - 值返回 NaN
- postgresql - 如何配置 postgresql 以在不同位置查找配置文件?
- reactjs - React 组件伪装成函数
- javascript - 使用逗号在 #react-select 上创建一个新标签
- refactoring - JetBrains 使用缩进注释代码块的设置
- c - 如何在程序运行时通过终端获取用户输入?