Як програмно перевірити, чи кількість фігур = кількість записів таблиці?


9

У мене є декілька приблизно 1000 файлів форм, які пошкоджені (див. Додане повідомлення про помилку). Файли форм були створені програмою eCognition Developer 8. Існує інструмент сценарію, який, здається, відновлює файл форми, коли він ідентифікується як пошкоджений.

введіть тут опис зображення

Редагувати:

Я хочу створити швидкий скрипт, щоб проглянути всі мої файли форм і перевірити, чи відповідає кількість фігур табличним записам. Я можу порахувати записи таблиці, використовуючи наступне:

# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0)) 
print result_dbf

Я в кінцевому підсумку хотів би створити якусь логічну перевірку, наприклад:

if result_dbf = result_shp:
    pass
else:
    print "There is a problem with" + str(Sample)

Як я можу рахувати фігури безпосередньо без доступу до файлу .dbf? Або, іншими словами, який найкращий спосіб програмно перевірити, чи відповідає кількість фігур кількості записів таблиці?


1
Я думаю, що файл можна переглянути, але чи кожен із елементів таблиці атрибутів представлений об'єктом? саме про це піклується файл sbn. незалежно від того, чи відображається воно, номер не відповідає. shapefilerepairer - це те, що я використовую.
Бред Несом

1
Декомпіляція сценарію може бути корисною, але ого, це старий код! Я чесно здивований, він все ще працює на сьогоднішньому форматі.
Пол

1
@Brad Я оновив публікацію, щоб внести виправлення. Помилка .sbn - це інша проблема, з якою у мене виникли проблеми і не пов'язана з цією проблемою.
Аарон

@Brad Коли я запускаю пошкоджений файл через Shape Checker, він повідомляє: "Недостатньо записів у dbf-файлі - додавання пробілів".
Аарон

Відповіді:


5

Що з використанням pyshp ? Я встановив його за допомогою pip, і те, що я спробував нижче, в значній мірі прямо з README :

>>> import shapefile
>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> shapes = sf.shapes()
>>> len(shapes)
33732
>>> records = sf.records()
>>> len(records)
33732
>>>

На жаль (чи, можливо, на щастя?) У мене немає жодних підключених форм-файлів, щоб перевірити, чи ні. форм може! = ні. записів.

Зачекайте лише хвилинку, у мене зараз є розбита форма файлу завдяки ідеї Кірка в коментарях нижче. Я створив резервну копію dbf, зробив копію всього файлу форм, видалив деякі функції, потім перейменував резервну копію dbf в оригінал, і ось ось кількість фігур <кількість записів:

>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> records = sf.records()
>>> len(records)
33732
>>> shapes = sf.shapes()
>>> len(shapes)
33721
>>>

2
Можливо, спробуйте зробити копію файлу форми (фактично файли). Потім в копії видаліть деякі функції. Потім замініть оригінальний dbf скопійованим dbf (з якого було видалено кілька рядків).
Кірк Куйкендалл

@KirkKuykendall - ваша ідея спрацювала, дивіться правки. Дякую.
Чад Купер

7
Нема проблем. Якщо вам коли-небудь знадобиться, щоб я пошкодив ще деякі дані, просто дайте мені знати.
Кірк Куйкендалл

Дякуємо за допомогу @Chad, модуль shapefile зробив свою справу. Я розмістив остаточний сценарій, який успішно перевіряв мої файли. Було близько 50/1000 пошкоджених файлів.
Аарон

5

З огляду на ваше запитання, здається, що все, що ви насправді хочете зробити, - це визначити, чи має файл форми з ним проблеми (у цьому випадку невідповідні записи). Якщо вам просто потрібно визначити тих, хто має проблеми, вам насправді не потрібно рахувати записи в DBF та Shapefile, щоб визначити, чи помиляється він. Ось чому:

Якщо ви спробуєте запустити функцію GetCount на файлі форм, що має різні підрахунки записів, це не вдасться з помилкою:

