【问题标题】:How can I make my two R leaflet maps synchronise with each other?如何使我的两个 R 传单地图彼此同步?
【发布时间】:2017-07-31 21:57:14
【问题描述】:

我在 R 中为一些数据实现 Leaflet 包取得了一些不错的成功。

我还设法将两张地图并排放置为格子和同步。

我有两个问题:

1) 同步...根本不同步地图

我正在使用MapviewRaster 尝试同步,但并排的两张地图没有一起放大/缩小。

请看下面的代码:

library(leaflet)
library(ggmap)
library(mapview)
library(raster)
library(magrittr)
UK <- ggmap::geocode("United Kingdom")

#FILE1 <- read.csv("DATASET1.csv")
#FILE2 <- read.csv("DATASET2.csv")
FILE1 <- data.frame('lat' = c(51.31, 51.52, 51.53), 'lon' = c(0.06, 0.11, 0.09))
FILE2 <- data.frame('lat' = c(52.20, 52.25, 52.21), 'lon' = c(0.12, 0.12, 0.12))

map1 <- leaflet(FILE1)%>%
  addTiles()%>%
  addMarkers(clusterOptions = markerClusterOptions())

map2 <- leaflet(FILE2)%>%
  addTiles()%>%
  addMarkers(clusterOptions = markerClusterOptions())

sync(map1,map2)

我确定我在这里遗漏了一些简单的东西,但希望有人可以帮助我看到:)

2) 理想情况下,我希望一张传单地图与另一张重叠

我想通过为每张地图使用不同的市场来区分它们。我试图在互联网上和通过阅读传单手册进行研究,但没有成功

非常感谢任何指导!

【问题讨论】:

  • mapview和leaflet的版本是多少?最近有更新leaflet,可能会影响mapview同步功能。这已在 mapview 的开发版本中得到修复。尝试devtools::install_github("environmentalinformatics-marburg/m‌​apview@develop") 安装开发版。见我之前的问题:stackoverflow.com/questions/42640120/…
  • 它说我需要安装 Rtools,但是当我尝试时它说 Rtools 不可用
  • 你的 R 版本是多少?尝试升级到 3.3.3 并在本网站下载最新的 Rtools (cran.r-project.org/bin/windows/Rtools)
  • 你不能在没有 R 的情况下使用 RStudio,...
  • 那么devtools::install_github("environmentalinformatics-marburg/m‌​‌​apview@develop") 应该可以工作

标签: r google-maps openstreetmap r-mapview r-leaflet


【解决方案1】:

1) 同步两张地图

安装开发版本为我解决了这个问题

# Dependencies
# If your devtools is not the latest version
# then you might have to install "units" manually
install.packages('units') 
install.packages('devtools')
library(devtools)

devtools::install_github("environmentalinformatics-marburg/mapview", ref = "develop")

我使用的代码:

library(leaflet)
library(ggmap)
library(mapview)
library(raster)
library(magrittr)
UK <- ggmap::geocode("United Kingdom")

#FILE1 <- read.csv("DATASET1.csv")
#FILE2 <- read.csv("DATASET2.csv")
FILE1 <- data.frame('lat' = c(51.31, 51.52, 51.53), 'lon' = c(0.06, 0.11, 0.09))
FILE2 <- data.frame('lat' = c(52.20, 52.25, 52.21), 'lon' = c(0.12, 0.12, 0.12))

map1 <- leaflet(FILE1)%>%
  addTiles()%>%
  addMarkers(clusterOptions = markerClusterOptions())

map2 <- leaflet(FILE2)%>%
  addTiles()%>%
  addMarkers(clusterOptions = markerClusterOptions())

mapview::latticeView(map1, map2, ncol = 2, sync = list(c(1, 2)), sync.cursor = FALSE, no.initial.sync = FALSE)
# Or:
sync(map1, map2)

2) 叠加两张地图

您可以使用两个单独的数据框作为数据源,并将它们分别添加到同一个地图中。更改符号样式以区分它们。

map3 <- leaflet(FILE2)%>%
  addTiles() %>%
  addCircleMarkers(data = FILE1) %>%
  addCircleMarkers(data = FILE2,
                   color = '#0FF')
map3

如果您想为集群标记做类似的事情,herehere 上有一些很好的文档。根据这些帖子中的一些代码,我在下面创建了一个建议,我使用预先存在的样式来区分不同类型的集群:

FILE1 <- data.frame('lat' = rnorm(n = 1000, mean = 51.4, sd = 0.5), 
                    'lon' = rnorm(n = 1000, mean = 0.8, sd = 0.5))
FILE2 <- data.frame('lat' = rnorm(n = 1000, mean = 53, sd = 0.5), 
                    'lon' = rnorm(n = 1000, mean = -0.5, sd = 0.5))

map3 <- leaflet(rbind(FILE1, FILE2)) %>%
  addTiles() %>%
  addCircleMarkers(data = FILE1,
    color = '#FA5',
    opacity = 1,
    clusterOptions = markerClusterOptions(iconCreateFunction = JS("function (cluster) {    
      var childCount = cluster.getChildCount(); 
      var c = ' marker-cluster-';  
      if (childCount < 3) {  
        c += 'large';  
      } else if (childCount < 5) {  
        c += 'large';  
      } else { 
        c += 'large';  
      }    
      return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', 
      className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });
  
    }"))) %>%
  addCircleMarkers(data = FILE2,
    color = '#9D7',
    opacity = 1,
    clusterOptions = markerClusterOptions(iconCreateFunction = JS("function (cluster) {    
      var childCount = cluster.getChildCount(); 
      var c = ' marker-cluster-';  
      if (childCount < 3) {  
        c += 'small';  
      } else if (childCount < 5) {  
        c += 'small';  
      } else { 
        c += 'small';  
      }    
      return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', 
      className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });
  
    }")))

【讨论】:

  • 回复。 rependencies,这是最新的devtools 版本中的一个错误,安装版本 1.11.1 修复它。
  • 谢谢!只是努力确保它在所有条件下都能正常工作。此外,尝试简单的clusterOptions=markerClusterOptions() 不会为我在第二个数据集上的自定义图标返回集群
  • 嗨,我无法让 iconcreate 函数在上面工作...我已经设法覆盖了 2 个数据集,并且还设法使用了 2 个不同的标记...但是对于 FILE2 我不能让它像 FILE1 一样集群... FILE2 包含我添加的客户标记
  • 您能否用一个可重现的示例更新您问题的第 2 部分)?
  • 您好,抱歉明天有时间再试一次。尽管如此,我仍然会接受你的回答,因为我已经实现了我的目标,上面的内容在 cmets 中更辅助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多