0

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

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

有几个人暗示我要使用 Open Street Maps,但有些人建议 Android 与 Google Maps 配合得非常好——在开发过程中,我想也许有人可以告诉我,我是否选择了正确的方向,或者最有可能面临更少的问题替代解决方案。

如果有人能就将来自两个不同来源的地图数据组合到 Android 中的一张地图上的问题向我提出建议,我将非常高兴,而一堆数据很大但静态,而其他用户生成的值。

非常感谢您的时间和查看这个

最好的比尔吉特

编辑#1:我现在切换到开放街道地图,希望能够自己设置一个地理服务器来托管数据并使用应用程序查询 WMS。看起来数据的大小仍然需要以某种方式压缩,我会及时更新。

4

2 回答 2

1

我无法解决您的所有问题,但我可以分享一些我在地图和覆盖上的经验。

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

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

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

现在,进入地图部分......

我使用 Google 地图和 mapsforge api 来制作 OpenStreet 地图。谷歌地图需要互联网连接,而 mapsforge 允许您使用本地地图文件或在线连接。OpenStree 地图不提供卫星视图。

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

显示叠加层:

我已经使用这两个 API 来显示地图上大约 10.000 个点的路径,以及额外的叠加层(指南针、比例尺、弹出窗口等),并且代码在中端设备中运行顺畅。但是,我的代码进行了一些优化,通过转换已经存在的路径来减少路径的重新创建(当用户缩放或移动地图时)。

祝你好运。

于 2012-10-07T13:24:43.243 回答
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/");
于 2012-10-26T21:30:33.927 回答