Учитывая набор координат, как я могу вычислить минимальные границы?


13

У меня есть набор координат в lon / lat. Всегда есть как минимум 3 упорядоченные координаты, которые образуют поли (если они были спроецированы на плоскость). Как я могу рассчитать минимальные границы для этих координат в виде набора допустимых диапазонов долготы и широты? (под «действительным» я подразумеваю диапазоны, которые явно учитывают антимеридиан). Трудно объяснить, что я ищу, поэтому у меня есть картинка.

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

Случай на картинке тривиален; Вы просто находите абсолютный минимум и максимум для всех точек. Это не работает для всех случаев, хотя. Есть ли общее решение?

Изменить: Чтобы уточнить, что я имею в виду под «действительным», скажем, что в моем наборе данных было три значения долготы: -76, -135 и 164. Значения пересекают антимеридиан, и я хотел бы, чтобы результирующие диапазоны были разделены: -76 до -180 и от 164 до 180.

Еще несколько уточнений. Точки образуют многоугольник, поэтому в некоторых случаях требуемый диапазон может быть от -180 до +180 (т. Е. Все 360 градусов):

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

Изображение слева показывает долготу четырех координат, которые встречаются на одной «половине» Земли. Представьте, что вы смотрите на северный полюс (черная точка). Розовый цвет показывает минимальный продольный диапазон, который охватывает многоугольник (многоугольник показан между четырьмя точками фиолетового цвета). Случай слева будет иметь два продольных диапазона: [-180 до -120] и [135 до 180] (просто визуально оценивая его)

На изображении справа показан другой случай, когда точки движутся вокруг Земли. Этот диапазон будет [-180 до 180].


1
Я никогда раньше не рассматривал эту проблему, это отличный вопрос. Еще один пример того, как плоская земля облегчит нашу работу! Я с нетерпением жду некоторых решений этого.
скорби

Я думаю, что вы должны быть более четко выражены в отношении «(под« действительными »я подразумеваю диапазоны, которые явно учитывают антимеридиан) - я предполагаю, что слово минимум должно идти перед границами в вопросе.
Ян Тертон

Можете ли вы повторно добавить свое изображение, это может помочь объяснить вашу проблему.
Mapperz

1
iant: явно уточненный «действительный» Mapperz: повторно добавить? это не появляется? Я вижу это хорошо.
Pris

1
Ну, координаты в долготе / широте и используются для запроса базы данных для получения географических данных. Строго говоря, вы можете преобразовать это в чисто математическую задачу (хотя это можно сказать о многих вещах в ГИС)
Pris

Ответы:


5

Надеюсь, я правильно понял вопрос ...

Мы можем решить проблему для долготы и широты отдельно, поэтому я возьму ваш пример с долготой: -76, -135 и 164.

Сначала я бы заказал их:

-135, -76, 164

Тогда я бы добавил левую координату справа снова: -135 + 360 = 225

-135, -76, 164, 225

Теперь мы можем рассчитать промежутки между координатами:

-135 (59) -76 (240) 164 (61) 225
             .......

Самый большой зазор (240) должен быть границей минимального ограничивающего прямоугольника, той части, которая не принадлежит этому прямоугольнику. Пунктирная линия - самая большая часть круга, которую мы можем выделить. В нашем примере это означает, что граничная рамка начинается с 164, включает -135 и заканчивается -76.


Это работает для большинства случаев, я думаю. Но рассмотрим мой пример с дополнительной долготой (+60) [в качестве четвертой точки в поли]. В этом случае я бы хотел от -180 до 180. Используя ваш метод, я бы получил от 61 до 180 и от -76 до -180.
Pris

@Pris - То есть вы хотите, чтобы долгота 180 / -180 (в конце концов, это одна и та же точка) была частью поля в каждом случае, даже если это не самое маленькое поле?
martinstoeckli

Я думаю, что ключевое отличие здесь состоит в том, что точки образуют многоугольник. Смотрите мое редактирование.
Прис

@Pris - О, хорошо, это выглядит действительно сложно. Это похоже на то, что каждая точка ребра между двумя точками считается также точкой вершины.
martinstoeckli

1

Это действительно легко сделать в Javascript с помощью API Карт Google. Вот как вы могли бы сделать это на стороне клиента с этим API:

var bounds = new google.maps.LatLngBounds();

//Recursively loop through your coordinate list
    latLng = new google.maps.LatLng(<YourLat>, <YourLon>);
    bounds.extend(latLng);
//

extentBox = new google.maps.Rectangle({
    bounds: bounds,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35
});
extentBox.setMap(map);

Привет, спасибо за ответ, однако я ищу реальный метод, а не вызываю API или использую уже существующее решение.
Pris

Вы дали мне метод bounds.extend, я искал это точное решение, так что спасибо!
Томсон Комер

Это работает с полигонами? Я вижу, что вы используете Rectangle.
Дэнни Джи

1

Я думаю, я мог бы найти способ сделать это. Моя предварительная реализация работает, но я не уверен, есть ли какие-то крайние случаи, которые я пропустил. Если с этим решением что-то не так, пожалуйста, укажите на это.

Учитывая то, что я занимаюсь получением диапазонов lon / lat для многоугольника, а не только для точек, которые его составляют, один из способов решения проблемы - фактически «пройти» вдоль набора упорядоченных координат от начала до конца. Вы отслеживаете, насколько далеко по часовой стрелке и против часовой стрелки вы прошли относительно центра Земли с учетом начальной точки, и продолжаете движение, пока не пройдете полигон:

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

Вы можете получить диапазон того, как далеко CW и CCW вы путешествуете от вашей начальной точки ... это дает вам достаточно информации для получения правильных границ в обычном случае (слева на рисунке). В случае, когда многоугольник полностью вращается или пересекает центр, возвращаемый угол перемещения будет 360 градусов.

Этот метод также работает, когда многоугольник «обнимает» поверхность Земли, а не пересекает ее. Таким образом, если у вас есть многоугольник, показывающий кого-то, путешествующего по поверхности Земли от Торонто (отр .: -79) до Лондона (отн .: -5) до Токио (отн .: 139) и обратно (в том же порядке), вы будете получить диапазон [от -79 до 139].

Если многоугольник пересекает центр (представьте две соседние точки в +90 и -90), я считаю, что это полный цикл (360 градусов), хотя вы можете пойти в любом случае.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.