Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建带有数千个标记且不';我的浏览器不会崩溃吗?_Javascript_R_Leaflet - Fatal编程技术网

Javascript 如何创建带有数千个标记且不';我的浏览器不会崩溃吗?

Javascript 如何创建带有数千个标记且不';我的浏览器不会崩溃吗?,javascript,r,leaflet,Javascript,R,Leaflet,我正在使用R中的传单包生成一张有大量圆圈的地图。目标是一张地图,我可以发布到我的网站上。我遇到的问题是,当我增加圆圈数时,生成的贴图加载速度非常慢,我收到“无响应脚本”警告,最终它会完全冻结我的浏览器 我知道这类事情是可能的,因为我找到了一张传单地图,它按照我想要的方式工作: 我注意到在上面的地图上,圆圈不像我的地图上的圆圈那样“可点击”,而且它们似乎是以方形块加载的。我有一种预感,这些事情与我的问题有关。不幸的是,我对传单/javascript的东西太不熟悉了,无法自己解决这个问题 以下是一

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

我知道这类事情是可能的,因为我找到了一张传单地图,它按照我想要的方式工作:

我注意到在上面的地图上,圆圈不像我的地图上的圆圈那样“可点击”,而且它们似乎是以方形块加载的。我有一种预感,这些事情与我的问题有关。不幸的是,我对传单/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)
图书馆(“传单”)
库(“htmlwidgets”)
点数%
setView(-93.617167,41.580166,缩放=12)%>%
添加圆(~x,~y,重量=1,半径=5,
color=“#FFA500”,笔划=真,填充不透明度=0.1)
M
saveWidget(widget=m,file=“example.html”,selfcontained=TRUE)

如果要向地图添加大量矢量对象,很难轻松完成

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

基本上,我喜欢做的是将大数据集分解成更小的(矢量)分幅,与您显示的光栅分幅具有相同的边界。如果希望数据以多个缩放级别显示,请复制数据。在显示圆时,假设您在平铺边界上分割圆的中心点

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


如果您有很多点,它们在低缩放级别上实际上是不可见的,因此最好只在适当的缩放级别上显示它们(可能在低缩放级别使用不同的表示,如热图)。这将使每次显示的数据量更低。

mapview可以帮助您。它基于传单库构建较小的数据集,但对较大的数据使用特殊的javascript功能

你的例子有一百万。要点:

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)
图书馆(sp)

dots由于这个问题有一些赞成票,我将大致描述我找到的两种解决方案。如果我以后有时间的话,我可能会把所有的文件放在GitHub上

首先,我找到了蒂莱米尔。只需将坐标数据文件加载到TileMill中,按照您希望的方式设置坐标样式,然后输出TILE(png)。把这些瓦片放在网络上的某个地方,然后把传单放进去。这个过程对我来说有点过于手工,因为当我加载csv文件时,TileMill不断崩溃,这些文件太大,无法在我的机器上渲染

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

Mapdeck(于2018年8月8日发布)使用WebGL(通过),设计用于处理数百万点(当然取决于您的系统硬件)

库(mapdeck)
设置\u令牌(“映射框\u令牌”)

n集群是一个不错的选项()。你的例子很好!你在说多少点?@MLavoie谢谢你的建议。我把集群选项弄得一团糟,就是无法获得我想要的性能。根据我使用的机器,我的示例运行良好。但是增加点的数量,你最终会达到一个极限。我正在寻找一些更具可伸缩性的东西来制作大点密度地图。使用mapview_1.0.0版,你的点不会显示在地图上(即使几分钟后)。地图就在那里,但是空的。有什么原因可以解释吗behavior@MLavoie上面的例子有1百万。points在1.0.0版中对我来说很好。如果你在尝试其他东西,那么举一个可复制的例子如何?我使用的是完全相同的例子,我只有一张得梅因地图,而我的笔记本电脑上的地图不是全尺寸(显示器的90%)。传单_1.0.1.9002也已加载。我有传单_1.0.1.9003,但也尝试使用CRAN的传单_1.0.1。两者都为我工作。你在使用什么操作系统?OS X Yosemite,R版本3.2.0(2015-04-16)。我最近发现了这个库,并一直想尝试一下。很好的例子。@DWal也有很多其他例子:)
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"
    )