Фиона получает доступ к координатам нескольких многоугольников в шейп-файле

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

Я хотел бы выбрать координату xy для всех полигонов и поместить их отдельно в массивы и кортежи для обработки. Любая помощь будет оценена по достоинству.

import fiona
import pprint
from shapely.geometry import shape, Polygon

c = fiona.open("myShapeFile.shp", 'r')
pprint.pprint(len(c))
poly = Polygon(next(iter(c))["geometry"]["coordinates"][:])
print('Area  :: ',poly.area)

Казнь дает мне следующее:

4

Площадь :: 483.6379565269977


person PolarXYZ    schedule 30.05.2020    source источник
comment
Я не совсем уверен, о чем вы спрашиваете, но помогает ли это построение многоугольника? Polygon([p['geometry']['coordinates'] for p in c])   -  person Milan Cermak    schedule 31.05.2020
comment
Привет, Милан. спасибо за ваш комментарий, но использование вашего цикла, как вы предлагаете, дает мне ошибку. Я ожидаю, что приведенный выше код предоставит мне 4 области для содержащихся многоугольников в шейп-файле. Теперь я получаю от первого многоугольника. Я тоже не знаю, как получить доступ к координатам в массиве.   -  person PolarXYZ    schedule 31.05.2020
comment
Вы можете поделиться шейп-файлом?   -  person Milan Cermak    schedule 31.05.2020
comment
Вам также необходимо загрузить файл .shx, иначе fiona.open не удастся.   -  person Milan Cermak    schedule 01.06.2020
comment
Шейп-файл, которым вы поделились, содержит только одну функцию (например, len (c) == 1). Однако вы можете перебирать объект c, как если бы вы использовали dict: for k, v in c.iteritems(), и строить многоугольники в теле цикла: poly = Polygon(v['geometry']['coordinates']). HTH   -  person Milan Cermak    schedule 02.06.2020
comment
Здесь я помещаю шейп-файлы с 4 функциями: внешний многоугольник с 3 пробелами внутри: shapefile shp: dropbox.com/s/sbzgxzke9q4fqfu/myShapefile.shp?dl=0 shx: dropbox.com/s/e7lrlswsnzwjnqu/myShapefile.shx?dl=0   -  person PolarXYZ    schedule 02.06.2020


Ответы (1)


Попробуй это:

import fiona
import numpy as np

c = fiona.open('myShapeFile.shp')
coords = [np.array(poly['geometry']['coordinates'])
          for poly in c.values()]

coords - это список из 4 элементов, содержащий множество массивов, построенных на основе координат многоугольников из шейп-файла:

[array([[ 3.67739738e+05,  6.35697708e+06, -1.50000000e+03],
       [ 3.67709140e+05,  6.35875947e+06, -1.50000000e+03],
       [ 3.55633222e+05,  6.35932405e+06, -1.50000000e+03],
       [ 3.55340980e+05,  6.35724482e+06, -1.50000000e+03],
       [ 3.54012992e+05,  6.35713924e+06, -1.50000000e+03],
       [ 3.53169984e+05,  6.33306237e+06, -1.50000000e+03],
       [ 3.72936914e+05,  6.33219322e+06, -1.50000000e+03],
       [ 3.73638262e+05,  6.34799928e+06, -1.50000000e+03],
       [ 3.70536492e+05,  6.34865912e+06, -1.50000000e+03],
       [ 3.71030683e+05,  6.35672004e+06, -1.50000000e+03],
       [ 3.67739738e+05,  6.35697708e+06, -1.50000000e+03]]),
 array([[ 3.60619254e+05,  6.35486104e+06, -1.50000000e+03],
       [ 3.61702258e+05,  6.35460318e+06, -1.50000000e+03],
       [ 3.62578977e+05,  6.35362332e+06, -1.50000000e+03],
       [ 3.61805402e+05,  6.35192145e+06, -1.50000000e+03],
       [ 3.60412965e+05,  6.35114787e+06, -1.50000000e+03],
       [ 3.59072102e+05,  6.35171516e+06, -1.50000000e+03],
       [ 3.59020527e+05,  6.35279817e+06, -1.50000000e+03],
       [ 3.60309824e+05,  6.35295288e+06, -1.50000000e+03],
       [ 3.60000391e+05,  6.35408746e+06, -1.50000000e+03],
       [ 3.60619254e+05,  6.35486104e+06, -1.50000000e+03]]),
 array([[ 3.59072102e+05,  6.34439198e+06, -1.50000000e+03],
       [ 3.60928684e+05,  6.34537184e+06, -1.50000000e+03],
       [ 3.62424262e+05,  6.34480455e+06, -1.50000000e+03],
       [ 3.63868270e+05,  6.34361841e+06, -1.50000000e+03],
       [ 3.63146266e+05,  6.34155554e+06, -1.50000000e+03],
       [ 3.61341258e+05,  6.34036939e+06, -1.50000000e+03],
       [ 3.60258250e+05,  6.34109139e+06, -1.50000000e+03],
       [ 3.61650688e+05,  6.34227754e+06, -1.50000000e+03],
       [ 3.61289688e+05,  6.34356684e+06, -1.50000000e+03],
       [ 3.59897250e+05,  6.34294798e+06, -1.50000000e+03],
       [ 3.57989094e+05,  6.34346370e+06, -1.50000000e+03],
       [ 3.59072102e+05,  6.34439198e+06, -1.50000000e+03]]),
 array([[ 3.69489590e+05,  6.34294798e+06, -1.50000000e+03],
       [ 3.71397742e+05,  6.34103982e+06, -1.50000000e+03],
       [ 3.69438016e+05,  6.33928638e+06, -1.50000000e+03],
       [ 3.67581438e+05,  6.34052411e+06, -1.50000000e+03],
       [ 3.67787723e+05,  6.34222597e+06, -1.50000000e+03],
       [ 3.69489590e+05,  6.34294798e+06, -1.50000000e+03]])]
person Milan Cermak    schedule 01.06.2020