Geopandas:多边形和点之间的差异()方法

时间:2016-11-26 13:14:14

标签: python pandas dataframe difference geopandas

我正在测试geopandas以使一些事情变得非常简单:使用t he difference method删除圈内的GeoDataFrame的某些点。

这是我的剧本的开头:

%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

现在,目标是删除绿色圆圈内的红点。要做到这一点,我认为差异方法就足够了。但是当我写道:

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

结果是......没有用points_df改变:

No changes

我认为difference()方法仅适用于多边形GeoDataFrames,并且点和多边形之间的混合不可行。但也许我错过了什么!

在这种情况下,测试圆中一个点的存在的函数是否会优于差分方法?

1 个答案:

答案 0 :(得分:4)

  

我猜,difference()方法仅适用于多边形   GeoDataFrames以及点和多边形之间的混合是不可能的。

这似乎是个问题,你不能使用叠加点。

对于那种空间操作,简单的空间连接似乎是最简单的解决方案。

从最后一个例子开始;):

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

Problem

让我们知道如何确定一个点是在多边形的内部还是外部......实现这一点的一种方法是连接多边形内的所有点,并创建一个具有所有点之间差异的DataFrame。圈内的点:

{{1}}

总分:35

圈内点数:10

圈外点数:25

Problem solved ;)