Python geopandas无法识别多边形中的点

Python geopandas无法识别多边形中的点,python,polygon,point,geopandas,Python,Polygon,Point,Geopandas,我有两个数据帧。一个有建筑物的多边形(约70K),另一个有可能在多边形内部或不在多边形内部的点(约100K)。我需要确定一个点是否在多边形内 当我绘制两个数据帧(下面的示例)时,该图显示一些点位于多边形内部,而另一些点不在多边形内部。但是,当我使用.within()时,结果显示所有点都不在多边形内 我重新创建了一个示例,即“手动”创建一个多边形和一个点,而不是导入数据,在本例中,.within()确实识别出该点位于多边形中。因此,我认为我犯了一个错误,但我不知道在哪里 示例:(为了简单起见,我只

我有两个数据帧。一个有建筑物的多边形(约70K),另一个有可能在多边形内部或不在多边形内部的点(约100K)。我需要确定一个点是否在多边形内

当我绘制两个数据帧(下面的示例)时,该图显示一些点位于多边形内部,而另一些点不在多边形内部。但是,当我使用.within()时,结果显示所有点都不在多边形内

我重新创建了一个示例,即“手动”创建一个多边形和一个点,而不是导入数据,在本例中,.within()确实识别出该点位于多边形中。因此,我认为我犯了一个错误,但我不知道在哪里

示例:(为了简单起见,我只发布对应于一个点和一个多边形的部分。在本例中,每个数据帧包含一个点或一个多边形)

1) 使用导入的数据。数据帧dmR具有点,数据帧dmf具有多边形

import pandas as pd
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from shapely import wkt
from shapely.geometry import Point, Polygon
plt.style.use("seaborn")

# I'm skipping the data manipulation stage and 
# going to the point where the data are used.

print(dmR)

               geometry
35  POINT (-95.75207 29.76047)

print(dmf)
               geometry
41964  POLYGON ((-95.75233 29.76061, -95.75194 29.760...

# Plot
fig, ax = plt.subplots(figsize=(5,5))
minx, miny, maxx, maxy = ([-95.7525, 29.7603, -95.7515, 29.761])
ax.set_xlim(minx, maxx)
ax.set_ylim(miny, maxy)
dmR.plot(ax=ax, c='Red')
dmf.plot(ax=ax, alpha=0.5)
plt.savefig('imported_data.png')
结果 . 但是,

print(dmR.within(dmf))
35       False
41964    False
dtype: bool
ex_p.within(ex)
0    True
dtype: bool
2) 如果我尝试手动重新创建,它将如下所示(可能有更好的方法,但我无法找到):

在这种情况下,结果就是如此。但是,

print(dmR.within(dmf))
35       False
41964    False
dtype: bool
ex_p.within(ex)
0    True
dtype: bool

可以识别点位于多边形中。所有关于如何做的建议都将不胜感激!谢谢。

我不知道这是否是最有效的方法,但我能够在Python和Geopandas中完成我需要的工作


我没有使用
point.in(polygon)
方法,而是进行了空间连接(
geopandas.sjoin(df_1,df_2,how='internal',op='contains')
),这将生成一个新的数据帧,其中包含多边形内的点,并排除非多边形的点。可以找到有关如何执行此操作的更多信息。

我认为您的坐标参考系(crs)有些可疑。我无法说明
dmr
,因为它没有提供,但是
ex\u p
是一个简单的几何体,因为您从点生成它时没有指定crs。您可以使用以下方式检查crs:

dmr.crs
假设它位于4326,那么它将返回:

<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
如果要动态继承
dmr
的crs,还可以使用:

ex_p = ex_p.set_crs(dmr.crs)
设置crs后,可以使用以下命令从一个crs重新投影到另一个crs:

ex_p = ex_p.to_crs(epsg=3395)
关于该主题的更多信息:

如果您真的陷入困境,可以使用postgis扩展将数据加载到PostGreSQL中。我使用了
ST_in
函数,它工作得很好。谢谢@blake。我会研究这个选择。