質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1669閲覧

geopandas(地理空間情報処理)でpolygon内の範囲がおかしい

mu-ro

総合スコア20

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/07/31 08:38

困っていること

以下のプログラムを実行して,座標点を表すpointが領域を表すpolygonに存在しているか判別したいです.
print(point.within(polygon))
で判別が可能で,polygon内にpointが存在する場合はTrueを返却するのですが,Falseを返却されます.

今回使用したpoint座標はpolygonの領域内に存在しています.

Polygonの領域を地図上で確認してみたところ以下のようになりました.

イメージ説明

つまり,Polygonの領域が薄緑の付いている箇所のみになってしまいます.
なぜこのようなことになるか,また,解決法が分かる方いらっしゃれば教えていただけると幸いです!

import pandas as pd import numpy as np import os import geopandas as gpd from shapely.geometry import Point import matplotlib import matplotlib.pyplot as plt import folium import plotly_express as px from datetime import datetime import geemap from ipygee import* from shapely.ops import cascaded_union from geopy.distance import geodesic from shapely.geometry.polygon import Polygon import shapely # ルートディレクトリ ROOT = './' # プローブデータ読み込み probe = gpd.read_file(f'{ROOT}/routemap.geojson') print(probe) # name _iconUrl 駐車 標高 _color _weight _opacity _dashArray geometry # 0 足利公園 https://map.jpn.org/icon/954025.png 8台 None None NaN NaN None POINT (139.43479 36.33788) # 1 第2号墳 https://map.jpn.org/icon/952014.png None None None NaN NaN None POINT (139.43520 36.33723) # 2 水道山 https://map.jpn.org/icon/952015.png None 93m None NaN NaN None POINT (139.43447 36.33903) # 3 稲荷神社 https://map.jpn.org/icon/951005.png None None None NaN NaN None POINT (139.42873 36.34150) # 4 石碑 https://map.jpn.org/icon/951005.png None None None NaN NaN None POINT (139.42888 36.34283) # 5 立岩山 https://map.jpn.org/icon/952015.png None 96m None NaN NaN None POINT (139.42783 36.34201) # 6 愛宕山 https://map.jpn.org/icon/952015.png None 81m None NaN NaN None POINT (139.42365 36.34519) # 7 船頭山 https://map.jpn.org/icon/952015.png None None None NaN NaN None POINT (139.42609 36.34853) # 8 天神様 https://map.jpn.org/icon/951005.png None None None NaN NaN None POINT (139.42671 36.34927) # 9 琴平山 https://map.jpn.org/icon/951005.png None None None NaN NaN None POINT (139.42558 36.35259) # 10 湯殿山 https://map.jpn.org/icon/952015.png None 160m None NaN NaN None POINT (139.42648 36.35433) # 11 山神社 https://map.jpn.org/icon/951005.png None None None NaN NaN None POINT (139.42979 36.35878) # 12 野山 https://map.jpn.org/icon/952015.png None 297m None NaN NaN None POINT (139.42641 36.36264) # 13 障子岩 https://map.jpn.org/icon/952014.png None None None NaN NaN None POINT (139.43211 36.36822) # 14 大岩山 https://map.jpn.org/icon/952015.png None 417m None NaN NaN None POINT (139.43793 36.37214) # 15 展望岩場 https://map.jpn.org/icon/952014.png None None None NaN NaN None POINT (139.44706 36.36501) # 16 雷電神社分岐 https://map.jpn.org/icon/951005.png None None None NaN NaN None POINT (139.44806 36.35903) # 17 両崖山 https://map.jpn.org/icon/952015.png None 251m None NaN NaN None POINT (139.44800 36.35354) # 18 天狗山 https://map.jpn.org/icon/952015.png None 259m None NaN NaN None POINT (139.44116 36.35377) # 19 須永山 https://map.jpn.org/icon/952015.png None 154m None NaN NaN None POINT (139.43774 36.34343) # 20 大岩山(往路) None None None #0000ff 3.0 0.5 3,6 LINESTRING (139.43479 36.33788, 139.43514 36.3... # 21 大岩山(復路) None None None #ff0000 3.0 0.5 3,6 LINESTRING (139.43793 36.37215, 139.43800 36.3... # 任意の点が領域(ポリゴン)内に存在するか判別 # 任意座標 p = [36.3646321899427, 139.44395774894275] point = Point(p) # プローブデータをポリゴン化 pol = [] for i in range(len(probe)): poly = probe.iloc[i].geometry # print(poly) for i in [p for p in poly.coords]: pol.append(i) polygon = Polygon(pol) print(polygon) # POLYGON ((139.434786 36.337881, 139.435203 36.337233, 139.434467 36.339033, 139.428731 36.341503, 139.428881 36.342828, 139.427831 36.342014, 139.423647 36.345186, 139.426089 36.348533, 139.426706 36.349272, 139.425583 36.352594, 139.426481 36.354331, 139.429794 36.358783, 139.426406 36.362642, 139.432106 36.368222, 139.437928 36.372144, 139.447061 36.365014, 139.448056 36.359033, 139.448003 36.353542, 139.441158 36.353775, 139.437736 36.343428, 139.434785 36.337881, 139.43514 36.337194, 139.434296 36.338578, 139.434473 36.339043, 139.434331 36.338583, 139.433249 36.338294, 139.432788 36.338317, 139.432713 36.339203, 139.432851 36.339868, 139.432695 36.339957, 139.429384 36.340212, 139.42913 36.340533, 139.428746 36.341572, 139.428564 36.341564, 139.428617 36.341774, 139.428053 36.341648, 139.42888 36.342827, 139.428419 36.342251, 139.4278 36.341971, 139.428083 36.341973, 139.428061 36.341849, 139.428213 36.341827, 139.42805 36.341644, 139.428539 36.341783, 139.428515 36.341185, 139.427906 36.340964, 139.426927 36.340852, 139.426283 36.340902, 139.421937 36.343432, 139.422395 36.344666, 139.423808 36.345255, 139.423671 36.345283, 139.423903 36.345242, 139.42511 36.346605, 139.424813 36.346779, 139.424617 36.34649, 139.425094 36.34621, 139.424244 36.345539, 139.423917 36.345622, 139.42345 36.346277, 139.423288 36.34633, 139.423846 36.346796, 139.424998 36.348129, 139.425729 36.347995, 139.425966 36.347559, 139.425869 36.347153, 139.425561 36.346879, 139.426456 36.346743, 139.42684 36.348684, 139.426268 36.348653, 139.426113 36.348515, 139.426106 36.348644, 139.426324 36.348788, 139.426321 36.348644, 139.426897 36.348646, 139.426976 36.349121, 139.426705 36.349271, 139.426924 36.349168, 139.427086 36.349517, 139.42664 36.350714, 139.426024 36.350763, 139.426098 36.35132, 139.425839 36.352254, 139.425432 36.352772, 139.425684 36.353721, 139.426127 36.354179, 139.426569 36.354362, 139.426473 36.354331, 139.426495 36.3549, 139.426672 36.355307, 139.426632 36.35596, 139.427366 36.356978, 139.427405 36.357295, 139.428104 36.357905, 139.429059 36.358218, 139.429344 36.358115, 139.429999 36.358512, 139.430123 36.358797, 139.430011 36.358847, 139.428896 36.358509, 139.42719 36.358265, 139.42692 36.358534, 139.426516 36.358673, 139.426416 36.35901, 139.426042 36.359144, 139.425521 36.359798, 139.425332 36.3604, 139.426006 36.361575, 139.426498 36.362063, 139.426364 36.362721, 139.426474 36.362771, 139.42634 36.362748, 139.426464 36.363532, 139.426843 36.364517, 139.426681 36.364937, 139.427023 36.365867, 139.427425 36.366018, 139.428337 36.366025, 139.429172 36.366318, 139.43013 36.367265, 139.430596 36.367391, 139.430813 36.36768, 139.431725 36.367983, 139.431986 36.368188, 139.432463 36.368309, 139.432932 36.368184, 139.433537 36.368952, 139.434319 36.369609, 139.434474 36.369924, 139.434939 36.370219, 139.435642 36.370381, 139.435928 36.370616, 139.4369 36.370862, 139.437435 36.371554, 139.438116 36.371722, 139.437942 36.372087, 139.437927 36.372145, 139.438003 36.372298, 139.438194 36.371666, 139.438471 36.37143, 139.438957 36.371339, 139.439332 36.37141, 139.439654 36.371312, 139.439614 36.371192, 139.440109 36.371173, 139.440738 36.370661, 139.441225 36.370026, 139.441459 36.369243, 139.442432 36.368309, 139.443289 36.367808, 139.443734 36.367026, 139.444571 36.366436, 139.445434 36.366393, 139.445956 36.366107, 139.447061 36.365014, 139.44771 36.363717, 139.447656 36.36304, 139.44733 36.36266, 139.447288 36.36224, 139.446795 36.362301, 139.446978 36.361787, 139.447108 36.360426, 139.447311 36.360086, 139.447439 36.360093, 139.448056 36.359033, 139.447324 36.357889, 139.447391 36.357497, 139.447086 36.356524, 139.446636 36.356069, 139.44738 36.35546, 139.447593 36.355413, 139.447768 36.355132, 139.44781 36.353815, 139.448214 36.353375, 139.447815 36.353169, 139.447127 36.35309, 139.446789 36.352728, 139.445894 36.353084, 139.445635 36.353373, 139.444582 36.35377, 139.44353 36.353649, 139.443212 36.35382, 139.442895 36.353772, 139.442481 36.353974, 139.441158 36.353785, 139.440411 36.353075, 139.439586 36.352635, 139.439096 36.351735, 139.439125 36.351038, 139.438521 36.349661, 139.438563 36.348815, 139.438769 36.348525, 139.438774 36.347918, 139.439322 36.347084, 139.439053 36.34659, 139.438884 36.345215, 139.438167 36.344511, 139.437388 36.342849, 139.437579 36.341707, 139.436978 36.340702, 139.437671 36.339638, 139.437861 36.339589, 139.437199 36.339139, 139.435611 36.338706, 139.434787 36.338048, 139.434786 36.337881)) # pointがpolygon内に存在するか判定 print(point.within(polygon)) # False # 地図上表示 m = folium.Map(p, zoom_start=15, control_scale=True) folium.Polygon( # locations=[(24.950899, 60.169158), (24.953492, 60.169158), (24.953510, 60.170104), (24.950958, 60.169990)], # 多角形の頂点 locations=pol, # 多角形の頂点 color="green", # 線の色 weight=10, # 線の太さ fill=True, # 塗りつぶす fill_opacity=0.5 # 透明度(1=不透明) ).add_to(m) folium.Marker(p, popup="任意の点").add_to(m) m.save("check.html")

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

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

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

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

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