ПОМИЛКА 000229 : Не вдається відкрити. Не вдалося виконати (GetCount).

Оскільки в цьому сценарії функція GetCount виходить з ладу, і все, що ви хочете зробити, - це помилка виявлення файлів форми, ви можете це зрозуміти за допомогою пункту спробу / за винятком коду, замість того, якщо раніше ви намагалися використовувати.

Я зважився на додавання коду та циклу "Список FeatureClasses", щоб ви могли протестувати всі ФК у своїй робочій області, не вручну перевіряючи кожен.

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"

fcList = arcpy.ListFeatureClasses()

for fc in fcList:
    try:
        result_dbf = int(arcpy.GetCount_management(fc).getOutput(0))
        print fc + ": " + str(result_dbf) + " records"
    except:
        print "There is a problem with: " + str(fc)

Дякую Райану, це хороша альтернатива рішенню Чада, а також робить трюк.
Аарон

2

Формат файлу формату задокументований. Я б здогадався, що кількість записів у файлі shp не відповідає кількості записів у файлі dbf.

Формат файлу shp задокументований тут . Таким чином, ви можете написати програму для підрахунку кількості фігур. Формат dbf задокументований у багатьох місцях, і ви маєте змогу знайти зразки для підрахунку рядків, наприклад тут .


Рядки у файлі dBase можна порахувати двома способами: (1) запис у заголовку визначає, скільки рядків він містить, і (2) віднімаємо довжину заголовка від загальної довжини файлу (у байтах) і ділимо на довжину запису ( дорівнює одиниці плюс сума довжин полів). Зазвичай це добре робити у випадку, якщо файл фізично усічений. Незважаючи на те, що навіть коли підрахунки підходять, файли .shp та .dbf майже не потрібні без файлу .shx, який індексується у файл .shp. Тож швидка перевірка кількості записів .shx може бути кращою, ніж читання всього .shp-файлу.
whuber

2

Доданий скрипт проходить через каталог і перевіряє, чи відповідає кількість фігур кількості записів для кожного файлу форм.

import arcpy, os, shapefile
from arcpy import env

env.workspace = r"C:\path\to\shapefiles"
Dir = env.workspace

fclist = arcpy.ListFeatureClasses()

for fc in fclist:

    myfc = os.path.join(Dir, fc)
    sf = shapefile.Reader(str(myfc))
    shapes = sf.shapes()
    shape_total = len(shapes)
    records = sf.records()
    record_total = len(records)

    if shape_total != record_total:
        print "There is a problem with " + str(fc)
    else:
        print str(fc) + " passed"

1

Використання контрольної геометрії повинно пройти перший крок.
Тягар
Ремонту Геометрія дозволить вибрати порядок і пріоритет завдання ви хочете ремонт для.
Ось деякі посилання на більш стару версію . Коли ви запускаєте засіб перевірки формфайлів, то закінчите з перебудовою dbf?
Це крок, який створює записи, щоб відповідати. Одна з двох речей сталася причиною помилки.

  1. У SHP є об'єкт (просторовий), який був видалений / видалений іншим програмним забезпеченням / процесом.
  2. У dbf є запис, який відповідає нульовій геометрії.
    Це може спричинити кілька речей.
    Shx - це фактично індекс між ними.
    Підрахунок фігур без підрахунку записів dbf - це лише половина рішення.

На жаль, ремонт геометрії не очищає помилку.
Аарон

1

Переглядаючи статтю вікіпедії про shapefiles , .shx-файл повинен містити індекс на .shp-файл, а не на .dbf-файл. Тому може знадобитися перевірити, чи .shx та .shp підходять один до одного.

Можна відкрити файл форми без .dbf (значить у вас немає таблиці атрибутів), але розбитий індекс створить повідомлення про помилку.


Ким це "не дозволено"? Можна відновити всю інформацію про функції просто з файлу .shp.
whuber

1
За програмним забезпеченням, яке очікує добре функціонуючого індексу. Не правильні умови, я трохи змінив відповідь ...
AndreJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.