【发布时间】:2015-10-19 13:44:11
【问题描述】:
我正在使用适用于 iOS 的 Google Maps API 来显示带有大量标记的地图(约 1200 个)。 实际上,显示所有这些标记需要很长时间。
您会推荐一种解决方案或框架,让我们仅在可见地图区域上显示标记吗?
提前致谢。
【问题讨论】:
标签: ios google-maps google-maps-sdk-ios
我正在使用适用于 iOS 的 Google Maps API 来显示带有大量标记的地图(约 1200 个)。 实际上,显示所有这些标记需要很长时间。
您会推荐一种解决方案或框架,让我们仅在可见地图区域上显示标记吗?
提前致谢。
【问题讨论】:
标签: ios google-maps google-maps-sdk-ios
我开发了一个内部应用程序,该应用程序具有
该应用一开始使用 Apple 地图,然后在最近几个月我们改用 Google 地图。更新:由于性能问题,我们切换回 Apple Maps :)
1:谷歌地图的表现非常出色。
如果您要使用相同的图像创建多个标记,请使用相同的 每个标记的 UIImage 实例。这将有助于改善 显示许多标记时应用程序的性能。
但这还不够。我尝试添加 2000 个(1px x 1px 大小,4 色)gif 图像作为 marker.icon,结果是一样的。是的,内存占用从 60MB 减少到 54MB,但是当你移动相机时它仍然滞后。
与 Apple 地图相比,Google 地图是一个非常精简的框架。我已经尝试了一切。 Apple 地图可以处理 2000 个图钉,而 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。 精心设计,易于使用和调整(非官方)库。 您基本上将标记添加到数组中一次,然后在需要显示地图上的图钉时使用“聚类”。
看看Apple iOS9新地图模式:SatelliteFlyover。现在这就是质量+电池消耗:D
【讨论】:
iOS 版 Google 地图目前不正式支持 Marker Clustering,如 here 所示。
正如here 所见,您可以做的工作很少
【讨论】: