Как читать шейп-файл в Python?

23

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

То, что вы увидите, - это метод генерации вертикальных линий относительно ограничивающей рамки с заданным пользователем интервалом. Я понимаю, что OGR, Fiona, Shapely и т. Д. Могут быть использованы для следующего шага отсечения, но я не понимаю их использования.

Как прочитать одну строку шейп-файла полигона? Каждое приложение, которое использует Shapely, показывает, как генерировать LineString, Point или Polygon, но никогда не читать существующий шейп-файл.

Пожалуйста, помогите мне, по крайней мере, с каркасной структурой, чтобы я мог на ней опираться.

Akhil
источник

Ответы:

40

1) читать ваш шейп-файл с помощью Fiona , PyShp , ogr или ... с использованием протокола geo_interface (GeoJSON):

с Фионой

import fiona
shape = fiona.open("my_shapefile.shp")
print shape.schema
{'geometry': 'LineString', 'properties': OrderedDict([(u'FID', 'float:11')])}
#first feature of the shapefile
first = shape.next()
print first # (GeoJSON format)
{'geometry': {'type': 'LineString', 'coordinates': [(0.0, 0.0), (25.0, 10.0), (50.0, 50.0)]}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'FID', 0.0)])}

с PyShp

import shapefile
shape = shapefile.Reader("my_shapefile.shp")
#first feature of the shapefile
feature = shape.shapeRecords()[0]
first = feature.shape.__geo_interface__  
print first # (GeoJSON format)
{'type': 'LineString', 'coordinates': ((0.0, 0.0), (25.0, 10.0), (50.0, 50.0))}

с огр:

from osgeo import ogr
file = ogr.Open("my_shapefile.shp")
shape = file.GetLayer(0)
#first feature of the shapefile
feature = shape.GetFeature(0)
first = feature.ExportToJson()
print first # (GeoJSON format)
{"geometry": {"type": "LineString", "coordinates": [[0.0, 0.0], [25.0, 10.0], [50.0, 50.0]]}, "type": "Feature", "properties": {"FID": 0.0}, "id": 0}

2) преобразование в геометрию Shapely (с функцией shape )

# now use the shape function of Shapely
from shapely.geometry import shape
shp_geom = shape(first['geometry']) # or shp_geom = shape(first) with PyShp)
print shp_geom
LINESTRING (0 0, 25 10, 50 50)
print type(shp_geom)
<class 'shapely.geometry.linestring.LineString'>

3) вычисления

4) сохранить полученный шейп-файл

ген
источник
5
Я бы добавил геопанды в список:geopandas.read_file("my_shapefile.shp")
Joris
Начиная с GDAL 2.0 вместо osgeo.ogr.Openиспользования osgeo.gdal.OpenEx( подробности ).
Кевин
1
с помощью ogr мне сначала нужно было определить json как json, чтобы иметь возможность обрабатывать его более корректно: 'first = json.loads (first)'
Лев
11

Я считаю, геопанда как лучший исполнитель здесь. Код:

import geopandas as gpd
shapefile = gpd.read_file("shapefile.shp")
print(shapefile)
Мобасшир Бхуиян
источник