Python не может читать шейп-файл

11

Я пытаюсь открыть шейп-файл с помощью блокнота Jupyter, но не могу открыть его. Шейп-файл находится в той же папке, что и моя книга, и Python не может его идентифицировать, даже если я использую полный путь.

import shapefile as shp
import matplotlib.pyplot as plt

sf = shp.Reader(r'C:\Users\Public\Documents\1-11-99n.shp')

ShapefileException: Unable to open C:\Users\Public\Documents\1-11-99n.dbf or C:\Users\Public\Documents\1-11-99n.shp.

Открытие его с помощью фионы и геопанды также не работает.

import fiona
shape = fiona.open("1-11-99n.shp")

и

import geopandas as gp
shp = gp.GeoDataFrame.from_file('1-11-99n.shp')
print (shp)

оба заканчивают с

CPLE_OpenFailedError: b'Unable to open 1-11-99n.shx or 1-11-99n.SHX.Try --config SHAPE_RESTORE_SHX true to restore or create it'

Я знаю, что это может быть тривиальной проблемой, но я новичок в использовании шейп-файлов и пространственных библиотек Python, поэтому я действительно не знаю, как обойти эту проблему.

Леонард Шоу
источник
заменить минус с подчеркиванием и попробуйте еще раз .. имена шейп должны содержать буквы, цифры и символы подчеркивания только . Также было бы неплохо начать имя с буквы. Если проблема не устраняется, возможно, шейп-файл поврежден или отсутствует файл .SHX. У вас есть только файл .SHP или у вас есть полный набор файлов (.SHP, .SHX, .DBF, .PRJ и т. Д.). )?
Майкл Стимсон
Возможно, ваш шейп-файл поврежден. Я сохраняю один произвольный шейп- файл как 1-11-99n.shp, и у меня не было никаких проблем с вашими мини-скриптами с shapely, fiona или геопандами.
xunilk
3
Да, проблема была в том, что я не включил другие нужные мне файлы shx, dbf и т. Д. Я никогда не использовал файлы shp раньше, поэтому я не знал, что это требует дополнения файлов. Имя файла работало нормально без необходимости изменения. Благодаря!
Леонард Шоу
1
@ LeonardShaw Пожалуйста, рассмотрите возможность дать ответ на свой вопрос, чтобы мы могли считать этот вопрос решенным.
Аарон
Повторюсь, это нарушение спецификации шейп-файла, когда в имени файла стоит начальный номер или дефис. Рекомендуется избегать именования, которое приведет к сбоям в некоторых реализациях считывателей шейп-файлов.
Винс

Ответы:

20

Есть ловушка для новых пользователей шейп-файлов. Фактический шейп-файл (.shp) бесполезен без сопутствующих файлов: .dbf, .shx, .prj и т. Д.

Это изложено в технической спецификации шейп-файла, но это немного продвинуто, статья Esri может быть более подходящей для быстрого объяснения.

Очень важно, чтобы все файлы, принадлежащие шейп-файлу, рассматривались как единое целое. Если шейп-файл редактируется на каком-либо этапе, даже если меняется только атрибут, FID (идентификаторы объектов) изменяются, что означает изменение порядка в файле .DBF. Если вы редактируете атрибуты шейп-файлов и копируете только файл .DBF, перезаписывая существующий файл .DBF, фигуры будут указывать на неправильные строки. Всегда копируйте ВСЕ файлы вместе .

При отправке шейп-файла по электронной почте, в Dropbox, на Google Диске и т. Д. Я считаю целесообразным заархивировать все файлы в один архив, чтобы при распаковке все связанные файлы появлялись вместе.

Майкл Стимсон
источник
1
Чтобы быть более точным: .shp, .dbf и .shx - абсолютный минимум (согласно стандарту). QGIS / OGR позволит вам открывать файлы с отсутствующим .dbf, но вы не сможете удалять или редактировать эти функции. Однако вы можете использовать ogr2ogr для создания отсутствующего dbf-файла (с пустой таблицей атрибутов)
LuWi
2
@LuWi Даже файл .SHX можно перестроить, это пространственный индекс, есть несколько инструментов и опций, которые могут перестроить пространственный индекс из существующих фигур. Точное количество связанных файлов варьируется, но всегда лучше хранить все вместе.
Майкл Стимсон
0

Если у вас есть только элемент .shp, и вы можете обойтись без других частей, рассмотрите это решение, открывая и сохраняя из OpenJump. /gis//a/306228 Вам все еще может понадобиться файл .proj, в зависимости от вашей цели, но, возможно, вам удастся выбрать «стандартный» файл, скопированный из другого проекта и переименованный в соответствии с вашим шейп-файлом , если это использует ту же проекцию.

Марк Нил
источник