我有一个将多边形绘制到 Google map 的应用程序。我使用 angular 作为前端,使用 NodeJS api 来提供我的多边形数据。
现在我加载了大约 300 个多边形,每个多边形大约有 10,000 个经纬度坐标,但是我对数据进行了分页,所以我只渲染了多边形总数的十分之一。我在顶部使用了一个名为 Angular Google Maps 的 Angular 模块,考虑到 GitHub 问题页面,项目本身似乎有点死了,但我认为这并不重要。
我已将可编辑标志设置为 false,但即使只显示了 30 个这样的复杂多边形,浏览器的速度似乎也显着降低。当我根本不绘制多边形时,就不会发生这种情况。
我发现 KML 或 Fusion 表得到了很多推荐,但我希望不必转换我的数据,因为它的数量非常庞大。
有人遇到过类似的问题吗?
最佳答案
我过去处理过类似的问题。首先,我想提一下,我没有使用任何 Google Maps JS API 包装器,如 Angular Google Maps 或 NgMaps,因为我发现这些库没有包装 API 的很多有用功能,或者包装效率很低。
我正在使用 google.maps.Data layer显示多边形。我发现这种方法比使用 google.maps.Polygon 具有更好的性能。所以这是我的第一个建议,尝试使用 data layer 而不是正多边形。它不需要剧烈的数据转换,因为数据层具有 addGeoJson(geoJsonObject) 方法,并且您的数据格式为 lat 和 lngs 从中生成一个 GeoJSON Feature 对象应该很容易,它看起来像这样:
{
"type": "Feature",
"properties": { ... },
"geometry": {
"type": "Polygon",
"coordinates": [ [lng1, lat1], [lng2, lat2], .. (your data) ]
}
}
或者使用一些库为您生成它。 data layer 的优势在于它提供了很多功能,例如自定义样式、鼠标事件交互等。我建议您看一下我的 BoundariesExample 示例,它正在利用 Github 上可用的 DataLayer或者这个 answer on SO . (顺便说一下,您还可以像这样轻松地将多边形添加到 Data Layer:map.data.add({geometry: new google.maps.Data.Polygon([coords]) }) 但我建议使用上述方法,因为我稍后会提到的库使用 GeoJSON 格式)
不过,我在 map 上显示了超过 30K 个多边形,其中很多都非常复杂。所以如果你仍然遇到缓慢,我有一些更多的优化建议给你:
1.在 map 上显示多边形之前对其进行简化。也就是说,如果您不介意从多边形中移除一些顶点以换取更好的性能。您可以将所有多边形添加到单个 GeoJSON 对象中,然后利用 mapshaper使用 specialised algorithms 简化它们的实用程序(交互式示例 here)。我不确定该实用程序是否可以作为库包含在 node.js 项目中,因为我将它作为 PHP 的外部实用程序运行,但它可以非常快速地简化多边形。对于 300 个多边形,我怀疑您可以即时执行此操作,当然您也可以缓存结果。如果可以,请使用简化,因为它在所有方法中对性能的影响最大。
2.合并多边形。我发现减少多边形的数量(例如将它们折叠成一个)可以提高性能。如果您的多边形不必作为单独的实体存在(因此,如果它们都可以着色为相同的颜色,则在单击时显示相同的弹出窗口...)您可以合并它们。 mapshaper 的dissolve 命令可以帮助您。
3.添加多个数据层并仅加载 map 上(部分)可见的多边形。因此,例如在更大的缩放级别上,用户甚至看不到数据提供的细节,您可以简化使用方法 1 的多边形,放大时,隐藏上层并显示非简化的多边形,并且仅显示(甚至部分)落在当前 map View 中的多边形。因此,您将为所有多边形计算边界矩形,获取当前 map View 的边界矩形并仅加载那些重叠的矩形。用户移动 map 后,您可以获取其他 map 。当他们再次缩小时,隐藏下层并显示上层。似乎当数据层 features(特征是多边形、线、点或这些的集合)被隐藏时,它们不会影响性能。
当然,您可以组合使用上述技术。您也可以利用 FusionLayer,但这有一些限制(在 docs 中列出),对于 Data 层,您有更多的控制权。
关于javascript - 谷歌地图多边形减慢浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37109726/
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文