LoginSignup
2
3

More than 1 year has passed since last update.

GISデータ(ラスター・ベクター)をPythonで処理する

Last updated at Posted at 2022-09-17

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)
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3