2016-11-26 3 views
2

Ich teste Geopandas, um etwas ganz einfaches zu machen: Verwenden Sie t he difference method, um einige Punkte eines GeoDataFrame zu löschen, die innerhalb eines Kreises sind.Geopandas: Unterschied() Methode zwischen Polygon und Punkten

Hier ist der Anfang von meinem Skript:

%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) 

Hier die ersten Reihen von 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) 

Dann füge ich einen Punkt, der mehrere Punkte des ersten GeoDF enthalten:

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') 

Hier ist das vom iPython-Notebook angezeigte Ergebnis:

Polygon and points

Jetzt ist das Ziel, rote Punkte innerhalb des grünen Kreises zu löschen. Um das zu tun, dachte ich, dass die Differenzmethode ausreicht. Aber wenn ich schreibe:

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

Das Ergebnis ist, dass ... nichts mit points_df geändert:

No changes

Ich denke, dass die Differenz() -Methode nur mit Polygonen GeoDataFrames arbeitet und die Mischung zwischen Punkte und Polygone sind nicht möglich. Aber vielleicht habe ich etwas verpasst!

Ist eine Funktion zum Testen des Vorhandenseins eines Punktes im Kreis in diesem Fall besser als die Differenzmethode?

Antwort

2

Ich denke, dass die Differenz() -Methode nur mit Polygonen GeoDataFrames und die Mischung zwischen den Punkten und Polygonen arbeitet, ist nicht posible.

Das scheint das Problem zu sein, Sie können das Overlay mit Punkten nicht verwenden.

Und auch für diese Art von räumlicher Operation scheint eine einfache räumliche Verbindung die einfachste Lösung zu sein.

mit dem letzten Beispiel starten;):

%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

lassen uns mit dem Problem, wie man bestimmen, ob ein Punkt innerhalb oder außerhalb des Polygons ist ...eine Möglichkeit, dies zu erreichen ist es, alle Punkte innerhalb des Polygons anzuschließen, und einen Datenrahmen mit der Differenz zwischen allen Punkten und Punkten innerhalb des Kreises zu schaffen:

# 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)) 

Gesamtpunktzahl: 35

Punkte innerhalb des Kreises: 10

Punkte Außenkreis: 25

Problem solved ;)

+0

Danke wieder schlump ;-)! Ich habe ein Problem, um rtree auf meinem Rechner zu installieren, aber ich bin mir sicher, dass deine Antwort gut ist, also bestätige ich es :-) – Raphadasilva

+0

Danke :). Yeha ich hatte auch ein paar kleine Probleme, um Geopandas mit allem reibungslos laufen zu lassen ... – schlump

Verwandte Themen