Tôi đang tạo bản đồ GIS trong R bằng cách sử dụng sf
gói (và các gói có liên quan) để đọc trong shapefiles và ggplot2
(và bạn bè) để vẽ đồ thị. Điều này hoạt động tốt, nhưng tôi không thể tìm cách (tự động / lập trình) tạo các vị trí nhãn cho các tính năng như sông và đường. Các tính năng này thường là linestrings, với hình dạng không đều. Xem hình ảnh đính kèm ví dụ từ wikidia.
Các ggrepel
gói hoạt động tốt cho ghi nhãn điểm một cách tự động, nhưng điều này không có ý nghĩa nhiều đối với đặc điểm địa lý khác mà không phải là rời rạc điểm Lat / Long.
Tôi có thể tưởng tượng làm điều này bằng cách đặt các nhãn văn bản riêng lẻ trên từng tính năng, nhưng tôi đang tìm kiếm thứ gì đó tự động hơn, nếu có thể. Tôi nhận ra tự động hóa như vậy không phải là một vấn đề nhỏ, nhưng nó đã được giải quyết trước đây (ArcGIS rõ ràng có cách thực hiện điều này với một phần mở rộng gọi là maplex, nhưng tôi không có quyền truy cập vào phần mềm và tôi muốn ở lại R nếu có thể).
Có ai biết một cách làm điều này?
MWE ở đây:
#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
, về cơ bản làm lại công việc mà bạn đã thực hiện. Điều này làm cho nó ít có khả năng bạn sẽ có một câu trả lời hữu ích.