can110

2021/07/31 08:46

> 今回使用したpoint座標はpolygonの領域内に存在しています 薄緑色の部分が領域なのであれば、pointは領域外であることは目視で明らかであるとおもうのですが、 どういった理由で領域内なのでしょうか?
mu-ro

2021/07/31 08:58

すみません,言葉足らずでした. 領域内というより,Polygonの外周枠の内側にあるマーカがpointの座標という意味でした.
meg_

2021/07/31 09:06

> つまり,Polygonの領域が薄緑の付いている箇所のみになってしまいます. どうなるのが正解(質問者さんが意図したもの)なのですか?
mu-ro

2021/07/31 16:15

説明が下手で申し訳ないです,,, Polygon内全体が領域となるようにしたかった(Polygon内に空白を作りたくなかった)ということです!
guest

回答1

0

ベストアンサー

plain

1# 20 大岩山(往路) None None None #0000ff 3.0 0.5 3,6 LINESTRING (139.43479 36.33788, 139.43514 36.3... 2# 21 大岩山(復路) None None None #ff0000 3.0 0.5 3,6 LINESTRING (139.43793 36.37215, 139.43800 36.3...

の部分が、不要なデータなんじゃないですか?
この部分はいったい何を表していますか?
散策道か何かの細かいパスじゃないでしょうか?


