使用Leaflet(R语言)加载SpatialPolygonsDataFrame无法工作

7

首先,我是R的新手,请多多包涵。

我的最终目标是展示一个互动的阿姆斯特丹地图,使用Leaflet。为此,我使用RGDAL读取shapefiles。

这个链接包含阿姆斯特丹的shapefiles。

我正在使用以下代码来读取shapefiles并展示地图。

amsterdam <- readOGR(".", layer = "sd2010zw_region", verbose = FALSE)

leaflet(amsterdam) %>%
  addProviderTiles("CartoDB.Positron", options= providerTileOptions(opacity = 0.99)) %>%
    addPolygons(
      stroke = FALSE, fillOpacity = 0.5, smoothFactor = 0.5
    )

我获得的是来自CartoDB.Positron的地图,但不是作为第二层的“polygonmap”。我得到的是一个包含各种数据的SpatialPolygonsDataFrame。
另一方面,当我使用绘图方法时,我得到了阿姆斯特丹的地图。
plot(amsterdam, axes=TRUE, border="gray")

但我不想使用绘图库,我想使用Leaflet :)

我在这里做错了什么?

2个回答

18

问题在于投影。您需要使用 rgdalsp 中的 spTransform 将数据投影到 longlat。此外,在 addPolygons() 调用中提供您的 SpatialPolygonsDataFrame

library(leaflet)
library(rgdal)

amsterdam <- readOGR(".", layer = "sd2010zw_region", verbose = FALSE)

ams_ll <- spTransform(amsterdam, CRS("+init=epsg:4326"))

leaflet() %>%
  addProviderTiles("CartoDB.Positron", options= providerTileOptions(opacity = 0.99)) %>%
  addPolygons(data = ams_ll,
    stroke = FALSE, fillOpacity = 0.5, smoothFactor = 0.5
  )

问题:你如何知道需要使用哪个CRS?它从哪里获取?@TimSalabim - JDH
CRS并不是一个简单的话题。简而言之,Web地图基本上是使用Web墨卡托投影完成的。然而,Leaflet需要非投影的经纬度坐标作为输入,并在内部将它们转换为Web墨卡托投影(在我看来这是一种糟糕的设计,但我们必须接受)。因此,对于Leaflet,您只需要知道它们需要在'+init=epsg:4326'中(或者更精确地说是'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')。 - TimSalabim
我想知道你是否能帮我解决这个问题:链接 @TimSalabim。顺便感谢你关于CRS的信息! - JDH
抱歉,我不是一个闪亮的专家,但是 leaflet 包含了删除对象的方法。请参阅 ?removeControl - TimSalabim
获取正确的投影方式也有助于解决leaflet中弹出窗口的问题。由于某种原因,如果投影方式不匹配,HTML在弹出窗口中无法呈现。 - dca

3

提示:在addPolygons()调用中,不要忘记添加data=...变量名。

这样做无法实现目标:

leaflet() %>%
  addTiles() %>%
  addPolygons(ams_ll)

这是有效的:

leaflet() %>%
  addTiles() %>%
  addPolygons(data = ams_ll)

我花了几个小时寻找解决方案,希望这对其他人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接