#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 (утилиты карты) для облегчения вычислений.