Я пытался создать функцию, которая делает в основном то же самое, что и функция QGIS "распустить". Я думал, что это будет супер легко, но, видимо, нет. Итак, из того, что я собрал, использование fiona with shapely должно быть лучшим вариантом здесь. Я только начал возиться с векторными файлами, так что этот мир довольно нов и для меня, и для python.
В этом примере я работаю с графическим шейп-файлом, созданным здесь http://tinyurl.com/odfbanu. Итак, вот некоторые фрагменты кода, которые я собрал, но не могу найти способ заставить их работать вместе
На данный момент мой лучший метод заключается в следующем: https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Он работает нормально, и я получаю список из 52 состояний в виде геометрии Shapely. Пожалуйста, не стесняйтесь комментировать, если есть более прямой способ сделать эту часть.
from osgeo import ogr
from shapely.wkb import loads
from numpy import asarray
from shapely.ops import cascaded_union
ds = ogr.Open('counties.shp')
layer = ds.GetLayer(0)
#create a list of unique states identifier to be able
#to loop through them later
STATEFP_list = []
for i in range(0 , layer.GetFeatureCount()) :
feature = layer.GetFeature(i)
statefp = feature.GetField('STATEFP')
STATEFP_list.append(statefp)
STATEFP_list = set(STATEFP_list)
#Create a list of merged polygons = states
#to be written to file
polygons = []
#do the actual dissolving based on STATEFP
#and append polygons
for i in STATEFP_list :
county_to_merge = []
layer.SetAttributeFilter("STATEFP = '%s'" %i )
#I am not too sure why "while 1" but it works
while 1:
f = layer.GetNextFeature()
if f is None: break
g = f.geometry()
county_to_merge.append(loads(g.ExportToWkb()))
u = cascaded_union(county_to_merge)
polygons.append(u)
#And now I am totally stuck, I have no idea how to write
#this list of shapely geometry into a shapefile using the
#same properties that my source.
Таким образом, на самом деле это не совсем то, что я видел, я просто хочу, чтобы один и тот же шейп-файл только с распадом страны на штаты, мне даже не нужна большая часть таблицы атрибутов, но мне любопытно посмотреть, как вы можете передать это от источника к новому созданному шейп-файлу.
Я нашел много фрагментов кода для написания с помощью fiona, но я так и не смог заставить его работать с моими данными. Пример из Как написать геометрию Shapely в shapefiles? :
from shapely.geometry import mapping, Polygon
import fiona
# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])
# Define a polygon feature geometry with one attribute
schema = {
'geometry': 'Polygon',
'properties': {'id': 'int'},
}
# Write a new Shapefile
with fiona.open('my_shp2.shp', 'w', 'ESRI Shapefile', schema) as c:
## If there are multiple geometries, put the "for" loop here
c.write({
'geometry': mapping(poly),
'properties': {'id': 123},
})
Проблема здесь в том, как сделать то же самое со списком геометрии и как воссоздать те же свойства, что и у источника.
Я настоятельно рекомендую GeoPandas для работы с большим набором функций и выполнения массовых операций.
Он расширяет рамки данных Pandas и использует стройную структуру.
источник
Как дополнение к ответу @ gene , мне нужно было растворить более одного поля, поэтому он изменил его код для обработки нескольких полей. Код ниже использует
operator.itemgetter
для группировки по нескольким полям:источник