st_centroid 在同一点上呈现所有标签

st_centroid renders all labels on the same point

我正在尝试使用 sf 库中的 st_centroid 函数在 R 中的 GIS 多边形要素上显示标签。不幸的是,虽然 head() 函数似乎显示每个多边形都有不同的 x 和 y 坐标与之关联,但所有标签都在地图上的单个点(显然是一个特定多边形的质心)处呈现重叠。我在这里做错了什么?

当前代码设置:

library("ggplot2")
library("sf")

sf::sf_use_s2(FALSE) #makes centroids not break

world <- st_read("C:/prgrm/gis/source/10m_land_and_islands.shp")
prov <- st_read("C:/prgrm/gis/edited ncm/ncm_provinces.shp")
prov <- cbind(prov, st_coordinates(st_centroid(prov))) #attaches centroids to 'prov' dataset

head(prov)

ggplot(data = world) + 
  geom_sf() + 
  geom_sf(data=prov, aes(fill="blue")) +
  geom_text(data=prov, aes(X,Y, label=provname_r), size=5) +
  coord_sf(xlim=c(-2000000,1000000),ylim=c(-1500000, 3000000), crs=st_crs(3310))

通过 geom_sf_text() 调用的 fun.geometry 参数指定质心位置可能会更好 / 顺便说一下,默认值为 sf::st_point_on_surface() - 这是一个很好的默认值如果多边形有一个洞,请确保标签没有放在洞内。

考虑这个例子,使用 {sf}.

附带的众所周知且备受喜爱的 nc.shp shapefile
library(sf)
library(ggplot2)

# in place of your world dataset
shape <- st_read(system.file("shape/nc.shp", package="sf"))   # included with sf package

# in place of your prov dataset
ashe <- shape[1, ]

ggplot(data = shape) +
  geom_sf() +
  geom_sf(data = ashe, fill = "blue") +
  geom_sf_text(data = ashe, 
               aes(label = NAME), 
               color = "red",
               fun.geometry = st_centroid)