Google Maps SDK для iOS: GMSGroundOverlay на противоположной стороне Земли, масштаб менее 3,0

Я пытаюсь поместить изображение в GMSGroundOverlay, но заметил что-то странное при уменьшении масштаба до уровня < 3.0 (мировой уровень). Изображение должно охватывать весь экран iPad, что прекрасно при увеличении>= 3.0. но если я уменьшу изображение, изображение будет за кадром и будет видно, если вы перемещаетесь влево или вправо.

Это похоже на то, как будто оно обернуто вокруг земного шара, но с обратной стороны.


  • Пользователь перемещает / увеличивает карту.
  • Когда они останавливаются, я получаю размеры экрана для ipad, я вызываю веб-сервис, чтобы заставить изображение размещаться на весь экран.
  • Он содержит позиции корабля и альфа-канал, чтобы вы могли видеть карту.

Я нахожу 4 точки карты на iPad.

                        //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 согласно документам Google:

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.

панорамирование влево

2 ответа

Решение

Если углубиться в это, и для первого поднятого вопроса - 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 является точкой, в которой GMSGroundOverlay для всего visibleRegion охватывает 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;
Другие вопросы по тегам