Расчет площадей полигонов внутри других полигонов с помощью GeoPandas - PullRequest
1 голос
/ 13 марта 2019

У меня есть 2 geoSeries:

df1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
                  Polygon([(1.5,1.5), (4,2), (4,4), (2,4)]),
                  Polygon([(1,3.5),(3,3.5),(1,2.5)]),
                  Polygon([(1,0), (3,0), (3,2.5)])])

df2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
                        Polygon([(3,3), (5,3), (5,5), (3,5)]),
                        Polygon([(1,3), (1,5), (3,5),(2,3)]),
                        Polygon([(5,1), (3,1), (3,3), (3,5)])])

при построении графика это дает:

base = df2.plot()
df1.plot(ax=base, cmap='summer')

Участок перекрывающихся полигонов

Я хочу рассчитатьперекрывающиеся области между df1 и df2.Итак, какие области df2 находятся в df1.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вот рабочий код, основанный на ваших данных. Прочитайте комментарии, предоставленные с кодом для получения дополнительной информации.

import geopandas as gpd
from shapely.geometry import Polygon

# use GeoSeries to prepare data
gs1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
                Polygon([(1.5,1.5), (4,2), (4,4), (2,4)]),
                Polygon([(1,3.5),(3,3.5),(1,2.5)]),
                Polygon([(1,0), (3,0), (3,2.5)])])

gs2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
                Polygon([(3,3), (5,3), (5,5), (3,5)]),
                Polygon([(1,3), (1,5), (3,5),(2,3)]),
                Polygon([(5,1), (3,1), (3,3), (3,5)])])

#base = gs2.plot()
#gs1.plot(ax=base, cmap='summer')

# create geoDataFrame from GeoSeries obtained above
df1 = gpd.GeoDataFrame(gs1)
# assign geometry to the geoDataFrame
df1g = df1.rename(columns={0:'geometry'}).set_geometry('geometry')

# similarly, ...
df2 = gpd.GeoDataFrame(gs2)
df2g = df2.rename(columns={0:'geometry'}).set_geometry('geometry')

# perform polygon overlay betw the two geoDataFrames
ov_output = gpd.overlay(df1g, df2g, how="intersection")
ov_output.plot(figsize=(4,4), cmap="Set2")

# Calculating areas of all the resulting polygons
ov_output.geometry.area

Вывод текста с расчетными площадями пересекающихся многоугольников:

0    1.0000
1    1.8000
5    0.2500
9    0.9000
2    0.3500
6    0.5625
3    1.0000
4    1.8500
dtype: float64

И, получившийся сюжет.

enter image description here

Надеюсь, это полезно.

1 голос
/ 13 марта 2019

Вы используете geopandas.overlay:

gpd.overlay(df1, df2, how="intersection")
...