[Fossgis-talk] Groessere Vektor-Layer in GRASS7 importieren !?
Martin Spott
Martin.Spott at mgras.net
Mi Mär 2 19:00:47 CET 2011
N'Abend zusammen,
als Versuchsobjekt fuer meine Experimente mit CORINE hatte ich mir
gedacht, ich mach' in der Zwischenzeit mal einen neu-Aufguss meiner
Operationen mit VMap0. Der Datensatz ist viel kleiner und man bekommt
die Ergebnisse also schon am naechsten Tag :-)
Ausgangspunkt sind die VMap0-Originaldaten, aus denen ich mir mit
'ogr2ogr' einen Satz Shapefiles erzeuge, pro Region und Kategorie ein
Shapefile. Der einzige Grund, warum ich aus der VMap0-Datenbank nicht
direkt in GRASS importiere, lag darin, dass der OGDI-Treiber in Version
3.2 aus der 64-bittigen Debian "Squeeze", also der aktuell stabilen
Distribution, beim Lesen der political boundaries mit einem Segfault
aussteigt. Also habe ich mir mir OGDI 3.1.irgendwas ein 32-bittiges
GDAL gebaut, denn bei dem war ich mir sicher, dass es planmaessig
funktionierte.
Es gibt also etwa solche Shapefiles - die Namen sind eigentlich
selbsterklaerend:
eur_hydro-inwatera-area.shp
noa_hydro-inwatera-area.shp
sas_hydro-inwatera-area.shp
soa_hydro-inwatera-area.shp
Wenn man sich die mit zufaelliger Farbauswahl in QGIS anguckt, sieht
das etwa so aus:
http://foxtrot.mgras.net/bitmap/VMap0_bare.png
Diese Shapefiles importiere ich anschliessend mit 'v.in.ogr' in GRASS7
(SVN trunk), gebe dabei "snap=0.0003 min_area=0.0000001" an - die Werte
erschienen mir nach einiger Lektuere und Probiererei als sinnvoll, weil
mir 0.0003 Grad kleiner erscheint als das kuerzeste 'beabsichtigte'
Segment zwischen zwei Vertices eines Polygons in VMap0 (was allerdings
nur empirisch ermittelt und nicht unwiderlegbar bewiesen ist).
Dann mache ich aus den importierten Maps eine Selektion anhand der
Eigenschaften, wie wir sie bisher in der Szenerie fuer den FlightGear
verwendet haben. Dabei nehme ich gewisse Vereinfachungen vor, die aber
den technischen Vorgang nicht beeintrachtigen sollten. Ich erzeuge mir
zum Beispiel aus jeder der oben importierten Maps wiederum eine Map mit
Seen - etwa so:
# ~> v.extract input=eur_hydro-inwatera-area type=area output=cs_lake_eur where="f_code LIKE 'BH000' AND hyc = 8"
Also habe ich am Ende dieser Operation fuer jede der von mir gewaehlten
"Landklassen" und fuer jede der vier Regionen eine Map mit Seen, eine
mit Lava undsoweiter - und bis hierhin ist das ja auch alles im Grunde
nur stupides Kochen nach Rezept.
Im naechsten Schritt re-klassifiziere ich die ganzen Maps. Dazu erfinde
ich mir fuer jede meiner Landklassen einen eindeutigen numerischen
Wert, erzeuge bei jeder Map eine neue Spalte des Typs "integer" in der
assoziierten Tabelle, schreibe da den passenden Wert rein und
re-klassifiziere schlussendlich die Map nach der neuen Spalte.
Zum Schluss klebe ich die jeweils vier 'regionalen' Maps einer
Landklasse mit 'v.patch' zu einer neuen Map zusammen. Dann haette ich
etwa eine "cs_lake", eine "cs_lava". Hintendran kommt noch ein:
# ~> v.clean [...] tool=snap,bpol,rmdupl,rmline,break,rmdupl,rmdangle,rmarea thresh=0.0003,0,0,0,0,0,0,0.0000001 type=boundary
.... sowie ein 'v.dissolve'.
Weil ich zu doof bin, um mir die Maps in GRASS zu visualisieren (und
weil die ganze Operation auf einem entfernten Rechner laeuft),
exportiere ich die Maps jeweils als ein Shapefile pro Landklasse und
gucke sie mir zuhause ebenfalls in QGIS an - und das Ergebnis
entspricht vollends meinen Erwartungen:
http://foxtrot.mgras.net/bitmap/VMap0_per-category.png
Jetzt will ich diese verschiedenen Maps in eine einzige zusammenkleben.
Da schmeisse ich einfach alle derjenigen Maps, die aus dem 'v.dissolve'
rausgekommen sind (und die in "per-category" sichtbar sind) in ein
'v.patch' - und jetzt kommt der Grund, warum ich euch die ganze
Geschichte zumute, denn das Ergebnis, nun als ein einziges Shapefile
exportiert und in QGIS angeguckt, entspricht so ueberhaupt nicht dem,
was ich gerne haette:
http://foxtrot.mgras.net/bitmap/VMap0_world-patched.png
Selbst wenn ich die bei VMap0 immanenten Loecher in Nordafrika und
Zentralasien auffuelle und das Resultat exakt nach obigem Beispiel
nochmal mit einem 'v.clean' bearbeite, dann sieht das noch immer
vollkommen unzureichend aus:
http://foxtrot.mgras.net/bitmap/VMap0_world-cleaned.png
Ich begreif' einfach nicht, warum da diese Loecher zurueckbleiben, die
doch allesamt aus irgendeiner derjenigen Maps abgedeckt sein muessten,
die ich in das 'v.patch' gesteckt habe. Ich habe auch schon die
Gegenprobe mit einem GRASS64 gemacht, da sieht's genau so aus. Kennt
jemand den Effekt und kann mir sagen, welchen Zusammenhang ich hier
ignoriert habe ?
Besten Dank,
Martin.
--
Unix _IS_ user friendly - it's just selective about who its friends are !
--------------------------------------------------------------------------