0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Shapely の Buffer について(基本)

Posted at

この記事について

仕事で 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オブジェクト)

が、それぞれ入った状態です。

こんな感じ。

image.png

image.png

Buffer を与えるための文法

Buffer を与えるための文法は以下のとおりです。

Buffer を与えるための文法
ジオメトリインスタンス.buffer(バッファの大きさ)

点(Pointオブジェクト) に Buffer を与える

点(Point オブジェクト)に Buffer を与える
s[0].buffer(0.5)

こうすると以下のように、s[0] から半径 0.5 の円が描画できます。

image.png

Buffer を与えた後の Point オブジェクトの情報を表示すると…

Buffer を与えた後の Point オブジェクトの情報を表示
print(s[0].buffer(0.5))

以下のように、けっこう複雑な Polygon オブジェクトを自動で作ってくれていることがわかります。

image.png

できた円は Polygon オブジェクトなので、以下のように面積を求めることもできます。

面積を求める
s[0].buffer(0.5).area # 0.7841371226364849

半径=0.5の円の面積になっていますね。

image.png

線(LineStringオブジェクト) に Buffer を与える

線(LineString オブジェクト)に Buffer を与える
s[1].buffer(0.5)

こうすると以下のように、s[1] のルートの周辺 0.5 の範囲をカバーする図形が描画されます。

image.png

Buffer を与えた後の LineString オブジェクトの情報を表示すると…

Buffer を与えた後の Point オブジェクトの情報を表示
print(s[0].buffer(0.5))

やはりちょっと複雑めのPolygon オブジェクトが表示されます。

image.png

図形(Polygon オブジェクト) に Buffer を与える

図形(Polygon オブジェクト)に Buffer を与える
s[2].buffer(0.5)

こうすると以下のように、s[2] の周辺 0.5 の範囲をカバーする図形が描画されます。

image.png

以下のように、もとの図形と重ねて表示すると、違いがよくわかりますね。

Bufferを与える前後の図形を重ねて表示
from shapely.geometry import MultiPolygon

polygon_a = s[2]               # もとの図形
polygon_b = s[2].buffer(0.5)   # バッファあり
polygons = MultiPolygon([polygon_a, polygon_b])
polygons

image.png

GeoSeries 全体に Buffer を与える

以下のように、GeoSeries全体にまとめてBufferを与えることもできます。

GeoSeries 全体にまとめて Bufferを与える
s.buffer(0.5)

もともとは点(Pointオブジェクト)、線(LineStringオブジェクト)、図形(Polygonオブジェクト)だった GeoSeries の中身が、すべて Polygon になっていることがわかります。

image.png

その上で、バッファをかけた GeoSeries 全体からインデックスを指定して要素を取り出すこともできます。

GeoSeries x Buffer x 要素の取り出し
# 今までのやりかた
s[2].buffer(0.5)

# こっちでもできる
s.buffer(0.5)[2]

どちらがいいのかは・・・これから勉強してわかったら書きます。

今日の記事は以上です。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?