SHP機能を削除するPythonモジュール(デスクトップGISがインストールされていない場合)


16

外部データベースからシェープファイル機能を更新する非実動マシン上で毎晩実行されるソフトウェア(Arcではない)があります。定期的に、シェープファイルのすべての機能(ファイル自体ではなく、削除する必要があります)を削除し、ソフトウェアにシェープファイルを最初から「再構築」させたいと思います。このプロセスを自動化したいと思います。

現在、そのマシンにはGISソフトウェアがインストールされていません。Arcの[フィーチャ削除]ジオプロセシングツールのように、フィーチャを自動的に削除するルーチンをPythonでスクリプト化できることを望んでいました。

これを可能にするPythonモジュールはありますか?できればオープンソース?ShapelyPyShpを調べましたが、機能まとめて削除できるものや、WHERE句に一致するものは見当たりませんでした。機能を記述して分析することはできますが、DELETE FEATURES関数はどこにも見ていません。

私は確かにシンプルなものを見逃しているに違いありません...

編集:私は35個のフォルダ(異なる地理的範囲、すべて独自の投影)を持ち、35〜65個のシェイプファイルと約1000個のシェイプファイルを扱います。

回答:


16

GDAL / OGR python APIを使用できます。コードは次のようになります。

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)

私が取得ERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
マットウィルキー

4
書き込み用に開く必要があります。ogr.Open( 'shapefile.shp'、1)
capooti

12

空の結果を作成することが保証されているwhere句を含むコマンドラインogr2ogrは、1つの迅速で簡単な方法です。

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

pythonおよびOGR(およびGDAL)の概要ページはhttp://trac.osgeo.org/gdal/wiki/GdalOgrInPythonです


私はそのアイデアが好きです。入力ファイルを削除し、出力ファイルの名前を入力名に戻すためのスクリプトを作成する必要がありますが、他のソリューションが提示されていない場合は機能させることができます。
RyanKDalton-OffTheGridMaps

1
そのための1行のバッチファイルを次に示しますfor %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*)。しかし、Pabloの答えはより拡張可能です。
マットウィルキー

11

pyshpでこれを行うことができます。私はこのユースケースを想定していなかったので、それは単純ですが明らかではありません。ただし、自動更新アプリケーションには意味があります。次の6行のコードをテストしたところ、うまく機能しました。

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")

これで、正しいヘッダーと元のdbfフィールドを含む元のシェープファイルが上書きされました。GISソフトウェアとシェープファイルライブラリで安全に開きますが、機能やdbfレコードはありません。

ラムダ関数は、元の境界ボックスをプレースホルダーとして転送します。[xmin、ymin、xmax、ymax]の配列に必要な浮動小数点値を入れることができます。例:

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

dbfフィールドの変更も簡単で、pyshpのドキュメントに記載されています。

お役に立てば幸いです。


8

空白のシェープファイルのコピーを保存して、目的のシェープファイルを上書きしてみませんか。


皮肉なことに、私見は、これは...長いスキーマがあまり変化しない限り、最も効率的な解決策になる
Ragi Yaser Burhum

1
1つまたは2つのファイルの場合、同意します。これがそれほど効率的ではない主な理由は、35〜65個のシェープファイルを含む35個のフォルダー(地理的に異なる範囲、すべて独自の投影法)があるためです。数学では、管理するのに1000以上の空のシェープファイルになると言われていますが、これも現実的ではありません。シェープファイルを発見し、機能を削除するプロセスをスクリプト化することは、最終的には最終的に望んでいることです。
RyanKDalton-OffTheGridMaps

Qの@RyanDaltonは、「シェイプファイル」と言ってくれました。私は文句を言いませんが、前もってユースケースについてのより多くの情報が答えをより迅速に適用することにつながったかもしれないと指摘するだけです。
マットウィルキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.