Por que o GDALPolygonize é muito mais lento que o ArcGIS Raster to Polygon?

9

Estou tentando poligonizar uma varredura usando GDALPolygonize () em um script Python. O script começou a poligonizar ontem às 17h e ainda é poligonizado agora às 9h30. Não tenho idéia de quanto tempo ele está, mas sei que ainda está acontecendo porque, quando atualizo o Windows Explorer, vejo o tamanho do arquivo alterado para o shapefile de saída.

Minha varredura é bastante grande, mas ainda não espero que demore tanto. Minha varredura é de 35.486 colunas e 23.682 linhas com tamanho de célula de 1 metro. É uma varredura binária em que o valor 1 representa dados e 0 é NoData.

Quando poligonizei no ArcGIS usando Raster to Polygon na caixa de ferramentas de conversão, demorou 56 segundos. O shapefile resultante é de 200mb, enquanto o shapefile ainda está sendo criado pelo GDALPolygonize ainda tem apenas 100mb. Isso me faz pensar que o GDAL está quase na metade do caminho depois de correr a noite toda.

Especificações: Windows 7 64bit, 8gb RAM, GDAL 1.10 64bit, ArcGIS Desktop 10.2, 64bit Geoprocessamento em segundo plano para ArcGIS Desktop, Python 2.7.3 64bit

ATUALIZAÇÃO Dia 2 - GDALPolygonize ainda está em execução. Passou a noite 2 noites seguidas e durante um dia inteiro sem concluir. O ArcGIS levou 56 segundos.

Brian
fonte
atualização rápida a partir de 2018: gdal_polygonize ainda está demorando muito mais do que 56 segundos. Eu tenho uma varredura de 12000x12000 e gdal trabalha há mais de uma hora. Não é muito comparado aos dias, mas é mais do que 60 vezes mais do que 56 segundos, então tenho a sensação de que observarei um processo em execução quando voltar para verificar minha máquina amanhã de manhã.
2841818 thymaro

Respostas:

4

Eu tenho a mesma experiência. O algoritmo é realmente lento para rasters enormes, embora bastante rápido para os menores. Existe uma solução possível:

  1. Divida o arquivo raster enorme em arquivos menores por gdalwarp (usando -te para definir a extensão de cada arquivo):

gdalwarp -te 12.08 48.5 12.5 51.1 original_file.tif part1.tif

  1. Poligonize cada um deles em um shapefile separado:

gdal_polygonize.py part1.tif -f "ESRI Shapefile" part1.shp

  1. Mesclar arquivos de forma juntos:

ogr2ogr -f "ESRI Shapefile" -update -append merge.shp part1.shp -nln merge

  1. Dissolva o novo shapefile:

ogr2ogr "output.shp" "input.shp" -dialect sqlite -sql "SELECT ST_Union(geometry), field FROM input GROUP BY field"

Eu sei, é loucura como o inferno, mas o tempo final foi muito mais rápido.

Stanley

Stanislav Dušek
fonte
1
Você provavelmente poderia acabar com isto em um script de modo que você só tem que fazer algo a si mesmo uma vez
Henrik-dmg
Olá Stanley, obrigado por esta resposta. Estou tentando fazer algo parecido com isso, porque meus rasters estão demorando uma eternidade para poligonizar. Esse método mescla os polígonos nas bordas novamente como se você nunca dividisse as rasters em primeiro lugar? Você poderia expandir as instruções SQL no último comando? Não conheço SQL e estou tentando descobrir como fazer isso funcionar com meus dados.
User20408
em vez de usar gdalwarp, você não pode simplesmente agrupar sua varredura criando um arquivo vrt ao salvá-lo? Pelo menos, foi assim que aprendi a cortar minhas rasters e não preciso fazer isso para cada peça separadamente.
thymaro