最初の20個がプローブが置かれているポイントで山を荒く1周しているような道筋で、
残り(↑の2つ)が細かく1周していますよね。

山を2周するようなパスからポリゴンを作っているから中が抜ける形になるんじゃないでしょうか。


(追記)
コードに使われている変数名から、最初の20個が欲しい方で残りが要らない方と推測しましたが、実際は逆で、最初の20個が要らない方で残りが欲しい方という可能性もありそうですね。


(追記)

Powerpoint等で塗りつぶしありの多角形=ポリゴンを描くことで確かめられますが、パスを交差させると中に「ポリゴンの外」があらわれます。(図の左、6頂点のポリゴンの中にできている白三角形)
パスを挟んで一方が内側なら、逆のもう一方は外側であるのが自然ですから。

イメージ

ほとんど同じルートを2周するパスでポリゴンを作ったら、中はほとんどすべて「ポリゴンの外」になります。(図の中と右)
そのようなデータになっています。

投稿2021/07/31 09:20

編集2021/07/31 12:05
quickquip

総合スコア11072

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

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

mu-ro

2021/07/31 16:19

ご回答ありがとうございます!! ご指摘頂いたとおり前半の0〜19番目のデータが不要でした. 0〜19番目のPointデータのみ あるいは,20,21番目のLineStringデータのみ を使用することで領域内に穴を開けずに(ポリゴンの外を作らずに)ポリゴンを作成できました. ポリゴンについても詳しく解説してくださりありがとうございます,助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問