У мене є пристойно деталізований профіль з функціями полігон / багатополігон (файл становить близько 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:
- Це робить. Все в WGS84 Lat / Lon
- Я б міг подумати, що це навпаки - що для заданого набору сітчастих плиток потрібно буде довше перетинати один гігантський багатополігон, а не купу фрагментованих функцій, які могли б бути більш просторово локалізованими для кожної плитки, але це цікава пропозиція - я спробую це і звіту.
- Поле атрибутів не зберігається під час процесу, мене цікавить лише геометрія.
- Я не впевнений, але я думаю, що ви говорите, що я повинен вибрати багатокутники, які перекриваються заданою плиткою сітки, а потім виконати перетин. Це занадто громіздко вручну з QGIS. Мій інструмент вже певною мірою робить це за допомогою обмежувальної галочки. Трохи прискорена швидкість, але кінцевий результат все ще поганий і не помітно відрізняється.
- Це не варіант. Зараз я намагаюся розділити дані так, щоб його було 1 градус х 1 градус, і я шукаю загальну / надійну методологію, яка працює у всіх випадках. Я спробував збільшити розмір сітки (тобто 10x10), щоб побачити, чи отримаю я кращі результати, і я не бачу кореляції між розміром сітки та якістю виводу.
Редагувати №2:
Я більше намагався пограти з цим, і взагалі здається, що результати недостовірні як з використанням GEOS, так і з QGIS (який використовує fTools, я не знаю, чи це в свою чергу знову використовує GEOS). Я помилявся, заявивши, що розмір сітки не має нічого спільного з результатами - чим більша сітка, тим кращі результати (це добре знати, але все-таки це не рішення). Ось скріншот дійсно розташованої сітки, яка в основному працювала, але частково вийшла з ладу в одній плитці:
Геометрія чиста - QGIS показує 0 помилок за допомогою інструменту «Перевірити дійсність». Я не хочу підходити до цієї проблеми поетапно; перевірка того, що певні функції не вдалися до перетину набору даних настільки великим, коли його візуально не видно (а це не буде з меншими плитками) не практично.