谷歌地图多边形会减慢浏览器速度

2024-07-03

我有一个将多边形绘制到 Google 地图上的应用程序。我使用 Angular 作为前端,并使用 NodeJS api 来提供多边形数据。

现在,我加载了大约 300 个多边形,每个多边形大约有 10,000 个纬度坐标,但我对数据进行了分页,因此我只渲染多边形总量的十分之一。我在顶部使用一个名为的角度模块角度谷歌地图 https://angular-ui.github.io/angular-google-maps/#!/,考虑到 GitHub 问题页面,该项目本身似乎有点死了,但我认为这并不重要。

我已将可编辑标志设置为 false,但即使仅显示 30 个复杂多边形,浏览器的速度似乎也会显着减慢。当我根本不绘制多边形时,这种情况不会发生。

我发现 KML 或 Fusion 表得到了很多推荐,但我希望不必转换我的数据,因为数据量巨大。

有人遇到过类似的问题吗?


我过去处理过类似的问题。首先我想提一下,我没有使用任何 Google Maps JS API 包装器,例如 Angular Google Maps 或 NgMaps,因为我发现这些库没有包装 API 的许多有用功能,或者做得效率低下。

我正在使用google.maps.Data layer https://developers.google.com/maps/documentation/javascript/datalayer#sample_geojson显示多边形。我发现这种方法比使用方法具有更好的性能google.maps.Polygon。所以这是我给你的第一个建议data layer尝试代替正多边形。它不需要剧烈的数据转换,因为数据层已经addGeoJson(geoJsonObject)方法,因为您的数据形式为lat and lngs应该很容易生成GeoJSON Feature对象,它看起来像这样:

{
"type": "Feature",
"properties": { ... },
"geometry": {
    "type": "Polygon",
    "coordinates": [ [lng1, lat1], [lng2, lat2],  .. (your data) ]
    }
}

或者使用一些库为您生成它。优点data layer就是它提供了很多功能,比如自定义样式、鼠标事件交互等。我建议你看看我的BoundariesExample正在利用的示例DataLayer可用于Github https://github.com/matej-pavla/Google-Maps-Examples或这个回答SO https://stackoverflow.com/questions/10888958/country-boundries-using-google-map-api-v3/37092260#37092260。 (顺便说一句,您还可以添加一个多边形Data Layer很容易像这样:map.data.add({geometry: new google.maps.Data.Polygon([coords])})但我建议采用上述方法,因为我稍后会提到使用 GeoJSON 格式的库)

我当时在地图上显示了超过 30K 的多边形,其中很多都非常复杂。因此,如果您仍然遇到缓慢的情况,我有一些更多的优化建议给您:

1.在地图上显示多边形之前先简化多边形。也就是说,如果您不介意从多边形中删除一些顶点以换取更好的性能。您可以将所有多边形添加到单个 GeoJSON 对象中,然后利用地图塑造者 https://github.com/mbloch/mapshaper使用实用程序来简化它们专门的算法 https://github.com/mbloch/mapshaper/wiki/Command-Reference#-simplify(互动示例here https://bost.ocks.org/mike/simplify/)。我不确定该实用程序是否可以作为库包含在node.js项目,因为我将它作为 PHP 的外部实用程序运行,但它可以非常快速地简化您的多边形。对于 300 个多边形,我怀疑您将能够即时执行此操作,或者当然您可以缓存结果。如果可以的话,请使用简化,因为它是所有方法中对性能影响最大的。

2.合并多边形。我发现减少多边形数量(例如将它们压缩为一个)可以提高性能。如果您的多边形不必作为单独的实体存在(因此,如果它们都可以着色为相同的颜色,则单击时显示相同的弹出窗口...),您可以合并它们。mapshaper's dissolve命令可以帮助您。

3.添加多个数据层并仅加载地图上(部分)可见的多边形。因此,例如在更大的缩放级别上,用户甚至无法看到数据提供的详细信息,您可以使用方法 1 简化多边形,并在放大时隐藏上层并显示非简化的多边形,并且仅显示那些落在 (甚至部分)在您当前的地图视图中。因此,您将计算所有多边形的边界矩形,获取当前地图视图的边界矩形并仅加载重叠的边界矩形。用户移动地图后,您可以获取另一个地图。当它们再次缩小时,隐藏较低级别并显示较高级别。看来当数据层features(特征是多边形、线、点或它们的集合)被隐藏,它们不会影响性能。

