在Android应用程序中处理地图的大(形状)数据的最佳方法

时间:2012-10-07 10:18:04

标签: android google-maps google-fusion-tables openstreetmap shapefile

我正在构建Android应用程序的原型,该应用程序应该生成一个多功能的地图,可以处理大量但静态的环境数据,以及将在单独平台上托管的(用户生成的)数据。 我目前的方法是通过谷歌Fusion Tables获取大型静态数据(原始形状文件 - .shp,.dbf,.shx,我已经导出为带有QGisMaps的.kml - 我使用的“较小”.kml是已经66.4MB,最终用于超过140 MB的那个...)我知道有可能切掉.kml这会对加载时间产生影响吗? 您可以在此处{Google}地图https://www.google.com/fusiontables/DataSource?snapid=S717313eWaJ

上查看形状数据的当前示例

但现在我想知道我是否在正确的道路上,因为这一层数据在我的机器上加载速度非常慢而且我不知道将这张地图放入Android应用程序的麻烦 - 更重要的是还可以从单独的服务器获取更多数据,并将其作为另一个(可过滤的)层放在其上。该图层将从用户收集数据,因此不是“静态”,而是定期更新 - 每个地理数据以颜色显示的整数值。

有几个人暗示我使用Open Street Maps,但有些人建议Android使用谷歌地图非常有说服力 - 在开发过程中,我想也许有人可以告诉我,我是选择了正确的方向还是最有可能面临替代解决方案的问题较少。

如果有人能够将来自两个不同来源的地图数据组合到Android中的一个地图上,而一组数据是巨大的但是静态的以及其他用户生成的值,我真的很高兴。

非常感谢您的时间并查看此内容

最好

吉特

编辑#1:我现在正在切换到Open Street Maps,希望能够自己设置一个GeoServer,托管数据并使用App查询WMS。似乎数据的大小仍然需要以某种方式压缩,我会及时更新。

2 个答案:

答案 0 :(得分:1)

我无法解决您的所有问题,但我可以分享一些关于地图和ovelays的经验。

您必须注意的最重要的概念是memory heap。每个Android应用程序都有一个可用于分配数据对象的最大内存量,称为memory heap。此限制因设备而异,从小型旧设备的16MB到新平板电脑的64MB。

话虽如此,如果保存它所需的数据结构超过应用程序可用的最大堆,您将永远无法一次性加载所有数据。

此外,当关键活动(如电话)需要额外内存时,使用大量内存会使您的应用程序更好地被用户或SO终止。

现在,转到地图部分......

我已经使用Google地图以及适用于OpenStreet地图的mapsforge api。 Google地图需要互联网连接,而mapsforge则允许您使用本地地图文件或在线连接。 OpenStree地图不提供卫星视图。

关于性能,在线连接往往更快,因为他们下载已经渲染的地图图像,而离线地图需要根据需要渲染图像。 Mapforges可以使用本地缓存来改善这一点。

显示叠加层:

我已经使用两个API在地图上显示带有大约10.000点的路径,以及其他叠加(罗盘,比例尺,弹出窗口等),并且代码在中等设备中平稳运行。但是,我的代码有一些优化可以通过转换已存在的路径来减少路径的重新创建(当用户缩放或移动地图时)。

祝你好运。

答案 1 :(得分:0)

所以这就是我最终将.shp文件转换为可由OSMdroid的XYTilesource显示的格式的方式。

我单独导出图层,因为.kml投影WGS84并将它们作为图层导入到TileMill。在为CSS中的每个图层定义颜色后,我将地图导出为一组MBTiles。我将它们上传到Mapbox.com。从那里我可以在我的OSMdroid Mapview中获取格式为a.tiles.mapbox.com/v3/myUsername.myTiles/{z}/{x}/{y}.png的图块。

final myTileSource tileSource = new XYTileSource("myTiles", null, 10, 16, 256, ".png", "http://a.tiles.mapbox.com/v3/myUserName.myTiles/");