如何使用R和tmap包Map半径为10km的气泡地址

kpbwa7wx  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(133)

我有一个圣地亚哥县的地址列表。我需要用R在Map上标出这些地址,并在每个地址周围画出10英里的半径。
使用tmap和tmaptools包将地址Map为点非常容易,但我不知道如何在每个位置周围画出10英里的半径。
使用tm_shape和tm_dots,我添加了size = 0.9。所以我可以画一个圆,但我需要它是一个10英里的半径。我找不到任何方法来使用tmap和tmap_tools。
有人知道如何在tm_dot周围绘制指定英里半径的Map吗?
这是我的R代码:

# Install packages ----
install.packages("tmap")
install.packages("tmaptools")
install.packages("readr")

# Load packages ----

library(tmap) # for making maps
library(tmaptools) # for the geocoding function
library(readr) # for reading in the csv file

# Import data ----

network_locations <- read_csv("clean_network_locations.csv")

# Geocoding addresses ----

coords3 <- geocode_OSM(q = network_locations$fullAddress, projection = 4326, as.sf = TRUE)

# Make map ----

tmap_mode("view")

#tm_shape with size
tm_shape(shp = coords3) +
  tm_dots(title=NA, legend.show=FALSE, size=0.9, id="", alpha=0.5)
axr492tv

axr492tv1#

您可以使用sf::st_buffer()在点周围创建10英里的缓冲区,然后将其作为单独的层添加到tmap

library(sf)
#> Linking to GEOS 3.9.3, GDAL 3.5.2, PROJ 8.2.1; sf_use_s2() is TRUE
library(dplyr)
library(tmap)

# generating points from example dataset
coords3 <- st_read(system.file("shape/nc.shp", package="sf")) %>% 
  select(NAME) %>% 
  st_transform(4326) %>% 
  st_centroid()

# 10 mile buffers around points in coords3
buffers <- st_buffer(coords3, dist = units::set_units(10, mile))

tm_shape(shp = buffers) +
  tm_polygons(alpha = 0.5) +
  tm_shape(shp = coords3) +
  tm_dots(title=NA, legend.show=FALSE, size=0.2, id="", alpha=0.5)

创建于2023-03-24使用reprex v2.0.2

dfty9e19

dfty9e192#

可能有一种方法可以直接在tmap中实现这一点,但我会使用sf创建缓冲区,然后将这些缓冲区绘制为点下方的单独层。如下所示:

library(sf)
library(tmap)

# create fake sample data
locations <- structure(list(query = c("82 Smith St, Providence, RI 02903", 
                         "194 Bellevue Ave, Newport, RI 02840", "24 Beacon St, Boston, MA 02133"
), lat = c(41.83089555, 41.4827777, 42.3326745972259), lon = c(-71.4149586644758, 
                                                               -71.3083749, -71.1593767838114)), row.names = c(NA, -3L), class = "data.frame")

# convert the data to a sf object
random_points_sf <- st_as_sf(locations, coords = c("lon","lat"), crs= 4326)

下面是如何制作10英里缓冲区。你指定的距离取决于你使用的投影。我很确定4326使用的是米,所以我把10英里转换成了米

# 10 miles in meters is 16093.4 
# according to google
buffers <- st_buffer(random_points_sf, 16093.4)

下面是绘图步骤

tmap_mode("view")

tm_shape(buffers)+
  tm_polygons(alpha = 0.5,
              col = "green")+
tm_shape(shp = random_points_sf) +
  tm_dots(title=NA, legend.show=FALSE,  id="", alpha=1, col = "red")

它看起来是这样的:

相关问题