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)