2011. május 5., csütörtök

Shape létrehozása/törlése/módosítása az osgeo.ogr python modul segítségével

Megjegyzések:
>>>#A modul behívása
 >>>import osgeo.ogr
! Az arcgis -féle python modullal ellentétben ügyelni kell a kis és nagy betűkre!
! Figyelni kell, hogy a modul nem követi az összes shp fájlrészt, a dbf, shx, shp hármasán túl, másoláskor elveszhetnek pl a metaadatok!
1.) Shape megnyitása, létrehozása, törlése
A fenti ábra mutatja a shape fájlban tárolt adatok elérésének az útvonalát. A vezérlőnél kell beállítani a használt adatforrás típusát. Ezt a osgeo.ogr.GetDriver(index) és az osgeo.ogr.GetDriverByName('name') metódusokkal lehet elérni.
>>>for index in range(osgeo.ogr.GetDriverCount()):
...           print osgeo.ogr.GetDriver(index).name
a ciklus kilistázza az elérhető adatforrások nevét. 
Az esetek többségében 'Esri Shapefile' az adatforrás, amit a
>>>driver=osgeo.ogr.GetDriverByName('Esri Shapefile') 
lehet hozzárendelni a driver objektumhoz.  
A driver létrehozása után definiálni kell az adatforrást, megnyitásra, törlésre vagy létrehozásra:
>>>datasource=driver.Open(shp_path,1) # Megnyitásra 1-írásra olvasásra, ha 1 nincs ott, akkor csak olvasásra nyitja meg!
>>>driver.DeleteDataSource(shp_path)# Törlésre 
>>>datasource=driver.CreateDataSource(shp_path) # Létrehozásra 

2.) Réteg menedzselése

Megnyitás után a datasource objektumon keresztül elérhetőek a shapeben tárolt adatok. A megnyitott adatforrás egy vagy több réteget tartalmazhat:
>>>layer=datasource.GetLayer() #Leszedi az elérhető első réteget (index is használható) 
>>>layer=datasource.GetLayerByIndex(0) #Leszedi az elérhető első réteget index alapján 
>>>layer=datasource.GetLayerByName('teszt') #Leszedi a teszt nevű réteget
 
De hozzá is adhatóak, illetve törölhetőek is a rétegek.
>>>layer=datasource.CreateLayer('nev',geom_type=osgeo.ogr.wkbPoint) # Létrehozásra a geom type lehet szám is, pl jelen esetben 1 (wkbLineString:2,wkbPolygon:3 ezek multi változata 4-5-6, 7 geometriagyűjtemény)
>>>datasource.DeleteLayer(0) # Letörli az első réteget
A réteghez különböző objektumok kapcsolódnak, ilyen például a réteg neve, a tárolt feature összszám, a mezők nevei, típusa, a használt térbeli kordinátarendszer stb.  

Mező létrehozása, módosítása, törlése:
>>>uj_mezo=osgeo.ogr.FieldDefn('proba_mezo',osgeo.ogr.OFTString) # Új mező definíció hozzáadása, a mező neve proba_mező, típusa szöveg
>>>layer.CreateField(uj_mezo) # Az új mező csatolása a meglévő réteghez
>>>layer_defn=layer.GetLayerdefn() # Réteg definíciós objektum létrehozása
>>>for index in range(layer_defn.GetFieldCount()):
. . .            print str(index)+': '+str(layer_defn.GetFieldDefn(index).name)  # Kiírja az elérhető mezők neveit, ha létrejött a proba_mezo, akkor látni kell a listában
>>>field_defn=layer_defn.GetFieldDefn(layer_defn.GetFieldIndex('proba_mezo')) # Mező definíciós objektum létrehozása
>>>field_defn.GetName()  # Ellenőrzöm, hogy jó mezőt állítgatok
>>>field_defn.SetWidth(30) # Beállítom, hogy maximum 30 karaktert lehessen beleütni
>>>field_defn.SetName('pont_neve') # proba_mezo helyett legyen inkább pont_neve a mező neve
>>>field_defn.GetName() # Voila modosította
Viszont a törölni mintha nem lehetne a mezőt...
UPDATE: Frissítettem az Ubuntut Nasty Norrisra (vele frissült a GDAl is) és a mező hozzáadása már nem  megy létező shape esetében. Itt találtam egy beszélgetést, ami a témába vág, az ogr referencia szerint a fenti módon kellene használni, de így mégsem működik:)

Feature létrehozása, módosítása, törlése: 
A featureökhöz való hozzáférés a layer.GetFeature() és a layer.GetNextFeature() metódusokkal lehetséges. Az előbbi egy meghatározott featurehöz ad hozzáférést (elso_feature=layer.GetFeature(0)), az utóbbi mindig a következő elérhető featuret olvassa, ennek alaphelyzetbe állításához a layer.ResetReading() metódust kell használni. A featureök számát a layer.GetFeatureCount() metódussal lehet lekérdezni.

Feature létrehozásának logikáját leginkább az itt található példa segítségével lehet elsajátítani:)
A fenti linken található rövid script kitűnően összefoglalja a létrehozás mikéntjét /Még több példa a bal oldali hasznos rész alatt/.  Benne van az előbb bemutatott mező definiálása is (osgeo.ogr.FieldDefn('nev',osgeo.ogr.OFTString)), geometria létrehozása, feature létrehozása stb.

Valami végszó, mert már éjfél lassan (: naon király az ogr api, az arcgisscripting mellett, vagy inkább együtt nagyon ütnek, a shapek uralta térképszerverek királyai:)


Nincsenek megjegyzések:

Megjegyzés küldése