как контролировать LatLngBounds.southwest и LatLngBounds.northeast, выходящие за пределы полигона?

#android #google-maps #gis #polygon

#Android #google-карты #гис #полигон

Вопрос:

Я нашел центральную точку, координаты северо-востока и юго-запада, используя latlongbounds, но координаты северо-востока и юго-запада выходят за пределы полигона, как это контролировать

      LatLngBounds latLngBounds = getPolygonCenterPoint(mMap, mLatLngCollection);

 mPolylineOptions.color(Color.GREEN);
 mPolylineOptions.add(latLngBounds.southwest);
 mPolylineOptions.add(latLngBounds.northeast);

 mMap.addPolyline(mPolylineOptions);
 mMap.addMarker(new MarkerOptions()
  .position(latLngBounds.southwest));
 mMap.addMarker(new MarkerOptions()
  .position(latLngBounds.northeast));
 mMap.addMarker(new MarkerOptions()
  .position(latLngBounds.getCenter())); 
  

введите описание изображения здесь

`

 private LatLngBounds getPolygonCenterPoint(GoogleMap mMap, List 
     < LatLng > polygonPointsList) {
      LatLngBounds.Builder builder = new LatLngBounds.Builder();
      for (int i = 0; i < polygonPointsList.size(); i  ) {
       builder.include(polygonPointsList.get(i));
       mMap.addMarker(new MarkerOptions()
        .position(polygonPointsList.get(i)));
      }
      LatLngBounds bounds = builder.build();
      return bounds;
     } 
  

`

Комментарии:

1. можете ли вы добавить некоторые фактические значения для ваших координат, в настоящее время ваши указатели, похоже, не находятся ни в одном из углов bbox (оба из которых вполне могут находиться за пределами полигона) — На вашей картинке я бы ожидал, что SW будет Аделаидой, а NE — на уровне Брисбена (по горизонтали) и Ньюкасла (по вертикали).

2. Во-первых, гораздо проще понять, выровнено ли изображение по северу (что не так) — во-вторых, кажется, вы не понимаете, что такое границы lat lng — это минимальный ограничивающий прямоугольник, содержащий каждую точку, которая, если вы посмотрите на нее с выравниванием по северу, может видеть, что нижняя точка выровнена с Мельбурном (самая южная), а верхняя точка выровнена с брисбейном (самая северная).

Ответ №1:

Вот ограничивающий прямоугольник, использующий точки: Брисбен, Сидней, Мельбурн и Аделаида на карте с северной стороны. Как вы можете видеть, угловые точки NE, SW совпадают с конечными точками вашей зеленой линии. Существует только один случай, когда ограничивающий прямоугольник не будет находиться за пределами содержащегося многоугольника: когда полигон представляет собой прямоугольник, ориентированный вдоль продольных линий и, следовательно, совпадающий с ограничивающим прямоугольником.

Я бы предложил повторить, какова ваша цель — используйте картинку, если это поможет.

Чтобы зеленая линия не выходила за границы полигона, вам пришлось бы вычислять точки пересечения зеленой линии с каждым встреченным ребром, что становится сложной задачей для произвольного случая.

введите описание изображения здесь

В произвольном случае (на фото ниже) я подозреваю, что вам нужна пересекающаяся часть диагонали NE-SW, такая как зеленая линия (сплошная, без тире).

Поскольку у вас есть центральная точка Z и угловые точки NE, SW, вы можете вычислить направление из Z-NE и Z-SW с помощью SphericalUtil.computeHeading . (Hne, Hsw).

Поиск точек пересечения ребер и диагонали лучше всего решить, сначала преобразовав линии в декартову плоскость — вычислите пересечение — и преобразуйте обратно в эллипсоид WGS84 (с ошибкой). введите описание изображения здесь

Графика любезно предоставлена онлайн-инструментом для создания ограничивающей рамки: https://boundingbox.klokantech.com /.

Комментарии:

1. спасибо за ваши усилия, но я этого не понял (Поиск точек пересечения ребер и диагонали лучше всего решается путем первого преобразования линий в декартову плоскость — вычислите пересечение — и преобразуйте обратно в эллипсоид WGS84)

2. Найти точки пересечения на сфере намного сложнее, чем на плоскости. Для преобразования в плоскость предположим, что Z является началом координат, и вычислите положения x / y всех рассмотренных точек (A, B, C, D, NE, SW). Затем используйте подход, подобный этому: rbrundritt.wordpress.com/2008/10/20 / … . Затем преобразуйте x / y обратно в длину широты. Используйте SphericalUtil и PolyUtil (утилиты карты) для облегчения вычислений.