🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

7736閲覧

geopandasでshpファイルのポリゴンを構成しているポイント座標(ジオメトリ)を抽出したい

melo_yuya

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/02/25 09:52

geopandasでshpファイルのポリゴンを構成しているポイント座標(ジオメトリ)を抽出したい

農地データと人工衛星のマイクロ波の照射方向の関係性について研究しています。
geopandasによってshpファイル(ポリゴン)を抽出しました。
そこでジオメトリのポイント座標を演算のために抽出しようと考えています。

###実行環境
実行環境はWindows10、Annaconda(Spyder)を使用しています。

該当のソースコード

python

1import geopandas as gpd 2 3#shpファイルの読み込み 4yoshi_2019=gpd.read_file("yoshikawa_2019.shp") 5 6yoshi_points = yoshi_2019['geometry'] 7print(yoshi_points)

出力結果

上記のコードを実行すると、以下の結果が得られました。

python

10 POLYGON Z ((273474.470 4123032.881 0.000, 2734... 21 POLYGON Z ((266669.419 4122033.251 0.000, 2666... 32 POLYGON Z ((266698.965 4122029.388 0.000, 2667... 43 POLYGON Z ((266659.482 4121927.719 0.000, 2666... 54 POLYGON Z ((266626.999 4121931.518 0.000, 2666... 6 73693 POLYGON Z ((266500.679 4121835.558 0.000, 2665... 83694 POLYGON Z ((266524.600 4121831.832 0.000, 2665... 93695 POLYGON Z ((266686.077 4121924.596 0.000, 2667... 103696 None 113697 None 12 13Name: geometry, Length: 3698, dtype: geometry

実現させたいこと

私はPOLIGON Z ()のポリゴンを構成している座標を抽出したいです。
おそらく (273474.470 4123032.881 0.000)を取り出すことが出来れば
、演算できるのではないかと考えています。
もし分かる方がおられましたら、教えて頂きたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

"POLYGON Z ((273474.470 4123032.881 0.000, 2734..." と表示されているデータの実体は、GeoPandasが依存するShapelyライブラリのオブジェクトです。
ここでは格納されているのがポリゴンデータですので、Polygonオブジェクトです。

python

1>>> yoshi_2019['geometry'][0] 2<shapely.geometry.polygon.Polygon object at 0x7fc870d37950> 3>>> yoshi_2019['geometry'][0].geom_type 4Polygon

Shapelyはジオメトリの操作と分析のためのライブラリです。Shapelyライブラリのオブジェクトに用意されているメソッドや属性を使って、ジオメトリのポイント座標を抽出することができます。

Shapelyのジオメトリオブジェクトにはinterior、boundary、exteriorの3つの属性があり、さらにそれぞれのcoords属性によって座標値を取得できます。
単純なポリゴンの場合は、exteriorから取得すれば良いでしょう。

python

1# サンプルデータの作成 2>>> from shapely.geometry import Polygon 3>>> p = Polygon([(0, 0, 1), (1, 1, 2), (1, 0, 2), (0, 0, 1)]) 4>>> p 5<shapely.geometry.polygon.Polygon object at 0x7fc87064d1d0> 6>>> print(p) 7POLYGON Z ((0 0 1, 1 1 2, 1 0 2, 0 0 1)) 8 9# exteriorからポイント座標をリストとして抽出 10>>> list(p.exterior.coords) 11[(0.0, 0.0, 1.0), (1.0, 1.0, 2.0), (1.0, 0.0, 2.0), (0.0, 0.0, 1.0)]

どのような形で座標を抽出するのが良いのかは、質問者さんのやりたいことに依存します。たとえばX座標、Y座標、Z座標ごとにまとめて取得したいときはlist(zip(*p.exterior.coords)) とすることで可能です。

単純に元のGeoPandasデータフレームに追加する場合は次のようにすることができます。'coordinates’という新しい列を作ってそこに追加してみました。

python

1>>> yoshi_2019['coordinates'] = yoshi_2019['geometry'].apply(lambda p:list(p.exterior.coords))

ポリゴンデータが内部に穴を持っている場合は、内部の穴のポリゴンの座標値も取得するのかとか(この値はinteriorsに格納されています)、マルチポリゴンだった場合はそれぞれのポリゴンごとに値を取得しないといけないなど、それに応じた考慮が必要になります。

Shapely — Shapely documentation
https://shapely.readthedocs.io/en/stable/index.html

投稿2021/02/27 01:32

編集2021/02/27 01:40
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melo_yuya

2021/03/01 08:34

ご回答ありがとうございます。 無事座標を抽出することが出来ました。
guest

0

ベストアンサー

以下で取り出せると思います。

python

1import re 2 3def convert_coordinates(x): 4 s = re.sub('(^[^(]*(*)|()*)', '', x.wkt) 5 return [[float(x) for x in y.strip().split(' ')] for y in s.split(',')] 6 7coordinates = convert_coordinates(yoshi_points[0]) 8print(coordinates)

投稿2021/02/25 22:02

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melo_yuya

2021/03/01 08:36

ご回答ありがとうございます。 座標を取り出すことが出来ました。 取り出した座標のうち、X座標・Y座標のみを取り出す方法があれば教えていただきたいです。
etherbeg

2021/03/04 12:59

return [[float(x) for x in y.strip().split(' ')] for y in s.split(',')] とあるところを return [[float(x) for x in y.strip().split(' ')][:2] for y in s.split(',')] に変えればX座標・Y座標のみを取り出すことができます。 私が回答した方法の場合は list(p.exterior.coords) ではなく [[x,y] for x,y,z in p.exterior.coords] とすればX座標・Y座標のみを取り出すことができます。
melo_yuya

2021/03/08 10:29

ご回答ありがとうございます。 X座標・Y座標のみ取り出せました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問