Я створюю GIS-карти в R, використовуючи sf
пакет (та пов'язані з ним пакети) для читання у формі файлів та ggplot2
(та друзів) для побудови графіків. Це прекрасно працює, але я не можу знайти (автоматично / програмно) створити мітки міток для таких функцій, як річки та дороги. Ці риси, як правило, є рядками з неправильною формою. Дивіться зображення, що додається, наприклад, з wikimedia.
ggrepel
Пакет добре працює для маркування точок в автоматичному режимі, але це не має особливого сенсу для інших географічних об'єктів, які не є дискретними Lat / Long точки.
Я міг би собі це зробити, розміщуючи окремі текстові мітки на кожній функції окремо, але я шукаю щось більш автоматизоване, якщо це можливо. Я усвідомлюю, що така автоматизація не є тривіальною проблемою, але вона була вирішена раніше (ArcGIS, мабуть, має змогу зробити це з розширенням під назвою maplex, але я не маю доступу до програмного забезпечення, і я хотів би залишитися в R, якщо можливо).
Хтось знає про спосіб цього?
MWE тут:
#MWE Linestring labeling
library(tidyverse)
library(sf)
library(ggrepel)
set.seed(120)
#pick a county from the built-in North Carolina dataset
BuncombeCounty <- st_read(system.file("shapes/", package="maptools"), "sids") %>%
filter(NAME == "Buncombe")
#pick 4 random points in that county
pts_sf <- data.frame(
x = seq(-82.3, -82.7, by=-0.1) %>%
sample(4),
y = seq(35.5, 35.7, by=0.05) %>%
sample(4),
placenames = c("A", "B", "C", "D")
) %>%
st_as_sf(coords = c("x","y"))
#link those points into a linestring
linestring_sf <- pts_sf %>%
st_coordinates() %>%
st_linestring()
st_cast("LINESTRING")
#plot them with labels, using geom_text_repel() from the `ggrepel` package
ggplot() +
geom_sf(data = BuncombeCounty) +
geom_sf(data = linestring_sf) +
geom_label_repel(data = pts_sf,
stat = "sf_coordinates",
aes(geometry = geometry,
label = placenames),
nudge_y = 0.05,
label.r = 0, #don't round corners of label boxes
min.segment.length = 0,
segment.size = 0.4,
segment.color = "dodgerblue")
ggrepel
, в основному повторити роботу, яку ви вже зробили. Це робить набагато меншою ймовірність отримання корисної відповіді.