Módulo Python para excluir recursos do SHP (sem o Desktop GIS instalado)


16

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.

Respostas:


16

Você pode usar a API python GDAL / OGR , o código será assim:

from osgeo import ogr

shapefile = ogr.Open( "shapfile.shp",1 )
layer=shapefile.GetLayerByIndex(0)
count=layer.GetFeatureCount()
for feature in range(count):
    layer.DeleteFeature(feature)

Eu receboERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
matt wilkie

4
você precisa abri-lo para escrever. Faça isso com: ogr.Open ('shapefile.shp', 1)
capooti

12

A linha de comando ogr2ogr com uma cláusula where garantida para criar resultados vazios é um método rápido e fácil:

ogr2ogr output.shp input.shp -where "FID < 0"

A página de visão geral para python e OGR (e GDAL) é http://trac.osgeo.org/gdal/wiki/GdalOgrInPython


Eu gosto da ideia. Eu precisaria fazer alguns scripts para excluir o arquivo de entrada e renomear o arquivo de saída para o nome da entrada, mas poderia fazê-lo funcionar se nenhuma outra solução fosse apresentada.
precisa saber é o seguinte

1
aqui está um arquivo batch uma linha para que: 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.
Matt Wilkie

11

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:

import shapefile
r = shapefile.Reader("myshape")
w = shapefile.Writer(r.shapeType)
# This line will give us the same dbf schema
w.fields = r.fields
# Use the original bounding box as a place holder in the header
w.bbox = lambda: r.bbox
w.save("myshape")

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:

w.bbox = lambda: [0.0, 0.0, 0.0, 0.0]

Alterar os campos dbf também é simples e documentado nos documentos pyshp.

Espero que ajude.


8

Por que não salvar uma cópia do Shapefile em branco e sobrescrever seu Shapefile de interesse.


Ironicamente, IMHO esta seria a solução mais eficiente, desde que o esquema não mudou muito ...
Ragi Yaser Burhum

1
Se fosse para 1 ou 2 arquivos, eu concordo. A principal razão pela qual isso não seria tão eficiente é porque eu tenho 35 pastas (diferentes extensões geográficas, todas em sua própria projeção), com 35 a 65 formatos de arquivo. A matemática diz que seriam mais de 1000 shapefiles em branco para gerenciar, o que também não é prático. Criar um script para descobrir arquivos shapefiles e excluir recursos é o que eu espero terminar.
precisa saber é o seguinte

@RyanDalton no Q você disse "o shapefile", o que nos levou, bem, de qualquer maneira, a pensar e a criar uma solução singular. Não estou reclamando, apenas salientando que mais informações sobre o caso de uso antecipadamente podem ter levado a respostas mais imediatamente aplicáveis, mais rapidamente.
Matt wilkie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.