Agglomeration

Get agglomerations

[2]:
from popframe.models.region import Region
region_model = Region.from_pickle('data/Ленинградская область.pickle')
[3]:

from popframe.method.agglomeration import AgglomerationBuilder agglomeration_builder = AgglomerationBuilder(region=region_model) final_agglomerations = agglomeration_builder.get_agglomerations(time = 80) final_agglomerations
[3]:
type core_cities population agglomeration_level geometry
0 Polycentric Кудрово, Гатчина, Сертолово, Новое Девяткино, ... 1116875 4 POLYGON ((310261.047 6587674.368, 310046.437 6...
1 Polycentric Светогорск, Выборг 129217 1 POLYGON ((264064.801 6702843.886, 263672.547 6...
2 Polycentric Пикалево, Тихвин, Бокситогорск 105381 1 POLYGON ((535225.286 6582852.229, 535504.813 6...
3 Polycentric Кириши, Волхов 102494 1 POLYGON ((421196.961 6582742.806, 421196.513 6...
4 Polycentric Сланцы, Кингисепп 115479 1 POLYGON ((206722.793 6553056.587, 206615.98 65...
5 Monocentric Луга 58784 1 POLYGON ((306605.524 6486633.39, 306526.354 64...
6 Polycentric Подпорожье, Лодейное Поле 44609 1 POLYGON ((513102.444 6711145.664, 512912.14 67...
7 Monocentric Приозерск 30441 1 POLYGON ((337963.013 6743785.69, 337736.871 67...
[4]:
final_agglomerations.explore()
[4]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Build circle frame

[5]:
from popframe.method.popuation_frame import PopulationFrame
frame_method = PopulationFrame(region=region_model)
output = frame_method.build_circle_frame()
output
[5]:
id name population level geometry
0 0 Болото 10 Малое сельское поселение POLYGON ((543177.545 6580637.216, 543177.376 6...
1 1 Большой Остров 68 Малое сельское поселение POLYGON ((544624.73 6593227.683, 544624.288 65...
2 2 Бор 1734 Большое сельское поселение POLYGON ((545358.957 6593052.346, 545356.725 6...
3 3 Бороватое 10 Малое сельское поселение POLYGON ((544028.318 6589581.591, 544028.148 6...
4 4 Бочево 10 Малое сельское поселение POLYGON ((538575.316 6576793.156, 538575.147 6...
... ... ... ... ... ...
2925 2925 Апраксин Бор 313 Среднее сельское поселение POLYGON ((399256.679 6560340.947, 399255.73 65...
2926 2926 Александровка 313 Среднее сельское поселение POLYGON ((404164.108 6562086.557, 404163.159 6...
2927 2927 Большая Горка 313 Среднее сельское поселение POLYGON ((413313.678 6573792.753, 413312.73 65...
2928 2928 Дроздово 5 Малое сельское поселение POLYGON ((412482.916 6574810.78, 412482.796 65...
2929 2929 Большая Кунесть 5 Малое сельское поселение POLYGON ((412183.794 6574629.673, 412183.674 6...

2930 rows × 5 columns

[ ]:
# final_agglomerations.to_file("final_agglomerations.geojson", driver="GeoJSON")

Evaluate city agglomeration status

[6]:
towns_with_status = agglomeration_builder.evaluate_city_agglomeration_status(output, final_agglomerations)
towns_with_status
[6]:
id name population level geometry agglomeration_status agglomeration_level
0 0 Болото 10 Малое сельское поселение POLYGON ((543177.545 6580637.216, 543177.376 6... В агломерации 1
1 1 Большой Остров 68 Малое сельское поселение POLYGON ((544624.73 6593227.683, 544624.288 65... В агломерации 1
2 2 Бор 1734 Большое сельское поселение POLYGON ((545358.957 6593052.346, 545356.725 6... В агломерации 1
3 3 Бороватое 10 Малое сельское поселение POLYGON ((544028.318 6589581.591, 544028.148 6... В агломерации 1
4 4 Бочево 10 Малое сельское поселение POLYGON ((538575.316 6576793.156, 538575.147 6... В агломерации 1
... ... ... ... ... ... ... ...
2925 2925 Апраксин Бор 313 Среднее сельское поселение POLYGON ((399256.679 6560340.947, 399255.73 65... Вне агломерации 0
2926 2926 Александровка 313 Среднее сельское поселение POLYGON ((404164.108 6562086.557, 404163.159 6... Вне агломерации 0
2927 2927 Большая Горка 313 Среднее сельское поселение POLYGON ((413313.678 6573792.753, 413312.73 65... Вне агломерации 0
2928 2928 Дроздово 5 Малое сельское поселение POLYGON ((412482.916 6574810.78, 412482.796 65... Вне агломерации 0
2929 2929 Большая Кунесть 5 Малое сельское поселение POLYGON ((412183.794 6574629.673, 412183.674 6... Вне агломерации 0

2930 rows × 7 columns

[ ]:
# towns_with_status.to_file("towns_with_status.geojson", driver="GeoJSON")
[7]:
import geopandas as gpd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# Ваши цвета для агломераций
agglomeration_colors = {
    1: "#ADD8E6",  # светло-голубой
    2: "#D8BFD8",  # светло-фиолетовый
    3: "#808000",  # оливковый
    4: "#FFFF99",  # светло-желтый
    5: "#006400"   # темно-зеленый
}

# Ваши цвета для городов
city_colors = {
    "Малое сельское поселение": "#F0E68C",  # бледно-желтый
    "Среднее сельское поселение": "#FFD700",  # золотисто-желтый
    "Большое сельское поселение": "#FFA07A",  # светло-лососевый
    "Крупное сельское поселение": "#FF8C00",  # темно-оранжевый
    "Малый город": "#CD5C5C",                 # красно-коричневый
    "Средний город": "#DC143C",               # красный кармин
    "Большой город": "#B22222",               # огненно-красный
    "Крупный город": "#8B0000",               # темно-красный
    "Крупнейший город": "#800080",            # фиолетовый
    "Сверхкрупный город": "#4B0082"           # индиго
}

# Чтение агломераций и городов из GeoDataFrame
gdf_agglomerations = final_agglomerations
gdf_cities = output
region_boundary = region_model.region  # Ваши границы региона

# Создание подложки для карты
fig, ax = plt.subplots(figsize=(20, 10))

# Визуализация границ региона (серым цветом с прозрачностью)
region_boundary.plot(ax=ax, color='gray', edgecolor='black', alpha=0.3)

# Визуализация агломераций
for level, color in agglomeration_colors.items():
    subset = gdf_agglomerations[gdf_agglomerations['agglomeration_level'] == level]
    subset.plot(ax=ax, color=color, edgecolor='black')

# Визуализация городов с различными цветами
for city_type, color in city_colors.items():
    subset = gdf_cities[gdf_cities['level'] == city_type]
    subset.plot(ax=ax, marker='o', color=color, markersize=10, edgecolor='black')

# Создание легенды для агломераций
agglomeration_patches = [mpatches.Patch(color=color, label=f'Агломерация Уровень {level}')
                         for level, color in agglomeration_colors.items()]

# Создание легенды для городов
city_patches = [mpatches.Patch(color=color, label=city_type)
                for city_type, color in city_colors.items()]

# Отображение легенды для агломераций
legend_agglomeration = plt.legend(handles=agglomeration_patches, loc='upper left', bbox_to_anchor=(1, 1), title="Агломерации")
ax.add_artist(legend_agglomeration)  # Добавление первой легенды

# Отображение легенды для городов
plt.legend(handles=city_patches, loc='lower left', bbox_to_anchor=(1, 0.4), title="Города")

# Настройка осей
plt.title("Агломерации и Города")
ax.set_axis_off()

# Показать карту
plt.show()
/tmp/ipykernel_13669/1785706060.py:42: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, color=color, edgecolor='black')
/tmp/ipykernel_13669/1785706060.py:42: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, color=color, edgecolor='black')
/tmp/ipykernel_13669/1785706060.py:47: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, marker='o', color=color, markersize=10, edgecolor='black')
../_images/examples_aglomeration_11_1.png
[8]:
unique_count = towns_with_status['agglomeration_status'].value_counts()
unique_count
[8]:
В агломерации        1457
Вне агломерации      1443
Центр агломерации      30
Name: agglomeration_status, dtype: int64
[9]:
# Визуализируем первый GeoDataFrame
m = final_agglomerations.explore()

# Добавляем второй GeoDataFrame на ту же карту
towns_with_status.explore(m=m)

[9]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Scenario

[10]:
import pandas as pd
# update = {
#     630: {
#         'population': 300_000,
#     },
#     259: {
#         'population': 150_000,
#     }
# }

update = {
  2618: {
    'population': 500_000,
  }
}
update_df = pd.DataFrame.from_dict(update, orient='index')
[11]:
final_agglomerations = agglomeration_builder.get_agglomerations(update_df)
final_agglomerations
/home/mvin/PopFrame/popframe/models/region.py:126: FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
  gdf.update(update_df[['population']])
[11]:
type core_cities population agglomeration_level geometry
0 Polycentric Тихвин, Волхов, Кириши, Пикалево, Бокситогорск 656824 3 POLYGON ((421196.961 6582742.806, 421196.513 6...
1 Polycentric Кудрово, Гатчина, Сертолово, Новое Девяткино, ... 1116875 4 POLYGON ((310261.047 6587674.368, 310046.437 6...
2 Polycentric Светогорск, Выборг 129217 1 POLYGON ((264064.801 6702843.886, 263672.547 6...
3 Polycentric Сланцы, Кингисепп 115479 1 POLYGON ((206722.793 6553056.587, 206615.98 65...
4 Monocentric Луга 58784 1 POLYGON ((306605.524 6486633.39, 306526.354 64...
5 Polycentric Подпорожье, Лодейное Поле 44609 1 POLYGON ((513102.444 6711145.664, 512912.14 67...
6 Monocentric Приозерск 30441 1 POLYGON ((337963.013 6743785.69, 337736.871 67...
[12]:
from popframe.method.popuation_frame import PopulationFrame
frame_method = PopulationFrame(region=region_model)
output = frame_method.build_circle_frame(update_df)
output
/home/mvin/PopFrame/popframe/models/region.py:126: FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
  gdf.update(update_df[['population']])
[12]:
geometry id name population level
0 POLYGON ((543177.545 6580637.216, 543177.376 6... 0 Болото 10 Малое сельское поселение
1 POLYGON ((544624.73 6593227.683, 544624.288 65... 1 Большой Остров 68 Малое сельское поселение
2 POLYGON ((545358.957 6593052.346, 545356.725 6... 2 Бор 1734 Большое сельское поселение
3 POLYGON ((544028.318 6589581.591, 544028.148 6... 3 Бороватое 10 Малое сельское поселение
4 POLYGON ((538575.316 6576793.156, 538575.147 6... 4 Бочево 10 Малое сельское поселение
... ... ... ... ... ...
2925 POLYGON ((399256.679 6560340.947, 399255.73 65... 2925 Апраксин Бор 313 Среднее сельское поселение
2926 POLYGON ((404164.108 6562086.557, 404163.159 6... 2926 Александровка 313 Среднее сельское поселение
2927 POLYGON ((413313.678 6573792.753, 413312.73 65... 2927 Большая Горка 313 Среднее сельское поселение
2928 POLYGON ((412482.916 6574810.78, 412482.796 65... 2928 Дроздово 5 Малое сельское поселение
2929 POLYGON ((412183.794 6574629.673, 412183.674 6... 2929 Большая Кунесть 5 Малое сельское поселение

2930 rows × 5 columns

[13]:
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# Ваши цвета для агломераций
agglomeration_colors = {
    1: "#ADD8E6",  # светло-голубой
    2: "#D8BFD8",  # светло-фиолетовый
    3: "#808000",  # оливковый
    4: "#FFFF99",  # светло-желтый
    5: "#006400"   # темно-зеленый
}

# Ваши цвета для городов
city_colors = {
    "Малое сельское поселение": "#F0E68C",  # бледно-желтый
    "Среднее сельское поселение": "#FFD700",  # золотисто-желтый
    "Большое сельское поселение": "#FFA07A",  # светло-лососевый
    "Крупное сельское поселение": "#FF8C00",  # темно-оранжевый
    "Малый город": "#CD5C5C",                 # красно-коричневый
    "Средний город": "#DC143C",               # красный кармин
    "Большой город": "#B22222",               # огненно-красный
    "Крупный город": "#8B0000",               # темно-красный
    "Крупнейший город": "#800080",            # фиолетовый
    "Сверхкрупный город": "#4B0082"           # индиго
}

# Чтение агломераций и городов из GeoDataFrame
gdf_agglomerations = final_agglomerations
gdf_cities = output
region_boundary = region_model.region  # Ваши границы региона

# Создание подложки для карты
fig, ax = plt.subplots(figsize=(20, 10))

# Визуализация границ региона (серым цветом с прозрачностью)
region_boundary.plot(ax=ax, color='gray', edgecolor='black', alpha=0.3)

# Визуализация агломераций
for level, color in agglomeration_colors.items():
    subset = gdf_agglomerations[gdf_agglomerations['agglomeration_level'] == level]
    subset.plot(ax=ax, color=color, edgecolor='black')

# Визуализация городов с различными цветами
for city_type, color in city_colors.items():
    subset = gdf_cities[gdf_cities['level'] == city_type]
    subset.plot(ax=ax, marker='o', color=color, markersize=10, edgecolor='black')

# Создание легенды для агломераций
agglomeration_patches = [mpatches.Patch(color=color, label=f'Агломерация Уровень {level}')
                         for level, color in agglomeration_colors.items()]

# Создание легенды для городов
city_patches = [mpatches.Patch(color=color, label=city_type)
                for city_type, color in city_colors.items()]

# Отображение легенды для агломераций
legend_agglomeration = plt.legend(handles=agglomeration_patches, loc='upper left', bbox_to_anchor=(1, 1), title="Агломерации")
ax.add_artist(legend_agglomeration)  # Добавление первой легенды

# Отображение легенды для городов
plt.legend(handles=city_patches, loc='lower left', bbox_to_anchor=(1, 0.4), title="Города")

# Настройка осей
plt.title("Агломерации и Города")
ax.set_axis_off()

# Показать карту
plt.show()


/tmp/ipykernel_13669/3824339813.py:41: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, color=color, edgecolor='black')
/tmp/ipykernel_13669/3824339813.py:41: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, color=color, edgecolor='black')
/tmp/ipykernel_13669/3824339813.py:46: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, marker='o', color=color, markersize=10, edgecolor='black')
/tmp/ipykernel_13669/3824339813.py:46: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.
  subset.plot(ax=ax, marker='o', color=color, markersize=10, edgecolor='black')
../_images/examples_aglomeration_18_1.png