Eu tenho um grande arquivo raster (129600 por 64800 pixels) com corpos de água globais (valores de 1 bit 0 e 1) e tento extrair as linhas costeiras do oceano e da água interior.
Eu tentei com o ArcGIS e o QGIS converter de raster para polilinha, mas leva séculos.
Alguém conhece uma maneira melhor / mais rápida (Python ou R) ou uma ferramenta melhor para esta tarefa?
Atualizar
- R: rasterToContour pode ser rápido e preciso, mas se você tiver um conjunto de dados muito grande como o meu (8.398.080.000 pixels), precisará de uma quantidade muito grande de RAM (mais de 16 GB) ou forçar R a fazer mais processamento no disco rígido e também levará idades.
- Python / GDAL: gdal_poligonize cria polígonos em vez de polilinhas
Atualização 2
- R rasterToContour: rasterToContour não fornece os resultados desejados. Comparado ao ArcGIS (raster para polígono seguido de recurso para linha), ele não extrai o contorno exato do pixel, conforme mostrado nos exemplos abaixo.
ATUALIZAÇÃO 3
Python / GDAL: Eu executei gdal_polygonize a partir da linha de comando no ArcGIS em um conjunto de dados de teste e os resultados foram extremamente claros:
- gdal: 49 segundos
- ArcGIS: 1,84 segundos
python
r
performance
Wevers genéricos
fonte
fonte
Respostas:
Estou trabalhando com R e usado
rasterToPolygons
noraster
pacote no passado, mas agora prefirogdal_polygonizeR
John Baumgartner. Baseia-segdal_polygonize.py
e é muito mais rápido. John Baumgartner publicou o código e deu um exemplo para uso em seu blog .Se você está familiarizado com python, você pode usá-lo
gdal_polygonize.py
diretamente, é claro.fonte
Para a posteridade, tenho tido sucesso com o
stars::
pacoteR
por fazer esse tipo de operação rapidamente.fonte
Tente
rasterToContour
do pacote raster .Você pode gravar facilmente os arquivos em uma pasta local, por exemplo, como 'ESRI Shapefile' (.shp), usando o código abaixo. Ter um olhar para
ogrDrivers
a partir rgdal para descobrir quais drivers de seu sistema é compatível com.fonte
rasterToContour
para um valor mais alto, por exemplo, 1e + 9. Você vai acabar com mais detalhes. A configuração padrão cria linhas de contorno bastante generalizadas.resample
seus dados tenham uma resolução espacial mais grossa, a única solução que posso imaginar seria dividir seus dados em vários blocos (por exemplo, 16 sub-rasters), depois executarrasterToContour
cada bloco separadamente de maneira iterativa e , finalmente,merge
os shapefiles resultantes em um enorme shapefile. Caso você esteja interessado, o pacote Rsenal do nosso grupo de trabalho oferece uma função chamadasplitRaster
para criar vários sub-rasters a partir de uma enorme varredura.Embora eu seja um grande fã do GDAL, a ferramenta polygonize também foi lenta demais para meus aplicativos.
Uma alternativa rápida é a
gdal_trace_outline
partir dos scripts Dans GDAL, que também tem mais opções de tolerância, rosquinhas, etc.Assim
gdal_polygonize
também produz polígonos com os quais você precisaria converter depoisogr2ogr -nlt MULTILINESTRING
.A desvantagem disso é que você precisa compilá-lo, a menos que esteja em um sistema Linux ou Mac OsX.
fonte