Sto realizzando mappe GIS in R usando il sf
pacchetto (e pacchetti correlati) per leggere in shapefile e ggplot2
(e amici) per la stampa. Funziona bene, ma non riesco a trovare il modo (automatico / programmatico) di creare posizionamenti di etichette per elementi come fiumi e strade. Queste caratteristiche sono in genere stringhe di linea con forme irregolari. Vedi l'immagine allegata ad esempio da Wikimedia.
Il ggrepel
pacchetto funziona bene per l'etichettatura dei punti in modo automatizzato, ma questo non ha molto senso per altre caratteristiche geografiche che non sono punti Lat / Long discreti.
Potrei immaginare di farlo posizionando le singole etichette di testo su ciascuna funzione singolarmente, ma sto cercando qualcosa di più automatizzato, se possibile. Mi rendo conto che tale automazione non è un problema banale, ma è stata risolta in precedenza (apparentemente ArcGIS ha un modo di farlo con un'estensione chiamata maplex, ma non ho accesso al software e mi piacerebbe rimanere in R se possibile).
Qualcuno sa come farlo?
MWE qui:
#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
, in sostanza ripetere il lavoro che hai già fatto. Questo rende molto meno probabile la tua risposta utile.