两个 GeoSeries 的索引不同 - Understanding Indices

The indices of the two GeoSeries are different - Understanding Indices

我正在与 GeoPandas 合作,并且我有两个 GeoDataframes 具有相同的 CRS。其中一个包含带有多边形 geometrygeometry 列,另一个包含带有点 geometry 的列。我想检查多边形内有哪些点。

天真的我试过了

shape.contains(points)

这给了我

>  The indices of the two GeoSeries are different

我不明白这条消息。当我检查 documentation 时,它显示

We can also check two GeoSeries against each other, row by row. The GeoSeries above have different indices. We can either align both GeoSeries based on index values and compare elements with the same index using align=True or ignore index and compare elements based on their matching order using align=False:

这些指数是什么?为什么他们相互检查而不是 geometry columns? 我在线阅读,我必须将我的几何图形转换为 shapely 几何图形。但是,使用 GeoPandas 的全部意义不就是我可以对数据执行地理操作吗?

我对此感到困惑。如何检查 shape 中的 geometries 是否包含 points 中的任何 geometries?

这些指数是什么?

简单来说索引就是pandas.DataFrame行的名称或者pandas.Series的条目。如果您的数据仅部分重叠,则使用索引对齐很有用,请考虑以下示例:假设您每天都有来自两个传感器的数据,但第二个稍后打开,那么您可以按如下方式准备 pandas.DataFrame

import pandas as pd
s1 = pd.Series({'day1':100,'day2':110,'day3':105,'day4':120,'day5':110})
s2 = pd.Series({'day3':100,'day4':105,'day5':100})
df = pd.DataFrame({'sensor1':s1,'sensor2':s2})
print(df)

输出

      sensor1  sensor2
day1      100      NaN
day2      110      NaN
day3      105    100.0
day4      120    105.0
day5      110    100.0

观察到为 day1 插入了 NaN(表示未知值),为 sensor2 插入了 day2

contains 操作不进行完整的 NxM 比较。它可以检查哪个多边形包含一个点。或者,如果您为它提供两个系列,它将检查第一个多边形是否包含第一个点,第二个多边形是否包含第二个点,等等。

您遇到的错误是 geopandas 尝试了第二个选项,但是点和多边形没有对齐,因此无法进行逐元素比较。

听起来你想要完整的所有多边形乘以所有点的比较。您可以通过遍历所有点来做到这一点:

point_series = gpd.GeoSeries([Point(1, 2), Point(2, 1)])

polygon_series = gpd.GeoSeries(
    [
        Polygon([(0, 0), (0, 3), (2, 3), (2, 0), (0, 0)]),
        Polygon([(0, 0), (0, 2), (3, 2), (3, 0), (0, 0)]),
    ]
)

pd.concat([polygon_series.contains(point) for point in point_series], axis=1)

输出:

    0       1
0   True    False
1   False   True

您所描述的实际上是一个空间连接。下面的示例从英国的 lon/lat 个城市构建点,然后找到该城市所在的行政区域多边形。这是一个 NxM 比较

import pandas as pd
import numpy as np
import geopandas as gpd
import shapely.geometry
import requests

# source some points and polygons
# fmt: off
dfp = pd.read_html("https://www.latlong.net/category/cities-235-15.html")[0]
dfp = gpd.GeoDataFrame(dfp, geometry=dfp.loc[:,["Longitude", "Latitude",]].apply(shapely.geometry.Point, axis=1))
res = requests.get("https://opendata.arcgis.com/datasets/69dc11c7386943b4ad8893c45648b1e1_0.geojson")
df_poly = gpd.GeoDataFrame.from_features(res.json())
# fmt: on

gpd.sjoin(dfp, df_poly)