【问题标题】:Best way to deal with big (shape-)data for map in Android Application在 Android 应用程序中处理地图的大(形状)数据的最佳方法
【发布时间】:2026-01-25 08:45:01
【问题描述】:

我正在为一个 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:我现在切换到 Open Street Maps,希望能够自己设置一个 GeoServer 来托管数据并使用应用程序查询 WMS。数据的大小似乎仍然需要以某种方式压缩,我会及时通知您。

【问题讨论】:

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


    【解决方案1】:

    我无法解决您的所有疑虑,但我可以分享一些我在地图和叠加层方面的经验。

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

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

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

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

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

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

    显示叠加层:

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

    祝你好运。

    【讨论】:

    • 感谢您花时间回答。如果您有关于如何在应用程序中使用 fusiontables 地图的示例/教程的任何有用链接,我将不胜感激。作为开始,我只需要上面链接中的带有 GPS 功能的地图,但很难在网上找到解释清楚的 Android-fusion-table 示例。
    • @birgit 我从来没有使用过融合表,所以恐怕我无法具体帮助你。您可以在此链接中找到:vogella.com/articles/AndroidGoogleMaps/article.html 一个很好的教程,介绍了如何创建一个简单的 android 应用程序,该应用程序在叠加层中显示地图和一些附加信息。如果您遇到问题,请告诉我。
    【解决方案2】:

    这就是我最终将 .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/");
    

    【讨论】:

      最近更新 更多