Próbowałem stworzyć funkcję, która robi w zasadzie to samo, co funkcja „rozpuszczenia” QGIS. Myślałem, że to będzie super łatwe, ale najwyraźniej nie. Więc z tego, co zebrałem, użycie fiona z kształtnym powinno być tutaj najlepszą opcją. Właśnie zacząłem bawić się plikami wektorowymi, więc ten świat jest dla mnie całkiem nowy i python.
Dla tych przykładów pracuję z utworzonym przez hrabstwo plikiem hrabstwa utworzonym tutaj http://tinyurl.com/odfbanu Więc oto fragment kodu, który zebrałem, ale nie mogę znaleźć sposobu, aby mogli współpracować
Na razie moja najlepsza metoda jest następująca: https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Działa dobrze i otrzymuję listę 52 stanów jako kształtną geometrię. Prosimy o komentarz, jeśli istnieje prostszy sposób wykonania tej części.
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.
Więc pisanie nie jest tak naprawdę proste z tego, co widziałem, naprawdę chcę tylko ten sam plik kształtu tylko po tym, jak kraj rozpłynie się w państwa, nie potrzebuję nawet dużej części tabeli atrybutów, ale jestem ciekawy, jak możesz przejść od źródła do nowo utworzonego pliku kształtu.
Znalazłem wiele fragmentów kodu do pisania za pomocą fiona, ale nigdy nie jestem w stanie sprawić, by działał z moimi danymi. Przykład z Jak pisać geometrie kształtów w plikach kształtów? :
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},
})
Problem polega na tym, jak zrobić to samo z listą geometrii i jak odtworzyć te same właściwości, co źródło.