GIS for python
GISデータ(ラスタ・ベクタ等)をPython上で扱う上で便利なライブラリの紹介。
その他、再投影方法と、matplotlibを用いた描写方法まで
ライブラリ群
osgeo.gdal |
geopandas |
rasterio |
|
|---|---|---|---|
| 扱えるデータ形式 | ラスターデータ | ベクターデータ | ラスターデータ |
| 描写機能 | なし? | あり | あり |
1. osgeo.gdal
- gisデータを扱うための基本ライブラリ
- 基本データタイプは
osgeo.gdal.Dataset
gdal.Dataset
- データ本体、左上ピクセルの座標情報(geotrans)、投影情報などで構成
- 左上のピクセルの座標は(lat, $\varDelta$lat, 0, lon, 0, $\varDelta$lon)の順(set型)
# tifファイルから各種データを読込む
from osgeo import gdal
src_ds = gdal.Open('input.tif')
src_arr = src_ds.GetRasterBand(1).ReadAsArray() # データ本体をnumpy.ndarray型に変換
src_geotrans = src_ds.GetGeoTransform() # 左上ピクセルの座標情報をtupple型に変換
src_proj = src_ds.GetProjection() # 投影情報をstr型に変換
2. geopandas
- ベクターデータを読みこみ
Pandasとほぼ同じ表形式で扱うことができるPythonライブラリ - 基本データタイプは
geopandas.geodataframe.GeoDataFrame - 公式ドキュメント[https://geopandas.org/en/stable/]
geopandas.geodataframe.GeoDataFrame
-
pandasと同様の表形式で、属性情報とgeometryを保存
import geopandas as gpd
gdf = gpd.read_file('input.shp') # shpファイル以外にもgeojsonなども読込可
3. rasterio
- ラスターデータを扱うためのライブラリ
-
gdalよりもより簡単にデータの取得が可能 - geotransは
rasterio.Affine型で、($\varDelta$lon, 0, lon, 0, $-\varDelta$lat, lat)
import rasterio
with rasterio.open('input.tif') as src
src_arr = src.read(1)
src_geotrans = src.transform
再投影
gdal.Warpを使用する
-
gdal.Warp( out_path, input, srcSRS, dstSRS, outputBounds=(xmin, ymin, xmax, ymax), resampleAlg='average', srcNodata, dstNodata)- 返り値を受け取ると、再投影後の
gdal.Datasetとなる
- 返り値を受け取ると、再投影後の
| 引数 | type | 概要 |
|---|---|---|
| out_path | str(path) |
出力先ファイルのパス |
| input |
str(path)orgdal.Dataset
|
入力データのパス、もしくはgdal.Dataset型変数 |
| srcSRS | str(EPSG: or Wkt code) |
入力データの座標系情報(省略可能) |
| dstSRS | str(EPSG: or Wkt code) |
出力データの座標系情報 |
| outputBounds | array like(xmin, ymin, xmax, ymax) |
出力後の切り出し位置(省略可能) |
| resampleAlg | str |
リサンプリング方法 |
| srcNodata | int or float |
入力データのNodata値 |
| dstNodata | int or float |
出力データのNodata値 |
描写
ベクターデータ
geopandasを使用する
-
gdf.plot(ax)- 指定したaxisにgdf内のベクターデータを表示
import geopandas as gpd
from matplotlib import pyplot as plt
fig, ax = plt.subplots()
gdf = gpd.read_file('input.shp') # shpファイルの読込
gdf.plot(ax=ax, color='none') # color='none'でポリゴン内の塗りつぶしなしに指定可能
ラスターデータ
rasterioを使用する
-
rasterio.plot.show(arr, transform)-
numpy.ndarrayにgeotransをつけて表示する
-
| 引数 | type | 概要 |
|---|---|---|
| arr | numpy.ndarray |
表示したいArray likeなデータ |
| transform | rasterio.Affine |
左上のピクセルの座標($\varDelta$lon, 0, lon, 0, $-\varDelta$lat, lat) |
import rasterio
from rasterio import plot as rplt
with rasterio.open('input.tif') as f:
raster_trans = f.transform # geotransを読込み、rasterio.Affine型に変換
raster_arr = f.read(1) # バンドの中身を読込み、numpy.ndarray型に変換
fig, ax = plt.subplots()
rplt.show(raster_arr, transform=raster_trans)