我使用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版谷歌地图目前还不正式支持标记聚类。
就像在这里看到的,你可以做的事情很少