两个 GeoSeries 的索引不同 - Understanding Indices
The indices of the two GeoSeries are different - Understanding Indices
我正在与 GeoPandas
合作,并且我有两个 GeoDataframes
具有相同的 CRS
。其中一个包含带有多边形 geometry
的 geometry
列,另一个包含带有点 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)
我正在与 GeoPandas
合作,并且我有两个 GeoDataframes
具有相同的 CRS
。其中一个包含带有多边形 geometry
的 geometry
列,另一个包含带有点 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)