显示太多的地图标记



我使用iOS的谷歌地图API,显示地图上有大量的标记(约1200)。实际上,显示所有这些标记需要很长时间。

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

提前感谢。

我开发了一个内部应用程序,其中包含

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

应用程序开始使用苹果地图在开始,然后在最后几个月我们切换到谷歌地图。更新:由于性能问题,我们切换回苹果地图:)


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

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

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

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

与苹果地图相比,谷歌地图是一个非常苗条的框架。我什么都试过了。苹果地图可以处理2000个大头针,而谷歌地图不行。

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

  • 只在屏幕上添加可见的引脚(这意味着你必须在相机角度改变时立即读取标记)
  • 使用集群(我只在屏幕上可见标记的数量高于预定义值[MAX_NUM_MARKER]时使用它们)
  • 检测设备类型,并根据它设置预定义的MAX_NUM_MARKER
  • 聚类基本上是重新添加地图上的所有引脚。顺便说一下,这也需要时间。我们的图钉彼此非常接近,我们设法在地图上保持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。设计良好,易于使用和调整(非官方)库。你只需将标记添加到数组中一次,然后在需要显示地图上的引脚时使用"集群"。

对于那些因为更好的卫星图像质量而想开始使用谷歌地图的人:

看看Apple iOS9的新地图模式:卫星天桥。D

iOS版谷歌地图目前还不正式支持标记聚类。

就像在这里看到的,你可以做的事情很少

最新更新