この記事について
仕事で GIS データを扱うことになったので、基本から学ぶことにしました。
以下の講座を受けながら、Buffer の概念についてメモ。
Buffer
Buffer とは
点や線に一定の幅を与えて、Polygonにする操作。
ある地点(Point
)から半径○km以内の店を探す、とか、ある道路(LineString
)の沿線○m以内の店を探す、といったときに便利。
PolygonにBufferを与えて、ある地域(Polygon
)の中と周辺○km以内の店を探す、みたいな使い方をすることもできる。
Buffer の使い方(基本)
以下のコードは、下記のライブラリがインポートされていることが前提です。
import geopandas as gpd
from shapely.geometry import Point, LineString, Polygon
たとえば、以下のような GeoSeries
があったとします。
s = gpd.GeoSeries(
[
Point(0,0),
LineString([(0,0),(1,1),(3,0),(5,2)]),
Polygon([(-1,-1),(-2,-2),(1,-2),(-1,-1)])
]
)
-
s[0]
には点(Point
オブジェクト) -
s[1]
には線(LineString
オブジェクト) -
s[2]
には図形(Polygon
オブジェクト)
が、それぞれ入った状態です。
こんな感じ。
Buffer を与えるための文法
Buffer を与えるための文法は以下のとおりです。
ジオメトリインスタンス.buffer(バッファの大きさ)
点(Point
オブジェクト) に Buffer を与える
s[0].buffer(0.5)
こうすると以下のように、s[0]
から半径 0.5
の円が描画できます。
Buffer を与えた後の Point
オブジェクトの情報を表示すると…
print(s[0].buffer(0.5))
以下のように、けっこう複雑な Polygon
オブジェクトを自動で作ってくれていることがわかります。
できた円は Polygon
オブジェクトなので、以下のように面積を求めることもできます。
s[0].buffer(0.5).area # 0.7841371226364849
半径=0.5の円の面積になっていますね。
線(LineString
オブジェクト) に Buffer を与える
s[1].buffer(0.5)
こうすると以下のように、s[1]
のルートの周辺 0.5
の範囲をカバーする図形が描画されます。
Buffer を与えた後の LineString
オブジェクトの情報を表示すると…
print(s[0].buffer(0.5))
やはりちょっと複雑めのPolygon
オブジェクトが表示されます。
図形(Polygon
オブジェクト) に Buffer を与える
s[2].buffer(0.5)
こうすると以下のように、s[2]
の周辺 0.5
の範囲をカバーする図形が描画されます。
以下のように、もとの図形と重ねて表示すると、違いがよくわかりますね。
from shapely.geometry import MultiPolygon
polygon_a = s[2] # もとの図形
polygon_b = s[2].buffer(0.5) # バッファあり
polygons = MultiPolygon([polygon_a, polygon_b])
polygons
GeoSeries 全体に Buffer を与える
以下のように、GeoSeries全体にまとめてBufferを与えることもできます。
s.buffer(0.5)
もともとは点(Point
オブジェクト)、線(LineString
オブジェクト)、図形(Polygon
オブジェクト)だった GeoSeries
の中身が、すべて Polygon
になっていることがわかります。
その上で、バッファをかけた GeoSeries
全体からインデックスを指定して要素を取り出すこともできます。
# 今までのやりかた
s[2].buffer(0.5)
# こっちでもできる
s.buffer(0.5)[2]
どちらがいいのかは・・・これから勉強してわかったら書きます。
今日の記事は以上です。