【问题标题】:Display too many map markers显示太多地图标记
【发布时间】:2015-10-19 13:44:11
【问题描述】:

我正在使用适用于 iOS 的 Google Maps API 来显示带有大量标记的地图(约 1200 个)。 实际上,显示所有这些标记需要很长时间。

您会推荐一种解决方案或框架,让我们仅在可见地图区域上显示标记吗?

提前致谢。

【问题讨论】:

    标签: ios google-maps google-maps-sdk-ios


    【解决方案1】:

    我开发了一个内部应用程序,该应用程序具有

    • 地图上最多 2000 个标记(平均 400-500 个)
    • 具有 16 种不同的标记图像(图钉颜色)

    该应用一开始使用 Apple 地图,然后在最近几个月我们改用 Google 地图。更新:由于性能问题,我们切换回 Apple Maps :)


    1:谷歌地图的表现非常出色。

    • 非常低的 FPS。当您在地图上添加标记时,它会线性变得更糟。
    • 它不关心标记是否在屏幕上可见。你有一个内存占用。 Apple 地图有重用方法(就像 UITableView 有 dequeueReusableCellWithIdentifier 方法一样)在屏幕上不可见的标记,节省大量内存并提高屏幕绘制速度。 Google 地图对文档性能的评价如下:

    如果您要使用相同的图像创建多个标记,请使用相同的 每个标记的 UIImage 实例。这将有助于改善 显示许多标记时应用程序的性能。

    但这还不够。我尝试添加 2000 个(1px x 1px 大小,4 色)gif 图像作为 marker.icon,结果是一样的。是的,内存占用从 60MB 减少到 54MB,但是当你移动相机时它仍然滞后。

    与 Apple 地图相比,Google 地图是一个非常精简的框架。我已经尝试了一切。 Apple 地图可以处理 2000 个图钉,而 Google 地图则不能。

    在地图上有 300 多个图钉时要做什么:

    • 仅在屏幕上添加可见的大头针(这意味着您必须在摄像机角度发生变化时立即读取标记)
    • 使用集群(我只在屏幕上可见标记的数量高于预定义值 [MAX_NUM_MARKER] 时才使用它们)
    • 检测设备类型并根据它设置预定义的MAX_NUM_MARKER
    • 聚类基本上是重新添加地图上的所有引脚。顺便说一句,这也需要时间。我们的图钉彼此非常接近,我们设法在地图上保留了 200-250 个图钉(而不是 700 个)
    • 不要使用太多不同的图钉图像。尽可能降低图像质量。并按照 Google 文档的说明使用它。

    MAX_NUM_MARKER 码:

    int MAX_NUM_MARKER = 200;    
    if (IS_IPAD) {
            if ([[[UIDevice currentDevice] platformString] isEqualToString:@"iPad 1G"]) {
                MAX_NUM_MARKER = 150;
            } else if ([[[UIDevice currentDevice] platformString] isEqualToString:@"iPad 2G"]) {
                MAX_NUM_MARKER = 200;
            } else if ([[[UIDevice currentDevice] platformString] isEqualToString:@"iPad 3G"]) {
                MAX_NUM_MARKER = 300;
            } else if ([[[UIDevice currentDevice] platformString] isEqualToString:@"iPad 4G"]) {
                MAX_NUM_MARKER = 400;
            } else {
                MAX_NUM_MARKER = 400;
            }
        } else {
            if (IS_IPHONE_6 || IS_IPHONE_6P) {
                MAX_NUM_MARKER = 400;
            } else if (IS_IPHONE_5) {
                MAX_NUM_MARKER = 300;
            } else if (IS_IPHONE_4_OR_LESS) {
                MAX_NUM_MARKER = 150;
            } else {
                MAX_NUM_MARKER = 500;
            }
        }
    

    标记在屏幕代码上可见:

     - (BOOL)isMarkerVisibleOnMap:(GMSMarker*)marker {
    
            float padding = 0.0f;
    
            CGPoint point = [map.projection pointForCoordinate:marker.position];
    
            if (point.x >= -padding && point.y >= -padding && point.x <= map.frame.size.width+padding
                && point.y <= map.frame.size.height+padding) {
                return YES;
    
            }
    
            return NO;
        }
    

    对于集群,我们使用了 gitHUb 上的 https://github.com/googlemaps/google-maps-ios-utils。 精心设计,易于使用和调整(非官方)库。 您基本上将标记添加到数组中一次,然后在需要显示地图上的图钉时使用“聚类”。

    对于那些因为更好的卫星图像质量而考虑开始使用 Google 地图的人:

    看看Apple iOS9新地图模式:SatelliteFlyover。现在这就是质量+电池消耗:D

    【讨论】:

      【解决方案2】:

      iOS 版 Google 地图目前不正式支持 Marker Clustering,如 here 所示。

      正如here 所见,您可以做的工作很少

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 2017-10-25
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 2016-02-04
        • 2021-02-06
        • 2015-02-11
        相关资源
        最近更新 更多