Модуль Python для удаления функций SHP (без установленной Desktop GIS)

16

У меня есть часть программного обеспечения (не Arc), которая работает ночью на непроизводственной машине, которая обновляет функции шейп-файла из внешней базы данных. Периодически я хотел бы удалить все функции в шейп-файле (а не сам файл, который должен остаться) и позволить программному обеспечению "перестроить" шейп-файл с нуля. Я хотел бы автоматизировать этот процесс.

В данный момент на этом компьютере не установлено программное обеспечение ГИС. Я надеялся, что смогу написать скрипт на Python, который автоматически удалит объекты, как инструмент геообработки Arc Delete .

Есть ли модули Python, которые позволили бы мне сделать это? Предпочтительно с открытым исходным кодом? Я посмотрел на Shapely и PyShp, но не увидел ничего, что позволило бы мне массово удалять объекты или соответствовать предложению WHERE. Они могут писать функции и анализировать их, но нигде не видели функций DELETE FEATURES.

Наверняка мне не хватает чего-то простого ...

РЕДАКТИРОВАТЬ: у меня есть 35 папок (различные географические экстенты, все в их собственной проекции), с 35-65 шейп-файлами с делает около 1000 шейп-файлов для работы.

RyanKDalton-OffTheGridMaps
источник

Ответы:

16

Вы можете использовать Python API GDAL / OGR , код будет таким:

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)
Pablo
источник
Я получаюERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
Мэтт Вилки
4
Вы должны открыть его для записи. Сделайте это с: ogr.Open ('shapefile.shp', 1)
capooti
12

Командная строка ogr2ogr с предложением where гарантирует создание пустых результатов - это один быстрый и простой метод:

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

Страница обзора для Python и OGR (и GDAL) является http://trac.osgeo.org/gdal/wiki/GdalOgrInPython

Мэтт Уилки
источник
Мне нравится эта идея. Я должен был бы сделать некоторые сценарии вокруг удаления входного файла и переименования выходного файла обратно к входному имени, но я мог бы заставить его работать, если другие решения не представлены.
RyanKDalton-OffTheGridMaps
1
вот одна линия пакетный файл для этого: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Ответ Пабло более расширяемый, хотя.
Мэтт Уилки
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. Он будет безопасно открываться в программном обеспечении ГИС и библиотеках шейп-файлов, но не имеет функций или записей dbf.

Лямбда-функция передает исходную ограничивающую рамку в качестве заполнителя. Вы можете поместить любые значения с плавающей точкой в ​​массив [xmin, ymin, xmax, ymax]. Пример:

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

Изменение полей dbf также просто и описано в документации по pyshp.

Надеюсь, это поможет.

GeospatialPython.com
источник
8

Почему бы не сохранить копию пустого шейп-файла и переписать интересующий вас шейп-файл.

klewis
источник
По иронии судьбы, ИМХО, это было бы наиболее эффективным решением до тех пор, пока схема не сильно изменилась ...
Раги Язер Бурхум
1
Если бы это было для 1 или 2 файлов, я бы согласился. Основная причина, по которой это не так эффективно, заключается в том, что у меня 35 папок (разных географических размеров, все в своей проекции) с 35-65 шейп-файлами. Математика говорит, что управлять 1000+ пустыми шейп-файлами, что тоже непрактично. Сценарии процесса обнаружения шейп-файлов и удаления функций - это то, чем я, в конечном счете, надеюсь закончить.
RyanKDalton-OffTheGridMaps
@RyanDalton в Q вы сказали «шейп-файл», что привело нас, в любом случае, меня, к мысли и разработке единственного решения. Я не жалуюсь, просто указываю, что больше информации о сценарии использования может привести к более быстрому применению ответов.
Мэтт Вилки