Google iOS 的 Maps SDK:GMSGroundOverlay 在地球的错误一侧,它缩放小于 3.0
Google Maps SDK for iOS : GMSGroundOverlay on wrong side of the Earth it zoom less than 3.0
我试图将图像放在 GMSGroundOverlay 中,但当我缩小到 zoom < 3.0(世界水平)时发现了一些奇怪的东西。
图像应覆盖 iPad 的整个屏幕,这在缩放 >= 3.0 时效果很好。但是,如果我缩小图像,则该图像将放置在屏幕外,并且如果您向左或向右平移则可见。
它就像被包裹在地球的另一边。
- 用户pans/zooms地图。
- 当他们停下来时,我看到了屏幕
ipad 的尺寸 我调用网络服务来获取图像
放置在整个屏幕上。
- 它包含船舶位置和 alpha 通道,因此您可以看到地图。
我在 iPad 上找到了地图上的 4 个点。
//southWest = nearLeft
CLLocationCoordinate2D SW_ = CLLocationCoordinate2DMake([vesselTileRequest_.nearLeft_latitude doubleValue],
[vesselTileRequest_.nearLeft_longitude doubleValue]);
//northEast = farRight = top right of ipad screen
CLLocationCoordinate2D NE_ = CLLocationCoordinate2DMake([vesselTileRequest_.farRight_latitude doubleValue],
[vesselTileRequest_.farRight_longitude doubleValue]);
//-----------------------------------------------------------------------------------
CLLocationCoordinate2D SE_ = CLLocationCoordinate2DMake([vesselTileRequest_.nearRight_latitude doubleValue],
[vesselTileRequest_.nearRight_longitude doubleValue]);
//northEast = farRight = top right of ipad screen
CLLocationCoordinate2D NW_ = CLLocationCoordinate2DMake([vesselTileRequest_.farLeft_latitude doubleValue],
[vesselTileRequest_.farLeft_longitude doubleValue]);
我根据 google 文档将图像放在 SW,NE:
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
coordinate:NE_];
self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
icon:responseImage_];
这适用于任何高于 3.0 的缩放级别。
但是当我们缩小时,地图上什么也没有出现,但是如果您向左或向右平移,图像就会被蜜蜂映射到地球的另一边。
当缩放小于 3.0 时,我不得不关闭重叠贴图。
我尝试了 NW/NE/SW/SE 组合的每个组合,但所有对角都将图像放在地球的错误一侧。
if(self.mapView.camera.zoom < 3.0){
//nothing appears
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NW_
// coordinate:NE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NW_
// coordinate:SW_];
//
//appears but off screen
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NW_
// coordinate:SE_];
// //nothing
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NE_
// coordinate:NW_];
//off screen
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NE_
// coordinate:SW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NE_
// coordinate:SE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:NW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:NE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:SW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:SE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
// coordinate:NW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
// coordinate:NE_];
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
coordinate:SW_];
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
coordinate:SW_];
self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
icon:responseImage_];
//-----------------------------------------------------------------------------------
//// CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(self.mapView.projection.visibleRegion.farLeft.latitude,
//// self.mapView.projection.visibleRegion.farLeft.longitude);
// CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(0.0,
// 0.0);
//
// DebugLog(@"self.mapView.camera.zoom:%f",self.mapView.camera.zoom);
// self.overlay = [GMSGroundOverlay groundOverlayWithPosition:position_farLeft
// icon:responseImage_
// zoomLevel:self.mapView.camera.zoom];
//-----------------------------------------------------------------------------------
}else{
//correct as of docs
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
coordinate:NE_];
self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
icon:responseImage_];
}
我也尝试了其他方法来创建叠加层,但如果我将位置硬编码为 0,0,那么在赤道上。它出现在澳大利亚上空。它又在地球的另一边,它应该在的地方
CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(self.mapView.projection.visibleRegion.farLeft.latitude,
self.mapView.projection.visibleRegion.farLeft.longitude);
CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(0.0,
0.0);
DebugLog(@"self.mapView.camera.zoom:%f",self.mapView.camera.zoom);
self.overlay = [GMSGroundOverlay groundOverlayWithPosition:position_farLeft
icon:responseImage_
zoomLevel:self.mapView.camera.zoom];
结果 - 地图上没有任何内容
如果我点击、按住并平移,图像就会离开屏幕。
如果我也这样做并向右平移,您会看到图像正好位于地球的另一侧,与 ipad 屏幕上显示的矩形
深入研究这个问题,对于提出的第一个问题 - GMSGroundOverlay 在缩放级别为 3.0 或更低时位于地球的背面,罪魁祸首似乎是 GMSCoordinateBounds initWithCoordinate:coordinate:
初始化方法标准化了坐标,根据方法文档:
/**
* Inits the northEast and southWest bounds corresponding
* to the rectangular region defined by the two corners.
*
* It is ambiguous whether the longitude of the box
* extends from |coord1| to |coord2| or vice-versa;
* the box is constructed as the smaller of the two variants, eliminating the
* ambiguity.
*/
事实证明,iPad 在横向模式下,缩放级别 3.0 是整个 visibleRegion
的 GMSGroundOverlay 覆盖 180 度的点。缩小,GMSCoordinateBounds
归一化到较小的区域,恰好是地球的另一边。
真正的答案是使用GMSTileLayer。
我遇到了同样的问题。尽量不要使用 GMSCoordinateBounds。使用 groundOverlayWithPosition:
GMSGroundOverlay *overlay = [GMSGroundOverlay groundOverlayWithPosition:self.mapView.camera.target
icon:image
zoomLevel:self.mapView.camera.zoom];
overlay.bearing = 0;
overlay.map = self.mapView;
overlay.zIndex = 2;
我试图将图像放在 GMSGroundOverlay 中,但当我缩小到 zoom < 3.0(世界水平)时发现了一些奇怪的东西。 图像应覆盖 iPad 的整个屏幕,这在缩放 >= 3.0 时效果很好。但是,如果我缩小图像,则该图像将放置在屏幕外,并且如果您向左或向右平移则可见。
它就像被包裹在地球的另一边。
- 用户pans/zooms地图。
- 当他们停下来时,我看到了屏幕 ipad 的尺寸 我调用网络服务来获取图像 放置在整个屏幕上。
- 它包含船舶位置和 alpha 通道,因此您可以看到地图。
我在 iPad 上找到了地图上的 4 个点。
//southWest = nearLeft
CLLocationCoordinate2D SW_ = CLLocationCoordinate2DMake([vesselTileRequest_.nearLeft_latitude doubleValue],
[vesselTileRequest_.nearLeft_longitude doubleValue]);
//northEast = farRight = top right of ipad screen
CLLocationCoordinate2D NE_ = CLLocationCoordinate2DMake([vesselTileRequest_.farRight_latitude doubleValue],
[vesselTileRequest_.farRight_longitude doubleValue]);
//-----------------------------------------------------------------------------------
CLLocationCoordinate2D SE_ = CLLocationCoordinate2DMake([vesselTileRequest_.nearRight_latitude doubleValue],
[vesselTileRequest_.nearRight_longitude doubleValue]);
//northEast = farRight = top right of ipad screen
CLLocationCoordinate2D NW_ = CLLocationCoordinate2DMake([vesselTileRequest_.farLeft_latitude doubleValue],
[vesselTileRequest_.farLeft_longitude doubleValue]);
我根据 google 文档将图像放在 SW,NE:
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
coordinate:NE_];
self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
icon:responseImage_];
这适用于任何高于 3.0 的缩放级别。
但是当我们缩小时,地图上什么也没有出现,但是如果您向左或向右平移,图像就会被蜜蜂映射到地球的另一边。
当缩放小于 3.0 时,我不得不关闭重叠贴图。
我尝试了 NW/NE/SW/SE 组合的每个组合,但所有对角都将图像放在地球的错误一侧。
if(self.mapView.camera.zoom < 3.0){
//nothing appears
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NW_
// coordinate:NE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NW_
// coordinate:SW_];
//
//appears but off screen
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NW_
// coordinate:SE_];
// //nothing
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NE_
// coordinate:NW_];
//off screen
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NE_
// coordinate:SW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:NE_
// coordinate:SE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:NW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:NE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:SW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
// coordinate:SE_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
// coordinate:NW_];
// overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
// coordinate:NE_];
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
coordinate:SW_];
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SE_
coordinate:SW_];
self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
icon:responseImage_];
//-----------------------------------------------------------------------------------
//// CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(self.mapView.projection.visibleRegion.farLeft.latitude,
//// self.mapView.projection.visibleRegion.farLeft.longitude);
// CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(0.0,
// 0.0);
//
// DebugLog(@"self.mapView.camera.zoom:%f",self.mapView.camera.zoom);
// self.overlay = [GMSGroundOverlay groundOverlayWithPosition:position_farLeft
// icon:responseImage_
// zoomLevel:self.mapView.camera.zoom];
//-----------------------------------------------------------------------------------
}else{
//correct as of docs
overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
coordinate:NE_];
self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
icon:responseImage_];
}
我也尝试了其他方法来创建叠加层,但如果我将位置硬编码为 0,0,那么在赤道上。它出现在澳大利亚上空。它又在地球的另一边,它应该在的地方
CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(self.mapView.projection.visibleRegion.farLeft.latitude,
self.mapView.projection.visibleRegion.farLeft.longitude);
CLLocationCoordinate2D position_farLeft = CLLocationCoordinate2DMake(0.0,
0.0);
DebugLog(@"self.mapView.camera.zoom:%f",self.mapView.camera.zoom);
self.overlay = [GMSGroundOverlay groundOverlayWithPosition:position_farLeft
icon:responseImage_
zoomLevel:self.mapView.camera.zoom];
结果 - 地图上没有任何内容
如果我点击、按住并平移,图像就会离开屏幕。
如果我也这样做并向右平移,您会看到图像正好位于地球的另一侧,与 ipad 屏幕上显示的矩形
深入研究这个问题,对于提出的第一个问题 - GMSGroundOverlay 在缩放级别为 3.0 或更低时位于地球的背面,罪魁祸首似乎是 GMSCoordinateBounds initWithCoordinate:coordinate:
初始化方法标准化了坐标,根据方法文档:
/**
* Inits the northEast and southWest bounds corresponding
* to the rectangular region defined by the two corners.
*
* It is ambiguous whether the longitude of the box
* extends from |coord1| to |coord2| or vice-versa;
* the box is constructed as the smaller of the two variants, eliminating the
* ambiguity.
*/
事实证明,iPad 在横向模式下,缩放级别 3.0 是整个 visibleRegion
的 GMSGroundOverlay 覆盖 180 度的点。缩小,GMSCoordinateBounds
归一化到较小的区域,恰好是地球的另一边。
真正的答案是使用GMSTileLayer。
我遇到了同样的问题。尽量不要使用 GMSCoordinateBounds。使用 groundOverlayWithPosition:
GMSGroundOverlay *overlay = [GMSGroundOverlay groundOverlayWithPosition:self.mapView.camera.target
icon:image
zoomLevel:self.mapView.camera.zoom];
overlay.bearing = 0;
overlay.map = self.mapView;
overlay.zIndex = 2;