在原生Android应用程序的地图上显示KML图层最佳实践

我有一个大的KML文件到原生Android应用程序,请检查以下详细信息并提供建议。

KML文件详细信息

  • 大小 :1.7 MB
  • kml文件元素的总数 :500个元素
  • 多边形的总数 :1000多边形

Android应用详情

  • 以上详细信息将在Fragment中查看
  • 我使用以下支持库来实现此屏幕编译’com.google.maps.android:android-maps-utils:0.4+’
  • 加载屏幕时会进行一些计算(如距离计算)

问题

  • 花费大量时间加载地图和kml图层大约8秒创建KMLLayer实例

以良好的性能实施上述细节的最佳做法是什么?

请指教。

最佳实践是在后台进行长时间操作(例如,在单独的线程上)并将复杂的任务分成小部分。 所以你可以:

1)尽快创建并开始加载KML图层(例如在app创建时),而不仅仅是显示它;

2)使用包含500个元素和1000个多边形的50 kml文件而不是一个kml文件,使用50个kml文件,包含10个元素和100个多边形,并加载到仅分层必要文件(例​​如,您可以按区域位置,或通过语义信息或某些内容进行分割其他标准);

3)结合1和2分;

4)精确地用于谷歌地图,可以使用来自kml文件的信息创建切片并使用TileProvider。

由于没有实际的答案,我会发布自己的解决方案。

我主要做了两件事来优化它。

  1. 而不是使用谷歌地图utils内置方法addLayerToMap – 我使用了自己的自定义实现。 我已经这样做了,因为解析kml相对较快(在我的情况下 – 约5-10秒),它可以在后台线程中完成。 但是,将所有点添加到地图需要10秒以上,并且必须在UI线程上完成。 基本上,我使用KmlLayer类作为基础,并将我自己的kml文件解析为polygonOptions和我需要的所有其他东西。

  2. 计算哪些项目可见,哪些不可见。 首先,我过滤哪些项目在屏幕范围之外。 之后,我计算每个项目的大小(以像素为单位,无米) – 如果项目小于阈值 – 项目也被过滤掉。

应用这些黑客,而不是冻结应用程序15秒,用户可以自由地浏览地图,当他停止时,几秒钟后将显示信息。

我只是对屏幕行为进行了一些更新,以通过以下步骤获得良好的性能和良好的用户体验:

  1. KML文件分为65个文件(地图上的主要区域,例如,区域A11位于一个KML文件中,它包含所有细节,如区域A11-1,区域A11-2和区域A11-4 ……并且这种划分是为了适合屏幕体验(例如用户要求)

  2. 在第一次加载时,我只加载所有KML中心的标记,这不会影响性能

  3. 当用户单击标记时,我正在加载此区域的KML文件并缩放此区域

  4. 当用户缩小时,我将从地图中删除此图层并加载标记

  5. 当用户移动地图时,我正在计算最近的标记并加载其KML图层

注意 :在启动应用程序时准备文件不会提供更好的性能,因为糟糕的性能来自将KML图层添加到Google地图

注意2 :使用自定义实现来解析和添加到Google地图需要花费大量时间或需要大量的unit testing,我认为这不是推荐的解决方案,因为最好将此解决方案留在Google Map utils内置方法上(它是定制的,总是最新的)