Найшвидший спосіб перетворити великий растр на поліліній за допомогою R або Python?


14

У мене великий растровий файл (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 (растр до багатокутника з наступною ознакою на лінію), він не отримує точного контуру пікселя, як показано в прикладах нижче.

результат растрового ToContour результат растрового ToContour

Результат ArcGIS Результат ArcGIS

ОНОВЛЕННЯ 3

Python / GDAL: Я запустив gdal_polygonize з командного рядка проти ArcGIS на тестовому наборі даних, і результати були надзвичайно чіткими:

  • gdal: 49 секунд
  • ArcGIS: 1,84 секунди

Зробив це, див. Оновлення 3.
Generic Wevers

Чи можете ви надати цей тестовий набір даних, щоб ми могли бачити, чи запропоновані альтернативи швидші та / або дають необхідні результати?
Керстен

Для такого величезного растру вам буде краще використовувати C / C ++ з бібліотекою gdal.
Родріго

Відповіді:


8

Я працював з R і використовувався rasterToPolygonsз rasterпакету в минулому, але зараз я віддаю перевагу gdal_polygonizeRДжону Баумгартнеру. Він заснований на gdal_polygonize.pyі набагато швидше. Джон Баумгартнер опублікував код і подав приклад для використання у своєму блозі .

Якщо ви знайомі з python, ви можете, gdal_polygonize.pyзвичайно, використовувати безпосередньо.


1
Я дам це спробувати. Востаннє я використовував gdal_polygonize.py ArcGIS був все-таки швидшим.
Generic Wevers

Я не очікував, що ArcGis може бути швидшим, ніж gdal. @Generic Militzer
Iris

Ну зачекайте, це створить багатокутники, але мені потрібні полілінії.
Generic Wevers

Якщо ви помістите свої дані у базу даних Geodata File, це досить швидко. Але все ще недостатньо швидко. Тому я шукаю альтернативи.
Generic Wevers

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

7

Для нащадків я мав успіх у stars::пакеті Rдля швидкого виконання такого типу операцій.

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

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

plot(r)
plot(x, add = TRUE)

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


5

Спробуйте rasterToContourз растрового пакету.

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

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

Потім ви можете легко записати файли в локальну папку, наприклад, як "ESRI Shapefile" (.shp), використовуючи наведений нижче код. Подивіться ogrDriversз rgdal , щоб з'ясувати , які драйвери ваша система сумісна з.

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

Я спробую, щоб пальці перехрестилися, це не вб'є мою ОЗУ. Хоча у мене є 16 Гб, що, сподіваємось, достатньо, R іноді не настільки ефективний для великих растрових файлів. Але подивимось.
Generic Wevers

Конверсія спрацювала якось, але я не зміг детально перевірити. Оскільки я, як правило, більше займаюся растровою обробкою даних, чи можете ви сказати мені, як я можу перенести SpatialLineDataFrame у файл формату чи щось подібне. Я гугл і все ще боюся, оскільки не знаю назви шару (OGRwrite).
Generic Wevers

Ха-ха, я точно бачу вашу думку. Дивіться вище оновлення.
fdetsch

2
Ще одна підказка: спробуйте встановити "maxpixels" rasterToContourна якесь вище значення, наприклад, 1e + 9. Ви закінчите більше деталей. Налаштування за замовчуванням створює досить узагальнені контурні лінії.
fdetsch

1
Якщо ви не готові до отримання resampleваших даних більш грубого просторового дозволу, єдиним рішенням, яке я можу собі уявити, було б розділити ваші дані на декілька плиток (наприклад, 16 субрастров), а потім виконувати rasterToContourна кожній плитці окремо в ітераційному порядку і , нарешті, mergeотримані форми перетворюються в одне величезне форм-файл. У випадку, якщо ви зацікавлені, пакет нашої робочої групи Rsenal пропонує функцію, яка називається splitRasterдля створення декількох субрастров з одного величезного растру.
fdetsch

2

Хоча я великий фанат GDAL, інструмент полігонізації був занадто повільним для моїх додатків.

Швидка альтернатива gdal_trace_outlineз Dans GDAL скриптів , який також має більше можливостей в відношенні толерантності, пончики і т.д.

Так gdal_polygonizeсамо випускаються багатокутники, які вам слід згодом перетворити ogr2ogr -nlt MULTILINESTRING.

Недоліком цього є те, що вам потрібно скласти його самостійно, якщо ви не знаходитесь на ОС Linux або Mac OsX.


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