Як задати набір координат, як я можу обчислити мінімальні межі?


13

У мене є набір координат у lon / lat. Завжди є щонайменше 3 упорядковані координати, які утворюють полі (якщо вони проектувалися плоскими). Як я можу обчислити мінімальні межі для цих координат як набір дійсних діапазонів довготи та широти? (під "дійсним" я маю на увазі діапазони, які явно відносять до антимеридіану). Це важко пояснити, що я шукаю, щоб у мене з'явилася картина.

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

Справа на малюнку тривіальна; ви просто знайдете абсолютний мінімум і максимум для всіх балів. Це працює не у всіх випадках. Чи є загальне рішення?

Редагувати: Щоб уточнити, що я маю на увазі під терміном "дійсний", скажіть, що у моєму наборі даних було три значення довготи: -76, -135 та 164. Значення перетинають антимеридіан, і я хотів би поділити отримані діапазони: -76 до -180 І 164 до 180.

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

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

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

Зображення праворуч показує інший випадок, коли точки проходять весь шлях навколо Землі. Цей діапазон був би [-180 до 180].


1
Я ніколи раніше не розглядав цю проблему, її велике питання. Ще один приклад того, де рівна земля полегшила б наші робочі місця! Я з нетерпінням чекаю на вирішення цього питання.
sgrieve

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

чи можете ви знову додати своє зображення, це може допомогти пояснити свою проблему.
Mapperz

1
iant: явно уточнений 'дійсний' Mapperz: повторне додавання? це не відображається? Я бачу це чудово.
Приз

1
Координати добре знаходяться в lon / lat і використовуються для запиту бази даних для отримання географічних даних. Власне кажучи, ви можете перетворити це на чисту математичну задачу (хоча це можна сказати про багато речей у ГІС)
Пр

Відповіді:


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 - Отже, ви хочете, щоб довгота 180 / -180 (це все-таки той самий момент), щоб в будь-якому випадку була частиною коробки, навіть якщо це не найменший можливий ящик?
martinstoeckli

Я думаю, що ключова відмінність тут полягає в тому, що точки утворюють багатокутник. Дивіться мою редакцію.
Приз

@Pris - Ну добре, це виглядає дуже хитро. Це як кожна точка ребра між двома точками, також вважається точкою вершини.
martinstoeckli

1

Це дуже просто зробити в Javascript за допомогою API Google Maps. Ось як ви це зробите на стороні клієнта з цим 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 або використовувати попереднє рішення.
Приз

Ви дали мені метод bounds.extend, я шукав саме це рішення, тож дякую!
Thomson Comer

Це працює з багатокутниками? Я бачу, як ви використовуєте прямокутник.
Danny G

1

Я думаю, що я, можливо, знайшов спосіб це зробити. Моя попередня реалізація працює, але я не впевнений, чи є якісь крайні випадки, які я пропустив. Якщо в цьому рішенні щось не так, будь ласка, вкажіть це.

Зважаючи на те, що я переймаюся тим, щоб отримати діапазони lon / lat для багатокутника, а не лише точки, що їх складають, один із способів спроби задачі - насправді "пройтись" за набором упорядкованих координат від початку до кінця. Ви відслідковуєте, наскільки далеко та за годинниковою стрілкою ви проїхали відносно центру Землі за заданою початковою точкою та продовжуєте рухатись, поки не завершите багатокутник:

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

Ви можете отримати діапазон того, як далеко та КВП ви проїжджаєте від початкової точки ... це дає достатню інформацію для отримання правильних меж у звичайному випадку (зліва на зображенні). У випадку, коли полігон повністю проходить навколо або прорізається по центру, повернутий кут ходу становитиме 360 градусів.

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

Якщо багатокутник прорізається по центру (уявіть дві сусідні точки в точці +90 та -90), я вважаю це повним пробігом (360 градусів), хоча ви можете піти в будь-який бік.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.