Як обчислити обмежувальне поле з декількох шарів у лат / довгому?


11

Я пишу заявку на тестування продуктивності всіх видів картографічних послуг, насамперед AGS 9.x, AGS 10 та WMS 1.x.

Частина програми передбачає генерування випадкових обмежувальних коробок для індивідуальних запитів в межах усієї послуги. Ця частина чудово працює для географічних та проектованих систем координат, коли відомий повний обсяг послуги (наприклад, через властивість fullExtent служби AGS).

Моя проблема полягає у WMS: кожен шар у відповіді GetCapability може визначати свою обмежувальну область у> = 1 CRS. У деяких частинах програми потрібно знати, чи є CRS сервісу географічним чи прогнозованим, тому для усунення неоднозначності в WMS я завжди використовую шар LatLonBoundingBox шару, який завжди визначається і в EPSG: 4326. Тоді я повинен обчислити повне поле обмеження служби на основі всіх шарів, які входять в індивідуальний запит (які рандомізовані). Тут стає хитро.

Я втрачаюсь, тому що для кожного обмежувального поля лат / лон LLx (нижня ліва довгота) може бути більшим чи меншим числом, ніж URx (верхня права довгота), залежно від того, на яких меридіанах він охоплюється. Кожен раз, коли я починаю малювати квадратні або кругові діаграми, я думаю, що я з'ясував підхід, а потім знаходжу випадок, який його руйнує, і мій мозок перетворюється на кашку.

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


Гаразд, у цій статті: stonybrook.edu/libmap/coordinate/seriesa/no2/a2.htm (розділ "Глобальний готс") я прочитав "На жаль, не існує простого і елегантного рішення для вирішення глобальних проблем". Я думаю про сканування всіх розширень шару, і якщо URx <LLx просто встановити ступінь до -180 +180. Ця ж стаття передбачає, що більшість ГІС розділить багатокутник з цими координатами на дві окремі функції.
tomfumb

Ще кілька ключових слів для пошукових систем, оскільки у мене просто виникли проблеми знову знайти цю чудову посаду: мінімальне обмежувальне поле, об’єднання декількох обмежувальних коробок, міжнародна лінія дат, розрив, мінімальний сегмент кола
letmaik

Відповіді:


6

Посилана стаття продумана. Тим НЕ менше, я вважаю , що це «просте і елегантне» рішення: для наборів географічних даних, є два види обмежує коробки. Ті, хто не перетинає меридіан + -180, можуть зберігатися та шукатись, як завжди. Ті, хто перетинає меридіан + -180, можуть зберігатися у напівдоповнювальній формі: а саме зберігати діапазон широт як зазвичай, а натомість зберігати діапазон довжин, не включений у поле (та трохи перемикати, щоб вказати, яка форма зберігання використовується). По суті, не потрібно вносити жодних змін до географічних покажчиків або структур дерев пошуку; для алгоритмів пошуку потрібна лише незначна модифікація.

У будь-якому випадку, ось вирішення самого питання.


Я припускаю, що ви передбачаєте, що вхід є послідовністю дескрипторів обмежувальної коробки ((LLx, LLy), (URx, URy)), де:

  • -540 <= LLx, -180 <= URx, LLx <= 180 і URx <= 180. Також -90 <= LLy <= URy <= 90.

  • точка в (довгота, широта) = (x, y) вважається лежати в межах ВВ тоді і тільки тоді

    1. LLy <= y <= URy і

    2. або LLx <= x <= URx, або LLx - 360 <= x <= URx.

Для виведення ви хочете параметри для найменшого обмежувального поля, що містить об'єднання всіх входів.

Очевидно, що y-межі мінімального обмежувального поля (MBR) будуть мінімальними та максимумами y-значень. Для x-меж використовуйте розгортку рядка, щоб знайти найбільший проміжок .

Ось опис алгоритму. Для ілюстрації цього припустімо, що вхід складається з чотирьох коробок,

((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))

Ось схема полів (червоним кольором) та MBR (чорним кольором) першого, потім перших двох, потім перших трьох, потім усіх коробок.

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

Зверніть увагу, як на другому кроці коробки у східній та західній півкулях оточені MBR, який перетинає меридіан + -180 градусів, завдяки чому він виглядає як два окремих поля на цій карті. На останньому кроці MBR необхідно розширити на схід, щоб розмістити невеликий ящик між Південною Америкою та Антарктидою.

  1. Витягніть всі x-координати коробок, обчисліть їх по модулю 360 (щоб розмістити їх у діапазоні -180..180), відсортуйте їх у порядку зростання та додайте до кінця перше значення (збільшене на 360 градусів), щоб згорнути їх навколо:

    -149, -90, -81, -77, -69, -36, 77, 156, 211
    

    (Зауважте, що 211 та -149 - той самий меридіан.)

  2. Подумайте про кожну координату x як на інтервал між попередньою координатою (але не враховуючи це попереднє значення) та її. Наприклад, -77 представляє всі значення від -81 до -77, але не включає -81. Для кожного з них після першого підрахуйте кількість полів, що містять цей інтервал.

    1, 0, 1, 0, 1, 0, 1, 0
    

    Наприклад, перший "1" означає, що один ящик охоплює інтервал від -149 до -90. (Це третя скринька.)

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

  3. Обчисліть перші відмінності відсортованих x-координат у (1).

     59, 9, 4, 8, 33, 113, 79, 55
    

    Зіставте їх з підрахунками покриття в (2). Знайдіть найбільшу різницю, для якої кількість покриття дорівнює 0. Тут вона дорівнює 113шостому елементу попереднього масиву. Це найбільший розрив у довготі, що залишився від колекції ящиків.

    (Цікаво, що можливість того, що максимум виникає в більш ніж одному місці, показує, що рішення не обов'язково унікальне! Для набору вікон може бути більше одного MBR. Ви можете визначити унікальний, додавши додаткові умови, наприклад, необхідні щоб середня відстань в межах MBR до меридіана + -180 була якомога більшою; щоб вирішити крапку, виберіть (скажімо) найсхідніший варіант рішення.)

  4. Знайдіть відповідний інтервал: тут це від -36 до 77. Це діапазон довжин, не в MBR. Тому візьміть його доповнення в діапазоні від -180 до 180. Тут доповнення є двома непересічними інтервалами: один від -180 до -36 та інший від 77 до 180. Крім того, представляйте доповнення як єдиний прямокутник, можливо простягаючи + -180 градусів меридіана: від -283 до -36 тут (або, що еквівалентно, від 77 до 324).

  5. Використовуйте min та max y-значень для кутів MBR.

    ((-283, -85), (-36, 81))
    

В останньому реченні пункту 4, чому ви пишете "від -283 до -36". Чому б не від 77 до -36?
letmaik

1
@neo Тому що "77 до -36" - це порожній інтервал. (За визначенням, інтервал [a, b] складається з усіх чисел x таким, що a <= x <= b. При a = 77 і b = -36 таких чисел немає.) Можна реагувати, сказавши "добре що стосується довготи, то 77 до -36 абсолютно зрозуміло ". Проблема полягає в тому, що це не так: вона піде від 77 до 180 = -180 і продовжить до -36 або знизиться з 77 до -36? Щоб уникнути подібних неясностей, я вирішив бути обережним.
whuber

Я швидко здійснив вашу відповідь (див. Суть ). Щоб перевірити, чи містить ящик інтервал, мені довелося розгортати довжини коробки, інакше воно не працювало б для ящиків, що перетинали розрив. Бути новачком для мене це було не зовсім очевидно :)
letmaik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.