Şekil dosyalarında sf
okumak için paketi (ve ilgili paketleri) ggplot2
ve çizim için (ve arkadaşları) kullanarak R'de GIS haritaları yapıyorum . Bu iyi çalışıyor, ancak nehirler ve yollar gibi özellikler için (otomatik / programlı) etiket yerleşimleri oluşturmanın bir yolunu bulamıyorum. Bu özellikler tipik olarak düzensiz şekillere sahip linestringlerdir. Örneğin wikimedia'dan eklenen resme bakın.
ggrepel
Paket otomatik bir şekilde noktalarını etiketlemek için iyi çalışır, ancak bu ayrık Lat / Long noktaları olmayan diğer coğrafi özellikler için çok mantıklı değil.
Bunu her özelliğe ayrı ayrı metin etiketleri yerleştirerek hayal edebiliyorum, ancak mümkünse daha otomatik bir şey arıyorum. Böyle bir otomasyonun önemsiz bir sorun olmadığını anlıyorum, ancak daha önce çözüldü (ArcGIS'in görünüşte bunu maplex adlı bir uzantıyla yapmanın bir yolu var, ancak yazılıma erişimim yok ve kalmak istiyorum Mümkünse R).
Bunu yapmanın bir yolunu bilen var mı?
MWE burada:
#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
daha önce yapmış olduğunuz işleri yeniden yapmaları gerektiği anlamına gelir . Bu, yararlı bir cevap vermeniz olasılığını azaltır.