Eu tenho um software (não o Arc) que é executado todas as noites em uma máquina de não produção que atualiza os recursos de shapefile de um banco de dados externo. Periodicamente, eu gostaria de excluir todos os recursos do shapefile (não o arquivo em si, que deve permanecer) e deixar o software "reconstruir" o shapefile do zero. Eu gostaria de automatizar esse processo.
Atualmente, não tenho nenhum software GIS instalado nessa máquina. Esperava poder criar uma rotina em Python que excluísse automaticamente os recursos, assim como a ferramenta de geoprocessamento Delete Features do Arc .
Existe algum módulo Python que me permita fazer isso? Preferencialmente de código aberto? Eu olhei para Shapely e PyShp, mas não vi nada que me permitisse excluir os recursos em massa ou que correspondessem a uma cláusula WHERE. Eles podem escrever recursos e analisá-los, mas não viram as funções DELETE FEATURES em nenhum lugar.
Certamente devo estar perdendo algo simples ...
EDIT: Eu tenho 35 pastas (diferentes extensões geográficas, todas em sua própria projeção), com 35-65 arquivos de forma, com cerca de 1000 arquivos de forma para lidar.
fonte
ERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
A linha de comando ogr2ogr com uma cláusula where garantida para criar resultados vazios é um método rápido e fácil:
A página de visão geral para python e OGR (e GDAL) é http://trac.osgeo.org/gdal/wiki/GdalOgrInPython
fonte
for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*)
. A resposta de Pablo é mais extensível.Você pode fazer isso no pyshp. É simples, mas não óbvio, porque nunca imaginei esse caso de uso. Mas faz sentido para aplicativos de atualização automatizados. Testei as seguintes 6 linhas de código e funcionou muito bem:
Agora você tem um shapefile escrito sobre o original que possui cabeçalhos corretos e os campos dbf originais. Ele será aberto com segurança no software GIS e nas bibliotecas de shapefile, mas não possui recursos ou registros dbf.
A função lambda transfere a caixa delimitadora original como um espaço reservado. Você pode colocar os valores flutuantes sempre desejados em uma matriz de [xmin, ymin, xmax, ymax]. Exemplo:
Alterar os campos dbf também é simples e documentado nos documentos pyshp.
Espero que ajude.
fonte
Por que não salvar uma cópia do Shapefile em branco e sobrescrever seu Shapefile de interesse.
fonte