Я намагався створити функцію, яка в основному робить те саме, що QGIS "розчиняє" функцію. Я подумав, що це буде дуже просто, але, мабуть, ні. Тож із того, що я зібрав навколо, найкращим варіантом тут має бути використання фіона з витонченою формою. Я тільки почав возитися з векторними файлами, так що цей світ для мене і пітона також досить новий.
Для цього прикладу я працюю із створеним тут графічним файлом округу 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, але я ніколи не в змозі змусити його працювати зі своїми даними. Приклад з Як писати геометричні фігури у формі фігури? :
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},
})
Проблема тут полягає в тому, як зробити те ж саме зі списком геометрії та як відтворити ті самі властивості, що й джерело.