我有一个来自公共存储库的数据集https://github.com/highsource/verbundkarte
使用 st_read 读取数据集并使用 ggplot 绘制它会产生一个带有正确 lng 和 lat 数据的漂亮地图。
df <- st_read("~/Verkehrsverbunde.shp")
map <- ggplot(df) + geom_sf(aes(fill=SHORTNAME))
因此,我假设 lng/lat 值包含在变量 df$geometry 中。但是,如果我使用传单,无论我尝试什么,最终都会出错。比如说
df%>% leaflet() %>%
addProviderTiles("CartoDB") %>%
addPolygons(label = htmlEscape(verbunddaten$SHORTNAME)) %>%
setView(lng = 10.3, lat = 51.9, zoom = 5.1)
最终
Warning messages:
1: sf layer is not long-lat data
2: sf layer has inconsistent datum (+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam +units=m +no_defs ).
Need '+proj=longlat +datum=WGS84'
我发现了这个美丽的对话,但我基本上一无所知。按照here的建议使用 readOGR 读取数据并不能解决我的问题。
如何强制传单采用与 ggplot 相同的 longlat 和 EPSG?
Verkehrsverbunde.shp
shapefile 中的数据位于自定义的 traverse Mercator 投影中,其中坐标以米表示。相比之下,r-leaflet 期望数据以经纬度表示,如果/绘制时,它看起来像一个等距矩形投影。
我猜,与您的看法相反,ggplot
不使用以度为单位的纬度和经度,而是使用以米为单位的北距和东距值。对于小区域,数据的表示可能看起来相似。 在 GIS 术语中,您的数据使用
EPSG:31467 CRS(坐标参考系),可以通过 proj=tmerc
和
datum=postdam
推断; r-leaflet 期望EPSG:4326 CRS 中的数据。 此处的方法是重新投影数据,以便坐标符合预期的经纬度。有很多方法可以做到这一点;在命令行上运行
ogr2ogr -t_srs epsg:4326 Verkehrsverbunde-latlng.shp Verkehrsverbunde-latlng.shp
,使用 R,或 使用 QGIS,以及其他方法。