2016-11-26 66 views
2

ジオパンダをテストして、非常に単純なものにしています:円内にあるジオデータフレームのポイントを削除するにはt he difference methodを使います。ジオパンダス:ポリゴンとポイントの違い()メソッド

ここに私のスクリプトの初めです:

%matplotlib inline 
# previous line is because I used ipynb 
import pandas as pd 
import geopandas as gp 
from shapely.geometry import Point 
[...] 
points_df = gp.GeoDataFrame(csv_file, crs=None, geometry=geometry) 

はここpoints_dfの最初の行です:

:次に

Name  Adress  geometry 
0 place1  street1  POINT (6.182674 48.694416) 
1 place2  street2  POINT (6.177306 48.689889) 
2 place3  street3  POINT (6.18 48.69600000000001) 
3 place4  street4  POINT (6.1819 48.6938) 
4 place5  street5  POINT (6.175694 48.690833) 

、私が最初にGeoDFのいくつかのポイントが含まれていますポイントを追加

base = points_df.plot(marker='o', color='red', markersize=5) 

center_coord = [Point(6.18, 48.689900)] 
center = gp.GeoDataFrame(crs=None, geometry=center_coord) 
center.plot(ax=base, color = 'blue',markersize=5) 

circle = center.buffer(0.015) 
circle.plot(ax=base, color = 'green') 

ここにiPythonノートブックによって表示される結果を示します。

Polygon and points

ここで、目標は緑色の円の中の赤い点を削除することです。そうするためには、違いの方法で十分だと思いました。しかし、私は書くとき:

No changes

が、私は違い()メソッドは、ポリゴンのGeoDataFramesでのみ動作することを推測し、ミックスの間:

selection = points_df['geometry'].difference(circle) 
selection.plot(color = 'green', markersize=5) 

結果は何もpoints_dfで変更しないということです...ポイントとポリゴンはポーズできません。しかし、多分私は何かを逃した!

円内の点の存在をテストする関数は、この場合の差分方法よりも優れていますか?

答えて

2

私はdifference()メソッドがポリゴンでのみ動作すると思われます。 GeoDataFramesとポイントとポリゴンのミックスは可能ではありません。

これは問題のようですが、ポイントでオーバーレイを使用することはできません。

また、この種の空間操作では、単純な空間結合が最も簡単な解決策であるようです。最後の例から始め

;):

%matplotlib inline 
import pandas as pd 
import geopandas as gp 
import numpy as np 
import matplotlib.pyplot as plt 
from shapely.geometry import Point 

# Create Fake Data 
df = pd.DataFrame(np.random.randint(10,20,size=(35, 3)), columns=['Longitude','Latitude','data']) 

# create Geometry series with lat/longitude 
geometry = [Point(xy) for xy in zip(df.Longitude, df.Latitude)] 

df = df.drop(['Longitude', 'Latitude'], axis = 1) 

# Create GeoDataFrame 
points = gp.GeoDataFrame(df, crs=None, geometry=geometry) 

# Create Matplotlib figure 
fig, ax = plt.subplots() 

# Set Axes to equal (otherwise plot looks weird) 
ax.set_aspect('equal') 

# Plot GeoDataFrame on Axis ax 
points.plot(ax=ax,marker='o', color='red', markersize=5) 

# Create new point 
center_coord = [Point(15, 13)] 
center = gp.GeoDataFrame(crs=None, geometry=center_coord) 

# Plot new point 
center.plot(ax=ax,color = 'blue',markersize=5) 
# Buffer point and plot it 
circle = gp.GeoDataFrame(crs=None, geometry=center.buffer(2.5)) 

circle.plot(color = 'white',ax=ax) 

Problem

はポイントが内部または多角形の外にあるかどうかを確認する方法についての問題を私たちに残し...それを達成するための一つの方法ポリゴン内のすべてのポイントに参加し、円内の全ての点と点の間の差がデータフレームを作成することである。

# Calculate the points inside the circle 

pointsinside = gp.sjoin(points,circle,how="inner") 

# Now the points outside the circle is just the difference 
# between points and points inside (see the ~) 

pointsoutside = points[~points.index.isin(pointsinside.index)] 


# Create a nice plot 
fig, ax = plt.subplots() 
ax.set_aspect('equal') 
circle.plot(color = 'white',ax=ax) 
center.plot(ax=ax,color = 'blue',markersize=5) 
pointsinside.plot(ax=ax,marker='o', color='green', markersize=5) 

pointsoutside.plot(ax=ax,marker='o', color='yellow', markersize=5) 

print('Total points:' ,len(points)) 
print('Points inside circle:' ,len(pointsinside)) 
print('Points outside circle:' ,len(pointsoutside)) 

合計:円の内側35個の

ポイント:10

ポイント外側の円:25

Problem solved ;)

+0

は再び;-)をschlumpありがとうございます!私のマシンにrtreeをインストールする際に問題がありますが、あなたの答えが良いので、私はそれを検証します:-) – Raphadasilva

+0

ありがとう:) Yeha私もジオパンダをすべてのものでスムーズに動かすために若干の問題がありました... – schlump

関連する問題