Як узагальнити берегові лінії?


12

У мене є великий набір даних, які по суті представляють берегову лінію світу. Я не знаю точної роздільної здатності, але я б сказав, що це близько 5-10 м.

Уявіть набір точок, які представляють зубчасту берегову лінію. При роздільній здатності в 1 м ми бачимо всю деталь і потрібно 50 точок даних, щоб правильно зобразити узбережжя, однак, при 10 км розширення узбережжя виглядає як пряма лінія, і нам буде потрібно лише 2 бали.

Я пишу програму для картографування, яка вимагатиме масштабування даних від «повнопланетних» до «вуличних». Мені потрібна допомога щодо зменшення роздільної здатності моїх точок даних, а згодом і кількості даних для більш широких дозволів.

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

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

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


1
Ви перевірили відповіді на gis.stackexchange.com/questions/6585/… ? Будь ласка, уточніть, якщо ви думаєте, що ваше питання відрізняється.
underdark

1
Здається, питання має стосуватися берегових ліній замість "точок". Коли дозвіл зменшується, чи повинні зникати маленькі острови? чи нормально перетинати берегові лінії навколо худих серпантинових островів?
Кірк Куйкендалл

Якщо ви просто хочете зробити прохідну роботу і рухатися далі, відповідь @R Thiede - це, мабуть, найкраще місце для початку. Якщо ви хочете попрацювати над справжньою задачею, спрощуючи лінійну роботу, не втрачаючи значення форм, перегляньте відповідні запитання gis.stackexchange.com/questions/38/… та gis.stackexchange.com/questions/440/… .
matt wilkie

Відповіді:


7

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

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

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


+1 за продуману відповідь. Ласкаво просимо на наш сайт, Рюдігер!
whuber

5

Ви повинні підготувати різні узагальнені версії вашого набору даних для рівнів масштабування "повної планети" до великого масштабу.

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


2
У бібліотеці GEOS вбудовані алгоритми Дугласа-Пекера, які ви можете використовувати, якщо ви хочете це кодувати самостійно. Ви можете розглянути топологію, але в цьому випадку може допомогти також інструмент GRASS v.generalize.
lagerratrobe

Привіт @lagerratrobe. Я зробив вікі спільноти відповідей, тож ви повинні мати можливість редагувати його безпосередньо та додавати до нього і рішення GEOS, і GRASS.
underdark

1

Ви досліджували Tilemill для виготовлення ваших наборів плиток? Він автоматично зменшить вузли на різних рівнях збільшення. https://github.com/mapbox/tilemill


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