繁体   English   中英

如何创建包含数千个不会使浏览器崩溃的标记的传单地图?

[英]How do I create a leaflet map with thousands of marks that doesn't crash my browser?

我正在使用R中的传单包来生成一个包含大量圆圈的地图。 目标是我可以发布到我的网站的地图。 我遇到的问题是,当我增加圈数时,生成的地图加载速度非常慢,我得到“无响应的脚本”警告,最终它完全冻结了我的浏览器。

我知道这种事情是可能的,因为我发现了一张传单,可以按我希望的方式工作:

http://cartologic.com/geoapps/map_viewer/5/ny-crimes-2014-dot-density-map

我在上面的地图上注意到,圆圈看起来并不像我在地图上的圆圈那样“可点击”,而且它们看起来像方块一样加载。 我预感到这些事情与我的问题有关。 不幸的是,我在传单/ javascript的东西上太过于自我解决这个问题了。

这是一个说明我的问题的玩具示例:

library("leaflet")
library("htmlwidgets")

dots <- data.frame(x=c(runif(10000, -93.701281, -93.533053)),
                   y=c(runif(10000,  41.515962,  41.644369)))

m <- leaflet(dots) %>%
  addTiles('http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png') %>% 
  setView(-93.617167, 41.580166, zoom = 12) %>% 
  addCircles(~x, ~y, weight = 1, radius = 5, 
             color = "#FFA500", stroke = TRUE, fillOpacity = 0.1) 

m

saveWidget(widget = m, file="example.html", selfcontained = TRUE)

mapview可以帮到你。 它建立在小叶库的基础上,用于较小的数据集,但对较大的数据使用特殊的javascript功能。

你的例子是1 Mio. 要点:

library(mapview)
library(sp)

dots <- data.frame(x=c(runif(1000000, -93.701281, -93.533053)),
                   y=c(runif(1000000,  41.515962,  41.644369)))

coordinates(dots) <- ~ x + y
proj4string(dots) <- "+init=epsg:4326"

mapview(dots)

渲染可能还需要一段时间,但一旦渲染它应该是非常敏感的。 请注意,mapview旨在使用spatial *对象,这就是我们需要调用来设置坐标槽和投影的原因。

有关更多信息,请查看此处:

http://environmentalinformatics-marburg.github.io/web-presentations/20150723_mapView.html

希望有所帮助。

如果要向地图添加大量矢量对象,很少能够轻松完成。

请注意,栅格数据被分解为切片,因此不必一次显示所有信息。 对于矢量数据(在本例中为圆圈),您必须执行相同的操作。

基本上我喜欢做的是将大数据集分成更小的(矢量)图块,边界与您显示的栅格图块相同。 如果希望数据以多个缩放级别显示,请复制数据。 当您显示圆形时,请想象您在圆形边界上划分圆的中心点。

我有一个类似于此的应用程序,我基本上将我的矢量数据分区在tile边界上并将信息存储在geojson文件中。 当我得到一个已加载栅格图块的事件时,我可以将等效矢量文件加载为geojson图层(当光栅图块被卸载时也是如此)。 通过这种方式,您可以限制任何时候必须显示的矢量数据量。

如果你有很多分数,那么它们在低变焦水平下实际上并不是真的可见,所以最好只是以适当的缩放级别显示它们(可能在低变焦处有不同的表示 - 比如热图)。 这将使任何时候显示的数据量保持较低。

由于这个问题有几个赞成,我一般会描述我找到的两个解决方案。 也许如果我以后有时间,我会在GitHub上将所有文件放在一起。

首先,我找到了TileMill。 只需将坐标数据文件加载到TileMill中,按照您希望的方式显示样式,然后输出切片(png)。 在某个地方托管这些瓷砖并用传单加载它们。 这个过程对我来说有点过于谨慎,因为当我加载csv文件时,TileMill一直在崩溃,因为csv文件太大而无法在我的机器上渲染。

我发现最好的解决方案是使用Processing,在这里调整Robert Manduca的代码: https//github.com/rmanduca/jobmaps 我不使用Python,所以我在R中重写了这些部分,并根据我的规范修改了处理代码。

Mapdeck(于2018年8月在CRAN上发布)使用WebGL(通过Deck.gl ),旨在处理数百万个点(当然,取决于系统的硬件)

library(mapdeck)

set_token("MAPBOX_TOKEN")

n <- 1e6
dots <- data.frame(x=c(runif(n, -93.701281, -93.533053)),
                   y=c(runif(n,  41.515962,  41.644369)))


dots$letter <- sample(letters, size = n, replace = T)

mapdeck(
    style = mapdeck_style('dark')
) %>%
    add_scatterplot(
        data = dots
        , lon = "x"
        , lat = "y"
        , fill_colour = "letter"
        , radius = 5
        , fill_opacity = 50
        , layer_id = "dots"
    )

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM