显示太多地图标记

时间:2015-10-19 13:44:11

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

我开发了一个具有

的内部应用程序
  • 地图上最多2000个标记(平均每个400-500)
  • 有16种不同的标记图像(针脚颜色)

应用程序最初使用 Apple Maps 开始,然后在过去几个月我们切换到 Google地图。更新:由于性能问题,我们切换回Apple Maps:)

1:谷歌地图的表现非常激烈。

  • 非常低的FPS。当你在地图上添加标记时,它会变得更糟线性
  • 它不关心标记是否在屏幕上可见。你有一个内存足迹。 Apple地图具有重用方法(就像UITableView具有dequeueReusableCellWithIdentifier方法一样),这是一种在屏幕上看不到的标记,节省了大量内存并提高了屏幕绘制速度。谷歌地图所说的关于文档性能的所有内容都是:
  

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

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

与Apple地图相比,谷歌地图是一个非常苗条的框架。我尝试了一切。 Apple地图可以处理2000个引脚而Google地图则不能。

在地图上有300多个引脚时,一定要做什么:

  • 仅在屏幕上添加可见的引脚(这意味着一旦摄像机角度发生变化,您就必须读取标记)
  • 使用群集(仅当屏幕上的可见标记数高于预定义值[MAX_NUM_MARKER]时才使用群集)
  • 检测设备类型并根据它设置预定义的MAX_NUM_MARKER
  • 群集基本上是重新添加地图上的所有引脚。这需要时间太多btw。我们的引脚非常接近,我们设法在地图上保留200-250个引脚(而不是700个)
  • 请勿使用太多不同的图片。尽可能降低图像质量。谷歌文档说,并使用它。

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。 精心设计,易于使用和调整(非官方)库。 您基本上将标记添加到数组中,然后使用&#34; clustering&#34;任何时候需要显示地图上的引脚。

对于那些因为更好的卫星图像质量而想要启动Google地图的人:

看一下Apple iOS9新地图模式: SatelliteFlyover 。现在那就是质量+电池耗尽:D

答案 1 :(得分:1)

Marker Clustering上看,谷歌地图iOS版目前没有正式支持here

正如here所见,你可以做的事情很少