У меня есть большой растровый файл (129600 на 64800 пикселей) с глобальными водоемами (значения 1 бит 0 и 1), и я пытаюсь извлечь береговые линии океана и внутренних вод.
Я пытался с ArcGIS и QGIS конвертировать из растра в полилинию, но это занимает много времени.
Кто-нибудь знает лучший / более быстрый способ (Python или R) или лучший инструмент для этой задачи?
Обновить
- R: rasterToContour может быть быстрым и точным, но если у вас очень большой набор данных, такой как у меня (8 398 080 000 пикселей), вам нужен либо очень большой объем ОЗУ (более 16 ГБ), либо вы заставляете R делать больше обработки на жестком диске, и это также займет много времени.
- Python / GDAL: gdal_poligonize создает полигоны вместо полилиний
Обновление 2
- R rasterToContour: rasterToContour не дает желаемых результатов. По сравнению с ArcGIS (растр-полигон, за которым следует объект-линия), он не извлекает точный контур пикселя, как показано в примерах ниже.
ОБНОВЛЕНИЕ 3
Python / GDAL: я запустил gdal_polygonize из командной строки для ArcGIS на тестовом наборе данных, и результаты были предельно ясны:
- гдал: 49 секунд
- ArcGIS: 1,84 секунды
python
r
performance
Общие Wevers
источник
источник
Ответы:
Я работаю с R и использовал
rasterToPolygons
изraster
пакета в прошлом, но теперь я предпочитаюgdal_polygonizeR
Джона Баумгартнера. Он основан наgdal_polygonize.py
и намного быстрее. Джон Баумгартнер опубликовал код и привел пример для использования в своем блоге .Если вы знакомы с Python, вы можете использовать
gdal_polygonize.py
напрямую, конечно.источник
Для потомков, у меня был успех с
stars::
пакетомR
для выполнения этого типа операции быстро.источник
Попробуйте
rasterToContour
из растрового пакета.Затем вы можете легко записать файлы в локальную папку, например, как «ESRI Shapefile» (.shp), используя приведенный ниже код. Посмотрите
ogrDrivers
из rgdal , чтобы выяснить , какие драйверы ваша система совместима с.источник
rasterToContour
более высокое значение, например 1e + 9. В итоге вы получите больше деталей. Настройка по умолчанию создает довольно обобщенные контурные линии.resample
ваши данные имели более грубое пространственное разрешение, единственное решение, которое я могу себе представить, это разделить ваши данные на несколько плиток (например, 16 вспомогательных растров), а затем выполнитьrasterToContour
итерацию для каждой плитки отдельно и и, наконец,merge
получившиеся шейп-файлы в один огромный шейп-файл. Если вас это интересует, пакет нашей рабочей группы Rsenal предлагает функцию, которая вызываетsplitRaster
создание нескольких вспомогательных растров из одного огромного растра.Хотя я большой поклонник GDAL, инструмент полигонизации был слишком медленным для моих приложений.
Быстрая альтернатива -
gdal_trace_outline
от сценариев Dans GDAL, которые также имеют больше вариантов относительно толерантности, пончиков и т. Д.Подобно
gdal_polygonize
этому, также создаются полигоны, которые потом нужно будет конвертироватьogr2ogr -nlt MULTILINESTRING
.Недостатком является то, что вам нужно скомпилировать его самостоятельно, если вы не используете Linux или Mac OsX System.
источник