当前位置: 首页 > 知识库问答 >
问题:

iOS版谷歌地图SDK:GMSGroundOverlay位于地球的另一边它的缩放比例小于3.0

充普松
2023-03-14

我试图将图像放置在GMSGroundOverlay中,但当我缩小以缩放时注意到一些奇怪的东西

就像它被包裹在地球的另一面。

  • 用户平移/缩放地图
  • 当他们停下时,我得到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]);

我根据谷歌文档将图像放置在SW,NE:

overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:SW_
                                                     coordinate:NE_];
              self.overlay = [GMSGroundOverlay groundOverlayWithBounds:overlayBounds
                                                                            icon:responseImage_];

这适用于任何高于3.0的缩放级别。

但是当我们缩小时,地图上什么都没有出现,但是如果你向左或向右平移,图像已经映射到地球的另一边。

当缩放时,我不得不打开重叠映射

我尝试了西北/东北/西南/东南组合的每一种组合,但所有相反的角都只是把图像放在了地球的另一边。

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屏幕上显示的矩形相反

共有2个答案

萧英睿
2023-03-14

我也面临同样的问题。尽量不要使用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;
太叔逸春
2023-03-14

深入研究这个问题,对于提出的第一个问题-GMSGroundOverlay位于地球的反面,缩放级别为3.0或更低,看起来罪魁祸首是GMS协同边界initSus协调:坐标:初始化方法标准化坐标,如方法留档:

/**
 * 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是整个可见区域的GMSGroundOverlay覆盖180度的点。缩小,GMSCoordinateBounds将标准化为较小的区域,恰好位于地球的另一边。

这里真正的答案是使用GMSTileLayer。

 类似资料:
  • 还有人发现谷歌地图(现在)允许你平移到两极之外有问题吗?它曾经停在两极,对吗? 每次用户平移或缩放地图时,我正在工作的一个站点都会在我们的服务器上执行基于位置的查询。这会导致错误,因为用户从地图边缘平移触发的查询是荒谬的。 现在,可以说,我正在服务器端处理edge案例,但在客户端这不是一个很好的用户体验。有没有人有防止过度平移的解决方案? 谢谢

  • 最终我胡说八道:我如何在谷歌地图中设置缩放级别,让我所有的标记都变得可见?我读过使用多边形的例子,但我认为这是一个很远的概念?! 那么,有没有一种方法可以在没有多边形的情况下动态缩放? 如果没有,是否有使用多边形的简单示例?我有一个名为gMarkers的数组,其中有一列表示lat,一列表示lng。所以循环通过数组将使用gMarkers[i][1]和gMarkers[i][2]。

  • 我正在使用Android API的GoogleMaps和一个自定义的TileProvider,它使用URL获取缩放/x/y格式的平铺,以显示自定义的世界地图。 这里没什么特别的。该应用程序用于使用开放式街道地图。我注意到,在一定的缩放级别上,它会显示更详细的图像。 与谷歌地图相比,OSM的zoomlevel似乎有所不同。这会导致OSM的URL中出现更高的缩放值,而GoogleMaps会将更低的值放

  • (1)https://stackoverflow.com/questions/34247347/initialize-google-map-to-zoom-to-bounds(2)bounds google maps (3)在google maps android api v2中设置最大缩放级别(4)android map v2缩放显示所有标记 (5)在android中调整google map(a

  • 我有一个网页上的现有地图,使用以下脚本段正确缩放和居中:var mapOptions={center:{lat: 43.57023,lng:-79.48676},缩放: 12}map=newgoogle.maps.Map(document.getElementById(地图画布), mapOptions); 然后,我使用以下命令添加kml层:var myLayer=new google.maps.