„GDAL/OGR használata Python nyelvben” változatai közötti eltérés
(→Támogatott bemeneti adatformátumok) |
(→Használat) |
||
| 47. sor: | 47. sor: | ||
* ODBC | * ODBC | ||
| − | ''' | + | '''Hozzáférés a filehoz''' |
A különböző fájltípusoknak és más adatforrásoknak a kezelésére az OGR könyvtár úgynevezett | A különböző fájltípusoknak és más adatforrásoknak a kezelésére az OGR könyvtár úgynevezett | ||
| − | |||
meghajtókat (vagy drivereket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy | meghajtókat (vagy drivereket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy | ||
| − | |||
milyen driverek állnak rendelkezésünkre: | milyen driverek állnak rendelkezésünkre: | ||
<code> | <code> | ||
from osgeo import ogr | from osgeo import ogr | ||
| − | |||
driverList = [] | driverList = [] | ||
for i in range(ogr.GetDriverCount()): | for i in range(ogr.GetDriverCount()): | ||
| + | driver = ogr.GetDriver(i) | ||
| + | driverName = driver.GetName() | ||
| + | if not driverName in driverList: | ||
| + | formatsList.append(driverName) | ||
| + | |||
| + | for i in formatsList: | ||
| + | print i | ||
| + | </code> | ||
| + | |||
| + | A kiírt nevek alapján azonosíthatjuk a megfelelő drivert. A Shape fájl formátumot például az | ||
| + | „ESRI Shapefile” nevű meghajtóval kezelhetjük. A megfelelő driver név szerint is elérhető (ha | ||
| + | nincs telepíve az adott nevű driver, akkor a GetDriverByName függvény None értéket térít vissza). | ||
| + | A Shape fájlokat kezelő meghajtót tehát a következő függvényhívással érhetjük el: | ||
| + | driver = ogr.GetDriverByName('ESRI Shapefile') | ||
| + | Az állományt ezután a meghatón keresztül nyitjuk meg az Open függvény segítségével, aminek | ||
| + | első paramétere az állomány neve (teljes elérési útvonal), a második pedig egy egész szám, aminek | ||
| + | értéke 0 vagy 1 lehet. A második paraméter 0, ha az állományt csak olvasásra nyitjuk meg, az érték | ||
| + | 1 ha írni is szeretnénk bele. | ||
| + | |||
| + | <code> | ||
| + | file = driver.Open(filename, 0) | ||
| + | if file is None: | ||
| + | print ('Nem tudtam megnyitni a fájlt!') | ||
| + | </code> | ||
| + | |||
| + | Amennyiben a meghajtó nem tudta megnyitni az állományt, akkor a None értéket adja vissza. Ez a | ||
| + | helyzet akkor fordulhat elő, ha a Shape fájl tartalma sérült vagy az shx vagy dbf fájl nem található. | ||
| + | |||
| + | '''Térképészeti adat kinyerése''' | ||
| + | |||
| + | A következő lépés a Shape fájlban található réteghez (layer) valő hozzáférés. Ezt a funkciót a | ||
| − | + | <code> | |
| + | GetLayer(index) függvény biztosítja. Shape fájlok esetében az index mindig 0 (vagy el is lehet | ||
| + | hagyni ezt a paramétert), az index csak olyan formátumok esetében hasznos, mint pl. a GML vagy | ||
| + | a TIGER. A következő sorral tehát a Shape fájl egyetlen rétegét szerezzük be: | ||
| + | layer = datasource.GetLayer() | ||
| + | </code> | ||
| − | + | Ezután következik a rétegen található elemek (features) beolvasása. A featureek számát a layer | |
| + | GetFeatureCount() függvényével kérhetjük le, és az egyes featureek a GetFeature(index) | ||
| + | függvénnyel érhetjük el. Vagy végig lehet menni az összes featureen a következő kóddal: | ||
| − | + | <code> | |
| + | feature = layer.GetNextFeature() | ||
| − | + | while feature: | |
| + | # feldolgozás | ||
| + | feature = layer.GetNextFeature() | ||
| + | layer.ResetReading() #ha újra kell kezdeni a beolvasást | ||
| + | </code> | ||
| − | + | A Shape fájlunk csak egyetlen featuret tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával | |
| + | megoldjuk a hozzáférést. | ||
| + | Az elem mértani objetkumát a GetGeometryRef() függvénnyel kérhetjük le, típusát pedig a | ||
| + | GetGeometryType() vagy GetGeometryName() függvénnyekkel ellenőrizhetjük le. A következő | ||
| + | sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel vane | ||
| + | dolgunk: | ||
| + | <code> | ||
| + | geometry = feature.GetGeometryRef() | ||
| + | if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON': | ||
| + | # feldolgozás | ||
| + | </code> | ||
| + | |||
| + | A típusokat az OGR konstansaival (pl. ogr.wkbPoint, ogr.wkbLineString, ogr.wkbPolygon, | ||
| + | ogr.wkbMultiPoint, ogr.wkbMultiLineString, ogr.wkbMultiPolygon, stb.) is azonosíthatjuk. | ||
| + | |||
| + | '''Attribútumok''' | ||
| + | |||
| + | Az attribútomokat a GetField() függvénnyel és annak variációival érhetjük el. Például: | ||
| − | + | <code> | |
| + | attr = feature.GetField('id') | ||
| + | attrstr = feature.GetFieldAsString('id') | ||
</code> | </code> | ||
| + | |||
| + | Az attribútumok számát a GetFieldCount() függvénnyel kapjuk meg. | ||
| + | |||
| + | ==Példaprogramok== | ||
A lap 2016. május 13., 18:38-kori változata
GDAL/OGR modul leírása
A nyílt GDAL/OGR (Geospatial Data Abstraction Library, OpenGIS Simple Features Reference
Implementation) könyvtárak számos eszközzel segítik a térképészeti adatok feldolgozását. A
GDAL a raszteres, az OGR pedig a vektoros adatok kezeléséért felel. A C++ nyelven írt OGR
könyvtárhoz úgynevezett Python kötéseket készítettek, hogy Python programokból elérhetők
legyenek az OGR funkciói: ez a Python OGR modul.
Használat
Támogatott adatformátumok
Az OGR könyvtár segítségével számos vektoros formátumot (állománytípust vagy egyéb
adatforrást) tudunk kezelni, például:
- ESRI shapefile
- personal geodatabase (térinformatikai adatokat tároló Microsoft Access adatbázis)
- ArcSDE adatbázis
- MapInfo formátum
- GRASS formátum
- Bentley Systems MicroStation formátum
- TIGER/Line
- SDTS
- GML
- KML
- MySQL, PostgreSQL, MariaDB, stb
- Oracle Spatial
- Informix
- ODBC
Hozzáférés a filehoz
A különböző fájltípusoknak és más adatforrásoknak a kezelésére az OGR könyvtár úgynevezett meghajtókat (vagy drivereket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy milyen driverek állnak rendelkezésünkre:
from osgeo import ogr
driverList = []
for i in range(ogr.GetDriverCount()):
driver = ogr.GetDriver(i)
driverName = driver.GetName()
if not driverName in driverList:
formatsList.append(driverName)
for i in formatsList:
print i
A kiírt nevek alapján azonosíthatjuk a megfelelő drivert. A Shape fájl formátumot például az „ESRI Shapefile” nevű meghajtóval kezelhetjük. A megfelelő driver név szerint is elérhető (ha nincs telepíve az adott nevű driver, akkor a GetDriverByName függvény None értéket térít vissza). A Shape fájlokat kezelő meghajtót tehát a következő függvényhívással érhetjük el: driver = ogr.GetDriverByName('ESRI Shapefile') Az állományt ezután a meghatón keresztül nyitjuk meg az Open függvény segítségével, aminek első paramétere az állomány neve (teljes elérési útvonal), a második pedig egy egész szám, aminek értéke 0 vagy 1 lehet. A második paraméter 0, ha az állományt csak olvasásra nyitjuk meg, az érték 1 ha írni is szeretnénk bele.
file = driver.Open(filename, 0)
if file is None:
print ('Nem tudtam megnyitni a fájlt!')
Amennyiben a meghajtó nem tudta megnyitni az állományt, akkor a None értéket adja vissza. Ez a helyzet akkor fordulhat elő, ha a Shape fájl tartalma sérült vagy az shx vagy dbf fájl nem található.
Térképészeti adat kinyerése
A következő lépés a Shape fájlban található réteghez (layer) valő hozzáférés. Ezt a funkciót a
GetLayer(index) függvény biztosítja. Shape fájlok esetében az index mindig 0 (vagy el is lehet
hagyni ezt a paramétert), az index csak olyan formátumok esetében hasznos, mint pl. a GML vagy
a TIGER. A következő sorral tehát a Shape fájl egyetlen rétegét szerezzük be:
layer = datasource.GetLayer()
Ezután következik a rétegen található elemek (features) beolvasása. A featureek számát a layer GetFeatureCount() függvényével kérhetjük le, és az egyes featureek a GetFeature(index) függvénnyel érhetjük el. Vagy végig lehet menni az összes featureen a következő kóddal:
feature = layer.GetNextFeature()
while feature:
# feldolgozás
feature = layer.GetNextFeature()
layer.ResetReading() #ha újra kell kezdeni a beolvasást
A Shape fájlunk csak egyetlen featuret tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával
megoldjuk a hozzáférést.
Az elem mértani objetkumát a GetGeometryRef() függvénnyel kérhetjük le, típusát pedig a
GetGeometryType() vagy GetGeometryName() függvénnyekkel ellenőrizhetjük le. A következő
sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel vane
dolgunk:
geometry = feature.GetGeometryRef()
if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON':
# feldolgozás
A típusokat az OGR konstansaival (pl. ogr.wkbPoint, ogr.wkbLineString, ogr.wkbPolygon, ogr.wkbMultiPoint, ogr.wkbMultiLineString, ogr.wkbMultiPolygon, stb.) is azonosíthatjuk.
Attribútumok
Az attribútomokat a GetField() függvénnyel és annak variációival érhetjük el. Például:
attr = feature.GetField('id')
attrstr = feature.GetFieldAsString('id')
Az attribútumok számát a GetFieldCount() függvénnyel kapjuk meg.