jps*_*nyx 2 asp.net google-maps kml
我正在为我正在开发的使用Google Map的应用程序寻找建议.
摘要: 用户具有用于搜索满足条件的街道段的标准列表.街道段将用3种颜色着色,以显示低于平均值,平均值和超过平均值的那些.然后,用户点击街道段以查看信息窗口,该信息窗口显示该特定段的属性,隐藏那些未选择的段,直到他/她关闭窗口并且其他折线再次可见.这看起来很像Hasbro城市街道游戏Hasbro在一个月前制作的不同之处在于我不使用Flash,我不能使用Open Street Map,因为它没有列出街道段(如果ID不会是无论如何)我并没有显示谷歌草图建设.
信息: 我有一个街道数据库,包括ID,折线点和质心.该数据库中有6,000,000个街段记录.为了缩小生成的数据,我们将重点放在城市上.我们必须展示的最大城市有250,000个街道段.这意味着要显示250,000个线段折线.
我们最长的折线使用9600个字符,存储在SQL Server 2008中的两个8000 varchar列中.
我们需要使用API v3,因为它比API v2更快,应用程序将移植到iPhone.目前它是带有SQl Server 2008应用程序的ASP.NET 3.5.绩效是一个优先事项.
问题: 执行此操作的大多数演示项目都是使用API v2制作的.因此,除了Google API v3参考页面上的教程之外,我没有比较性能或技术用途来实现我的目标.API v3还没有可用的.NET包装器.
生成250,000个线段折线会创建一个繁重的文件,需要时间来传输和解析.(我已经找到了一条390,000点折线的演示.我认为编码器的效率会低得多,因为轮数会减少,因此点数会减少.)由于街道段是根据标准显示的,因此必须动态创建折线和缓存不能使用.
一些想法:
KML/KMZ:
优点: 由于它是一个标准,我们可以轻松加载Bing地图,雅虎!地图,Google地图,Google地球,使用相同的KML文件.数据生成将是相同的.
缺点: KML中的LineString不能像谷歌地图API那样可以处理编码折线.因此显示它可能会更大更慢.以大小压缩文件需要更多的处理时间并且需要客户端解压缩数据,我不太确定iPhone将如何处理250,000个数据以及服务器如何处理40个用户同时浏览.
JavaScript文件:
优点: JavaScript文件可以编码折线,并会显着减少要传输的文件.
缺点: 必须创建我自己的剥离版API v3以添加叠加,创建折线等.它比创建KML文件并指向源更复杂.
GeoRSS: 我认为这个选项不适合我的需求,但我可能错了.
MapServer: 我看到一些建议使用MapServer生成叠加层的帖子.不太确定与我们的数据库的连接以及它将给出的性能.此外,它需要一个插件来生成KML.在我看来,它不会让我做得比创建自己的KML或JavaScript文件更好.没有,维护会更简单.
垄断城市街道: 游戏现在已经结束,但对于那些知道我在说什么的人来说,Monopoly City Streets只能在最大缩放级别上显示质心位于窗口边界内的街道.移动地图是向服务器发送请求以显示新街道.虽然我认为这是巧妙的,但我不知道如何实现类似的东西.我唯一想到的就是比较长度是否在地图区域X的范围内并且与Y相同.虽然这可以在高缩放级别显着提高性能,但在显示整个城市时这没有任何意义.
聚类: 虽然聚类对于标记很棒,但似乎我们不能聚类折线.我会喜欢像 MarkerClusterer这样的折线,并能够通过我的3折线颜色进行聚类.这可能会留下"本来会吓人的但是会忘记它".
箭头: 我将在未来的版本中显示折线的方向,并且必须在质心处显示箭头.加载图片或标记只会使我的数据加倍,因此创建自定义叠加层可能是我唯一的选择.我已经找到了类似我希望实现的类似的演示.不幸的是,演示非常慢,但我只希望每个折线显示1个箭头而不是像演示一样多个.此功能将取决于数据的格式,因为我认为KML不支持自定义叠加.
标准: 虽然应用程序是使用ASP.NET 3.5完成的,但iPhone的端口不会使用Web来显示应用程序,并且在屏幕大小方面会选择条件.这就是为什么我更倾向于根据参数传递的标准生成文件的服务或页面.该服务将生成我需要在地图上显示折线的文件.我还可以创建一个执行此操作的aspx页面.aspx页面比服务方式更具文档记录.应该有理由.
问题:
XDocument
XmlDocument 创建文件更快,XmlWriter
这是手动还是仅序列化流中的街道段?这是一个头脑风暴Stack Overflow问题,而不是实际的代码问题.任何有助于缩小可能性的答案都与拥有所有知识的人一样好,可以指出我更好的选择.
Mik*_*ams 10
短GPolylines的大量运行大量比长GPolylines的少量慢.
Google Maps v2和Google Maps v3之间的速度差异不会很大,因为大部分CPU时间将由浏览器的实际图形系统占用.Google地图使用VML,SVG或Canvas图形系统,具体取决于浏览器.其中,VML是目前最慢的,只要浏览器是MSIE就可以使用.
在着手处理250,000个线段之前,我建议你看一下200个随机折线的快速测试.尝试在MSIE中缩放和调整该地图.
然后,还要考虑需要从服务器发送到客户端以指定250,000个线段的数据量.数据量将根据您选择KML还是JSON或GeoRSS而有所不同,但如果每个线段最终需要20个字节,则需要50秒才能获取1兆位宽带连接.考虑您的用户是否准备好坐50秒左右.
真正有意义的唯一解决方案是执行Google为其流量覆盖做的事情,并将线条绘制到服务器中的切片上,并将这些切片显示为客户端中的GTileLayerOverlay.
您需要的是一个空间感知数据库,以及像gd或ImageMagik这样的服务器端图形库.客户端要求服务器提供磁贴.如果缩放高于某个级别,则服务器扫描数据库以查找具有与所请求的块的边界框重叠的边界框的线段,并使用图形库来绘制它们.
缩放级别限制用于限制数据库和服务器需要执行的工作量.您不希望最终将250,000个线段绘制到单个缩小的区块上,因为这对于服务器来说是非常艰苦的工作,并且对用户来说并不是很重要.
关于点击处理:
最简单的方法是监听地图上的点击,而不是对象,并将点击详细信息发送到服务器.然后,服务器使用单击位置搜索空间感知数据库,并返回所单击对象的详细信息(如果有).客户端代码执行此操作:
GEvent.addListener(map,"click",function(overlay,point) {
var url="clickserver.php?lat=" + point.lat() + "&lng=" +point.lng();
GDownloadUrl(url, function(html) {
if (html.length) {
map.openInfoWindow(html)
}
});
});
Run Code Online (Sandbox Code Playgroud)
更难的是当指针在折线上时处理光标的更改.有一种已知的技术可以对小标记进行光标更改,其工作原理如下:
每当提取一个tile时,.getTileUrl()也会调用一个服务器,该服务器返回该tile的热点框列表.当鼠标移动时,客户端会不断计算鼠标所在的图块,然后扫描相应的热点框列表.
谷歌自己在他们的GLayer()代码中添加了执行四叉树搜索的复杂性,以加快搜索图块中的热点,但是在自己的代码中实现此策略的其他人认为这不是必需的,并且线性扫描热点列表的速度足够快.
我不知道如何将其扩展到在折线检测上处理光标.
归档时间: |
|
查看次数: |
2103 次 |
最近记录: |