Python jest językiem ogólnego przeznaczenia a nie środowiskiem interaktywnej analizy danych. Wiele ułatwień obecnych w środowisku R nie jest dostępnych ze względu na inną naturę jęzka.Podobnie jak w innych współczesnych narzędziach programistycznych dostęp do danych geoprzestrzennych odbywa się przy pomocy bibliotek GDAL/OGR, które będą omawiane w czasie całego kursu.
Do realizacji zadania potrzebujemy podstawowego zestawu bibliotek:
UWAGA - w podstawowej wersji GDAL/OGR działają tylko z Python 2.
import matplotlib.pyplot as plt
import numpy as np
from osgeo import gdal
from osgeo import ogr
import os
Ścieżki dostępu wymagają dostosowania do lokalizacji danych, dotyczy to zmiennej "path", gdzie powinna zostać podana aktualna ścieżka dostępu do katalogu zawierającego ćwiczenie
# sprawdzić scieżki dostępu
path = os.path.join(os.path.expanduser("~"),"Documents")
shapefile = os.path.join(path,"zadanie0","sample.shp")
rastfile = os.path.join(path,"zadanie0","green.tif")
print shapefile
print rastfile
Wczytadnie danych rastrowych wymaga wykonania trzech poleceń:
| easting | ew-resolution | 0 | northing | 0 | ns-resolution |
gdal.Open nie wczytuje danych do pamięci, a jedynie tworzy połączenie ze zbiorem danych.
raster = gdal.Open(rastfile)
band = raster.GetRasterBand(1)
gtr = raster.GetGeoTransform() # paramtery transformacji rastra
print gtr
Ta czynność jest nieco bardziej skomplikowana (dokładniej: warper na funkcję języka C jest napisany mniej inteligentnie niż w przypadku gdal). W pierwszej kolejności tworzymy obiekt driver (drv) tu stosując rozwiązanie polegające na wykorzystaniu nazwy sterownika dostępu do danych
W następnym kroku otwieramy dostęp do danych i pobieramy połączenie do warstwy danych. Dane nie są wczytywane ale twożony jest tzw. iterator, a więc obiekt posiadający wyłącznie metodę .next(), która odczytuje jednorazowo aktualny element listy, a następnie zamienia go następnym. Iterator nie może być w prosty sposób przewinięty do początku, za każdym razem trzeba na nowo odnawiać połączenie (czyli wywoływać ponownie poniższe dwa polecenia). Ostatnie polecenie tworzy nam pustą listę, do której będziemy zapisywać wartości odczytywane z rastra.
drv = ogr.GetDriverByName("ESRI Shapefile")
vector = drv.Open(shapefile,0)
layer = vector.GetLayer()
lista=[]
Dane odczytywane są punkt po punkcie w pętli for:
na końcu lista zostaje wyświetlona.
for feature in layer:
geom = feature.GetGeometryRef()
x,y = geom.GetX(), geom.GetY()
px = int((x - gtr[0]) / gtr[1]) #x pixel
py = int((y - gtr[3]) / gtr[5]) #y pixel
val=band.ReadAsArray(px,py,1,1)
lista.append(val[0][0])
print lista
Ostatnim krokiem jest przygotowanie i wyświetlenie wykresu, do czego zostanie wykorzystana biblioteka matplotlib. W pierwszym kroku lista jest zamieniana na numpy array, a następnie wyświetlany jest boxplot. Boxplot nie toleruje wartości pustych oraz nieskończoności. Z tego powodu należy przefiltrować obiekt array, aby usunąć z niego wyszystkie elementy, które nie są skończoną wartością liczbową.
arr = np.array(lista)
plt.figure()
plt.boxplot(arr[np.isfinite(arr)], 0)
plt.show()