当然,您可以组合应用上述技术。您还可以利用FusionLayer,但这有一些限制(列在docs https://developers.google.com/maps/documentation/javascript/fusiontableslayer#limits), with Data层你有更多的控制权。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谷歌地图多边形会减慢浏览器速度 的相关文章

  • 用随机图像填充表格

    首先 我的编码经验包括修改简单的脚本以在我的页面上工作 其次 我搜索并发现了几个类似的问题 但无法完全解决它们 我需要一些帮助来使用大约 40 张图像数组中的随机图像填充 3x3 表 我目前有一个使用 backgroundImage 属性的
  • 如何将angularjs变量值分配给html元素属性,例如输入elememnt的name属性

    我对 Angular 完全陌生 我有一个 AngularJS scope 变量 scope testme inputname 我想将此变量值分配给 html 元素的 name 属性 我想 结果如下
  • 使用 javascript 分割图像

    如何使用 javascript 获取单个图像的一部分并将其存储在数组中 然后在 html5 画布上随机显示 您可以使用drawImage 方法的剪切参数并将剪切的图像绘制到动态创建的画布上 一个例子可以是 function getClipp
  • Angular ui - 选项卡控制器执行多次

    当我单击一个选项卡时 相应的控制器会执行 4 次 为什么 E g DetailsPersonController s init函数执行了4次 仅应在加载选项卡视图后执行 HTML 标签
  • 使用 GruntJs 缩小脚本

    我有几个 js 文件 我似乎可以让 GruntJs 正确地连接 缩小它们 如果我单独做每一个 它们就会工作得很好 如果我单独组合然后尝试缩小组合文件 它也不起作用 Here is the error 有想法该怎么解决这个吗 或者也许是什么原
  • Docker 无法从其他服务连接到 redis

    我不知道如何连接到我的redis我的服务app服务 使用 Docker 版本 18 03 1 ce 为 Mac 构建 9ee9f40ocker 我尝试将我在类似问题上发现的各种方法联系起来 const client redis create
  • 使用指令刷新窗口时刷新元素高度和大小

    目前 以下指令在页面加载时获取元素的宽度和高度 如何让它在窗口调整大小时刷新它 angular module adsomaApp directive elementSize function timeout return restrict
  • Node-Webkit在不同窗口启动功能

    我的 node webkit 应用程序由一个控制窗口和一个演示窗口组成 控制窗口收集数据并最终通过window open功能 演示文稿窗口现在可以访问global多变的 现在我想通过创建 SVG 元素等来呈现该信息的图形表示 我已经有一个
  • 使用来自外部 JS 文件的 Google Analytics 异步代码

    我正在尝试将 Google Analytics 跟踪代码的异步版本添加到网站 我想将 JavaScript 保存在一个单独的文件中 并从那里调用它 这是我的 js 文件中当前的内容 function addLoadEvent func va
  • 连接到 Redis 与多个工作线程一起使用时遇到问题

    我在使用 Heroku 中的 kue 连接到 redis 来处理多个工作进程时遇到问题 我可以在本地主机上与多个工作人员连接到 redis 但在与 redis to go 连接时似乎会中断 只有当我运行多个 kue 工作线程 进程时 这似乎
  • for循环中的appendChild只添加1个孩子

    在 JavaScript 中 我使用 HTML 表格创建一个网格 您在 Photoshop 中看到的网格类型 网格大小是可变的 即可以由用户更改 因此必须计算每个网格方块的大小并将其除以可用像素数以获得精确大小的网格 我已经完成了所有这些
  • 有没有可靠的方法在 IE11 中使用 ctx.drawImage() ?

    我有一个脚本 可以根据数据查询创建动态 SVG 图形 我需要将它们粘贴到 PDF 中 为此我使用 jsPDF 不幸的是 jsPDF 自己的 addSVG 似乎不起作用 所以我花了一些时间尝试使用画布将 SVG 转换为 PNG 我似乎可以将
  • 处理 jQuery 中的所有事件类型

    在使用 jQuery 的应用程序中 我希望每次触发任何类型的事件 包括自定义事件 时都记录到控制台 无论如何 是否可以在不修改 jQuery 源代码并且不绑定到每个可能的事件类型的长列表的情况下执行此操作 var oldTrigger jQ
  • 错误:“访问受限 URI 被拒绝”

    访问受限 URI 被拒绝 代码 1012 中断此错误 xhttp send null function getXML xml file if window XMLHttpRequest var xhttp new XMLHttpReques
  • 你可以有一个自定义触发器来更新 Angular 中的 ng-model 字段吗?

    Angular 有许多选项可用于根据输入字段中的事件延迟模型更新
  • 获取此 contenteditable 元素中的当前行和行索引?

    我有一个这样的元素 span line 1 line 2 line 3 line 4 line 5 span 假设用户正在编辑 第 4 行 如何获取该 contenteditable 元素中的当前行和行索引 在插入符号位置 这是使用选择属性
  • 不固定高度的滚动div

    我需要构建一个动态调整大小的滚动 div div 应动态调整大小以适应屏幕 但如果内容不适合屏幕 它应该显示一个滚动条 因此浏览器自己的滚动条永远不需要激活 我可以通过在 div 中放置另一个 div 并使用来让滚动条出现在 div 中ov
  • JavaScript。如果数组包含重复数字,Array .sort() 方法会为 Chrome 和 Firefox 返回不同的结果

    我有包含随机数的数组 当我试图通过排序这个数组时 sort 方法 如果数组包含重复的数字 结果会不同 下面的代码在 Chrome 和 Firefox 中的工作方式有所不同 1 2 3 4 5 6 7 8 9 2 15 3 4 5 1 2 3
  • 街景中标记上的 InfoWindows

    根据 Google 文档 当您在地图上创建标记时 市场也会 复制 到地图的街景版本上 但是 onClick 事件绑定不会被复制 或者至少看起来不会被复制 因此我无法在 StreetView 中打开标记上的 InfoWindow 理想情况下
  • JavaScript 开发人员不使用 Array.push() 是否有原因?

    我经常看到开发人员在 JavaScript 中使用如下所示的表达式 arr arr arr length Something arr arr length Another thing 不会push更合适吗 arr arr push Some

随机推荐

  • 如何在 R 中将 mutate_at() 与两组变量一起使用

    使用 dplyr 我想将一列除以另一列 其中两列具有相似的模式 我有以下数据框 My data data frame var a 101 110 var b 201 210 number a 1 10 number b 21 30 我想创建
  • Excel过滤公式用于数组中的多个条件和值

    我正在尝试从一个表中过滤一些信息 但我需要标准来查找数组内的一些信息 我将举一个例子来尝试解释我需要什么 我需要让每个人都从Array1 E2 E4列于TABLE1 A2 C4并且有Monday and Yes在各自的列上 希望这是有道理的
  • Excel过滤公式用于数组中的多个条件和值

    我正在尝试从一个表中过滤一些信息 但我需要标准来查找数组内的一些信息 我将举一个例子来尝试解释我需要什么 我需要让每个人都从Array1 E2 E4列于TABLE1 A2 C4并且有Monday and Yes在各自的列上 希望这是有道理的
  • QMAKE 中的 GNU make --jobs 选项

    我正在使用 qmake 为我们正在开发的小型 Qt C 应用程序生成 MinGW32 Makefiles 我的问题 所有这些双 四核 CPU 都闲置在那里 而只有一个线程正在进行构建 为了并行化 我尝试传递 jobs 4 来 make 但问
  • QMAKE 中的 GNU make --jobs 选项

    我正在使用 qmake 为我们正在开发的小型 Qt C 应用程序生成 MinGW32 Makefiles 我的问题 所有这些双 四核 CPU 都闲置在那里 而只有一个线程正在进行构建 为了并行化 我尝试传递 jobs 4 来 make 但问
  • Dart Set 如何比较项目? [复制]

    这个问题在这里已经有答案了 我刚刚塞了一堆MyClass里面一个Set在达特中 MyClass不实施Comparable 并且没有 运算符定义 它编译得很好 为了这Set为了正确检测重复项 我是否必须实施Comparable接口 或者只是覆
  • Dart Set 如何比较项目? [复制]

    这个问题在这里已经有答案了 我刚刚塞了一堆MyClass里面一个Set在达特中 MyClass不实施Comparable 并且没有 运算符定义 它编译得很好 为了这Set为了正确检测重复项 我是否必须实施Comparable接口 或者只是覆
  • do-while 循环的问题

    请注意 虽然我对 Java 很熟悉 但我并不是特别有天赋 也不知道所有的行话 所以请用很少的编码器行话和尽可能多的普通英语来解释你的答案 或者在使用后解释行话的含义 另外 这是我第一次使用 Stackoverflow 所以请告诉我这是否是一
  • do-while 循环的问题

    请注意 虽然我对 Java 很熟悉 但我并不是特别有天赋 也不知道所有的行话 所以请用很少的编码器行话和尽可能多的普通英语来解释你的答案 或者在使用后解释行话的含义 另外 这是我第一次使用 Stackoverflow 所以请告诉我这是否是一
  • 比较程序集名称导致不匹配:修订号

    我正在开发 ASP NET MVC4 应用程序 该应用程序在我的本地计算机上运行良好 但在应用程序服务器上不起作用并引发以下错误 无法加载文件或程序集 System Web Mvc 版本 2 0 0 0 Culture neutral Pu
  • 比较程序集名称导致不匹配:修订号

    我正在开发 ASP NET MVC4 应用程序 该应用程序在我的本地计算机上运行良好 但在应用程序服务器上不起作用并引发以下错误 无法加载文件或程序集 System Web Mvc 版本 2 0 0 0 Culture neutral Pu
  • 检查 Xamarin Android 中的互联网是否打开或关闭

    我正在开发 Xamarin Android 应用程序 在继续我的下一个片段之前 我想检查一下网络连接并通知用户 我该如何实现 以及如何在用户打开互联网后刷新整个片段 任何意见或建议将不胜感激 要获取网络状态 您可以在活动中使用以下方法 pu
  • 检查 Xamarin Android 中的互联网是否打开或关闭

    我正在开发 Xamarin Android 应用程序 在继续我的下一个片段之前 我想检查一下网络连接并通知用户 我该如何实现 以及如何在用户打开互联网后刷新整个片段 任何意见或建议将不胜感激 要获取网络状态 您可以在活动中使用以下方法 pu
  • MPI_(I)NEIGHBOR_ALLTOALLW() 中的 MPI_Aint 与 MPI_(I)ALLTOALLW() 中的 int

    随着MPI3 0引入邻里集体通信 其中 2 个 MPI NEIGHBOR ALLTOALLW and MPI INEIGHBOR ALLTOALLW 位移 sdispls and rdispls 是数组const MPI Aint 相反 相
  • MPI_(I)NEIGHBOR_ALLTOALLW() 中的 MPI_Aint 与 MPI_(I)ALLTOALLW() 中的 int

    随着MPI3 0引入邻里集体通信 其中 2 个 MPI NEIGHBOR ALLTOALLW and MPI INEIGHBOR ALLTOALLW 位移 sdispls and rdispls 是数组const MPI Aint 相反 相
  • 没有得到 Guzzle 的预期回应

    我正在尝试构建一个端点 使用 Slim PHP 框架将传递给它的数据转发到 API 但我在从 Guzzle 请求获取响应时遇到问题 app gt map api call method function method use app cli
  • 没有得到 Guzzle 的预期回应

    我正在尝试构建一个端点 使用 Slim PHP 框架将传递给它的数据转发到 API 但我在从 Guzzle 请求获取响应时遇到问题 app gt map api call method function method use app cli
  • 谷歌地图多边形会减慢浏览器速度

    我有一个将多边形绘制到 Google 地图上的应用程序 我使用 Angular 作为前端 并使用 NodeJS api 来提供多边形数据 现在 我加载了大约 300 个多边形 每个多边形大约有 10 000 个纬度坐标 但我对数据进行了分页
  • RStudio 闪亮列表,通过检查数据表中的行

    我想要一个与此类似的工作示例 https demo shinyapps io 029 row selection https demo shinyapps io 029 row selection 我在运行的闪亮服务器中尝试了该示例Shin
  • 谷歌地图多边形会减慢浏览器速度

    我有一个将多边形绘制到 Google 地图上的应用程序 我使用 Angular 作为前端 并使用 NodeJS api 来提供多边形数据 现在 我加载了大约 300 个多边形 每个多边形大约有 10 000 个纬度坐标 但我对数据进行了分页