显示太多地图标记

Ali*_*Ali 1 google-maps ios google-maps-sdk-ios

我正在使用iOS版Google Maps API,以显示上面带有大量标记(〜1200)的地图。实际上,显示所有这些标记需要花费很长时间。

您是否会推荐一个解决方案或框架,使我们仅在可见的地图区域上显示标记?

提前致谢。

Yar*_*aro 5

我开发了一个内部应用

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

该应用程序从一开始就使用Apple Maps开始,然后在最近的几个月中,我们切换到了Google Maps。更新:由于性能问题,我们切换回了Apple Maps :)


1:谷歌地图的性能是惊人的。

  • FPS极低。当您在地图上添加标记时,它会线性恶化。
  • 不管标记在屏幕上是否可见。您有内存占用。Apple Maps具有可重用的方法(就像UITableView具有dequeueReusableCellWithIdentifier方法一样),该标记在屏幕上不可见,从而节省了大量内存并提高了屏幕绘制速度。Google地图所说的有关文档性能的全部内容是:

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

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

与苹果地图相比,谷歌地图是一个非常苗条的框架。我已经尝试了一切。苹果地图可以处理2000个图钉,而谷歌地图则不能。

在地图上有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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在屏幕代码上可见标记:

 - (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;
    }
Run Code Online (Sandbox Code Playgroud)

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

对于那些希望通过更好的卫星图像质量来开始制作Google地图的人们:

看看Apple iOS9的新地图模式:SatelliteFlyover。现在多数民众赞成在质量+电池消耗:D