Розділіть складну фігуру на сітку


11

У мене є пристойно деталізований профіль з функціями полігон / багатополігон (файл становить близько 500 Мб). Це насправді формфайл усього світу, з особливостями, що представляють берегові лінії. Мені потрібно розділити ці дані за допомогою сітки. Щоб було зрозуміло, я не хочу "сортувати" дані, але насправді розрізав багатокутники на плитки. Я усвідомлюю, що це питання було задано раніше, але знайдені нами рішення не працювали для мене.

Я спробував:

  • Використання QGIS та перетинання вмісту форм-файлів з векторною сіткою - результати жахливі. Більшість основних земельних ділянок магічно зникає, хоча, здається, іноді це роблять і менші шматки землі. Слід зазначити, що цей метод справді добре працює із значно простішими даними (тобто меншими балами)

  • Використання інструментів перетину OGR. Я спробував це як через ogr2ogr, так і навіть прокатуючи власний інструмент C ++. Вони мають однакову проблему, як QGIS. Вони також не демонструють цю проблему для простих файлів, але виходять з ладу більш складні. Для довідки, я використовую форм-файл Австралії та Нової Зеландії розміром менше 20 Мб, і QGIS, і OGR не в змозі "перекласти його".

Хтось запропонував в один момент використовувати PostGIS, оскільки він має функцію перетину, але ST_Intersect PostGIS використовує той самий задній кінець GEOS, що і OGR. Насправді вони обидва називають одну і ту ж функцію, наскільки я можу сказати, тому я не думаю, що PostGIS дасть різні результати.

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

EDIT: Додавання додаткової інформації

У відповідь Сімбамангу:

  • Файл форми - це в основному дані берегової лінії від OpenStreetMap. Це об'єднана версія файлу 'обработал_p' (так що він не розділився на плитки), який я отримав, надіславши по електронній пошті їх список розробників. Зауважте, що їх розбиття плитки (на шматки 100 км х 100 км з перекриттям) не обов’язково те, що я хочу - я не хочу перекриватись, і я хочу свободу вибору розміру сітки, або я б просто використовувати за замовчуванням обработано_p.

  • За замовчуванням дані берегової лінії мають помилки геометрії, про які повідомляє QGIS. Я виправляю ці помилки за допомогою невеликого інструменту, який я зібрав, використовуючи якийсь код, який я виявив, розроблений спеціально для вирішення цієї проблеми (виправлення помилок геометрії в даних берегової лінії: https://github.com/tudelft-gist/prepair ). Перехід на файли за допомогою цього інструменту виправляє практично всі помилки, які виникає QGIS. Я намагаюся зробити перехрестя лише після очищення файлів.

  • Саме те, що я робив за допомогою QGIS: відкрийте дані, щоб переконатися, що вони добре виглядають у QGIS. Спробуйте розділити його на плитки, створивши шар плиток за допомогою Vector Grid із заданим проміжком, а потім перетинаючи два шари - не йдіть. Спробуйте скористатися меншим набором даних - виберіть функції в Океанії (Австрія, Північна Америка), щоб спробувати менший набір даних - цей формат має розмір <20 Мб. Знову спробуйте розділити це, не виходить.

  • Що я робив з OGR: ogr2ogr безпосередньо, використовуючи параметри '-spat' і '-clipsrc' із spat_extent. Також написав невеликий інструмент C ++, який працює на WKT, тому я перетворюю файл форми у WKT за допомогою ogr2ogr, а потім подаю текстовий файл у свою програму. Він проходить через файл і викликає тут метод документа «Перетин» (): http://www.gdal.org/ogr/classOGRGeometry.html . Я думаю, що це робить саме те саме, що безпосередньо використовувати ogr2ogr.

У відповідь на Brent:

  1. Це робить. Все в WGS84 Lat / Lon
  2. Я б міг подумати, що це навпаки - що для заданого набору сітчастих плиток потрібно буде довше перетинати один гігантський багатополігон, а не купу фрагментованих функцій, які могли б бути більш просторово локалізованими для кожної плитки, але це цікава пропозиція - я спробую це і звіту.
  3. Поле атрибутів не зберігається під час процесу, мене цікавить лише геометрія.
  4. Я не впевнений, але я думаю, що ви говорите, що я повинен вибрати багатокутники, які перекриваються заданою плиткою сітки, а потім виконати перетин. Це занадто громіздко вручну з QGIS. Мій інструмент вже певною мірою робить це за допомогою обмежувальної галочки. Трохи прискорена швидкість, але кінцевий результат все ще поганий і не помітно відрізняється.
  5. Це не варіант. Зараз я намагаюся розділити дані так, щоб його було 1 градус х 1 градус, і я шукаю загальну / надійну методологію, яка працює у всіх випадках. Я спробував збільшити розмір сітки (тобто 10x10), щоб побачити, чи отримаю я кращі результати, і я не бачу кореляції між розміром сітки та якістю виводу.

Редагувати №2:

Я більше намагався пограти з цим, і взагалі здається, що результати недостовірні як з використанням GEOS, так і з QGIS (який використовує fTools, я не знаю, чи це в свою чергу знову використовує GEOS). Я помилявся, заявивши, що розмір сітки не має нічого спільного з результатами - чим більша сітка, тим кращі результати (це добре знати, але все-таки це не рішення). Ось скріншот дійсно розташованої сітки, яка в основному працювала, але частково вийшла з ладу в одній плитці:

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

Геометрія чиста - QGIS показує 0 помилок за допомогою інструменту «Перевірити дійсність». Я не хочу підходити до цієї проблеми поетапно; перевірка того, що певні функції не вдалися до перетину набору даних настільки великим, коли його візуально не видно (а це не буде з меншими плитками) не практично.


Де ти взяв форму світу чи Австралію? Я б підозрював, що геометрія цього файлу може мати деякі проблеми (спробуйте вектор | Інструменти геометрії | Перевірте достовірність геометрії в QGIS). Щойно випробували перехрестя на меншому форматі світу та плитках 5 градусів, і це чудово працює в QGIS.
Сімбамангу

1
Спробував це з австралійською береговою лінією 100K від Geoscience Australia (20MB) та плиткою 4 ступеня, також чудово працює (QGIS 1.7.4, OSX 10.7). Чи могли б ви детальніше описати свої дані та що ви зробили?
Сімбамангу

Дякую за всю додаткову інформацію. Я підозрюю, що у даних OSM є щось дивне; спробуйте це з набором даних, про який я згадував, і побачите, чи отримаєте ви кращі результати. Я, мабуть, пам’ятаю, як відчував раніше щось дивне з даними про озеро OSM, спробую це переглянути.
Сімбамангу

Чи можете ви поділитися набором даних або навіть відрізаною його частиною (як у вашому прикладі вище)?
Сімбамангу

Відповіді:


7

Я щойно створив власні інструменти для цього.

Я використовував бібліотеку Clipper ( http://www.angusj.com/delphi/clipper.php ) разом з OGR, щоб розділити налаштування даних. Щось слід зауважити: наївно виконувати перехрестя з цією вкладкою займає дуже багато часу, тому я замість цього використовував квадратурний підхід ... тобто розділяю на чотири комірки сітки, ділю кожну з них на ще чотири тощо, поки не отримаєш потрібне дозвіл. Хоча губа чудово працює, я додав скріншот, на якому показані результати східної півкулі:

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

Наведений вище результат займав близько 4,5 годин на процесорі 1,33 ГГц.

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

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


Пов'язаний код більше не доступний :-(
Shaun McDonald

Я перемістив сховище до github.com/preet/scratch/tree/master/gis/polytoolkit . Залежно від того, що саме ви намагаєтеся зробити, ви можете знайти корисніше github.com/preet/scratch/tree/master/gis/shapefiles/shptk .
Пріс

Пізніший - корисніший. Зараз я знайшов метод, що використовує PostGIS, хоча хотів би дізнатися, чи швидше це. Чи є у вас readme для складання та встановлення?
Шон Макдональд

Чи можете ви відредагувати свою відповідь, щоб виправити посилання? Спасибі
Afr

4

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

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

2) Перетворити всі функції в одну частину - набагато простіше в обробці

3) Видаліть усі сторонні поля, зберігаючи лише поле id, яке дозволить вам приєднатися до своїх атрибутів після того, як було проведено перетин - знову набагато простіше обробити

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

5) Спробуйте використовувати більші сітки багатокутників.


+1 Дійсно цікаво - наскільки це впливає на швидкість геообробки, якщо ви зберігаєте в полі дані ID або багаточастини?
Сімбамангу

1
Я ніколи насправді не намагався кількісно оцінити відмінності. Я можу говорити лише з досвіду, коли операції з геогенерації в основному не вдалися, і це те, що допомогло вирішити проблему.
Brent Edwards

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

1
Не повинно бути ніяких об'єднань. Мета - підірвати багаточастинні функції. Наприклад, на екрані екрану невдалої плитки метою є вибухнути всі ваші записи, що містять згруповані, просторово розрізнені багатокутники, як острівні риси вздовж узбережжя Британії та Аляски, на окремі, окремі записи багатокутника. Цього можна досягти в QGIS, використовуючи інструмент «Багаточастинні до одиночних частин» у меню Вектор> Інструменти геометрії.
Брент Едвардс

Після перетворення на одну частину, ви повинні повторно підтвердити свою геометрію, щоб бути впевненим, що все чисто.
Брент Едвардс

0

Іншим підходом може бути спробу перетворення вектор-растр для створення набору даних точок, а потім використовувати набір даних точок як основу для написання деякого коду для створення ваших плиток.

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