В этом примере представлен краткий обзор того, как использовать GeoPandas для создания GeoDataFrame и как визуализировать данные в виде карты Folium и графика Matplotlib.

Чтобы начать, перейдите на mecsimcalc.com/create, нажмите Карты и выберите Отображение геопространственных данных.

Шаг 1: Входные данные

Для входных данных создайте Single Select со следующими свойствами:

  • Название: набор данных
  • Метка: Набор данных для визуализации
  • Параметры:
  • naturalearth_cities
  • naturalearth_lowres
  • нибб

Шаг 2.1: Версия кода 1

Этот код будет получать данные из набора данных GeoPanda, выполнять расчет расстояния по данным, а затем визуализировать их на интерактивной карте Folium.

Получить данные

Во-первых, получите геопространственные данные для визуализации. Вы можете прочитать файл, создать файл DataFrame для Panda или создать файл GeoDataFrame. В этом примере мы будем использовать пользовательский ввод inputs['dataset'], чтобы выбрать GeoPanda, а затем прочитать его в виде файла.

path_to_data = geopandas.datasets.get_path(inputs['dataset'])
gdf = geopandas.read_file(path_to_data)

Манипулировать данными

Как только данные загружены, мы можем манипулировать данными, используя GeoDataFrame. Вы можете преобразовать свои данные в GeoDataFrame, передав их в качестве входных данных в geopandas.GeoDataFrame(...).

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

Чтобы получить список точек, установите новый столбец с именем centroid равным центроиду всех геометрий, используя свойство GeoPandas .centroid.

gdf['centroid'] = gdf.centroid

Затем получите первую точку из столбца центроида в 0-й строке, используя .iloc[0]. Обратите внимание, что iloc — это функция Pandas, потому что GeoDataFrame является расширением DataFrame Panda, и, следовательно, любая функция Pandas также может использоваться для GeoDataFrame.

first_point = gdf['centroid'].iloc[0]

Теперь, когда у нас есть столбец точек центроида и первая точка, мы можем выполнить вычисления. GeoPandas предоставляет множество функций для геопространственных расчетов. Мы будем использовать функцию distance() для вычисления расстояния от каждой точки до first_point.

gdf['distance'] = geopandas.GeoSeries(gdf['centroid']).distance(first_point)

Экспорт карты

Наконец, чтобы экспортировать данные GeoDataFrame в качестве интерактивной карты Folium, используйте функцию .explore() и передайте "distance" в качестве входных данных, где "distance" — это имя столбца, который вы хотите исследовать на карте. Затем используйте ._repr_html_() для преобразования объекта карты Folium в строку HTML, которую можно отобразить на веб-странице.

m = gdf.explore("distance", legend=True)
interactive_map = m._repr_html_()

Шаг 2.2: Версия кода 2

Этот код создаст данные как DataFrame Panda, преобразует их в GeoDataFrame, а затем экспортирует их как изображение графика Matplotlib.

Получить данные

Сначала создайте DataFrame Panda с данными для визуализации на карте.

df = pd.DataFrame(
    {'City': ['Buenos Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'],
        'Country': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'],
        'Latitude': [-34.58, -15.78, -33.45, 4.60, 10.48],
        'Longitude': [-58.66, -47.91, -70.66, -74.08, -66.86]})

Преобразуйте DataFrame в GeoDataFrame, передав df в geopandas.GeoDataFrame(). Затем преобразуйте столбцы широты и долготы в точки, используя geopandas.points_from_xy(), и установите эти точки как столбец geometry.

gdf = geopandas.GeoDataFrame(
    df, geometry=geopandas.points_from_xy(df.Longitude, df.Latitude)
)

По желанию можно установить фон для сюжета. В этом примере мы будем использовать карту Южной Америки из набора данных geopandas в качестве фона графика.

path_to_data = geopandas.datasets.get_path("naturalearth_lowres")
world = geopandas.read_file(path_to_data)
ax = world[world.continent == 'South America'].plot(color='white', edgecolor='black')

Экспорт карты

Наконец, чтобы экспортировать GeoDataFrame как график Matplotlib, используйте функцию .plot(), а затем вызовите plt_show(), чтобы преобразовать рисунок Matplotlib в изображение, которое можно отобразить на веб-странице.

m = gdf.plot(ax=ax, color="red")
static_map = plt_show(m.figure)

Шаг 2.3: Полный код

import geopandas
import pandas as pd
import base64
import io

def plt_show(plt, width=500, dpi=100):
    # Converts matplotlib plt to image data string
    #   plt is the matplotlib pyplot or figure
    #   width is the width of the graph image in pixels
    #   dpi (dots per inch) is the resolution of the image
    bytes = io.BytesIO()
    plt.savefig(bytes, format='png', dpi=dpi)  # Save as png image
    if hasattr(plt, "close"):
        plt.close()
    bytes.seek(0)
    base64_string = "data:image/png;base64," + \
        base64.b64encode(bytes.getvalue()).decode("utf-8")
    return "<img src='" + base64_string + "' width='" + str(width) + "'>"

def main(inputs):
    # (i) Use a geopandas dataset
    path_to_data = geopandas.datasets.get_path(inputs['dataset'])
    gdf = geopandas.read_file(path_to_data)
    # Manipulate geospatial data
    gdf['centroid'] = gdf.centroid
    first_point = gdf['centroid'].iloc[0]
    # Calculate distance to first_point
    gdf['distance'] = geopandas.GeoSeries(
        gdf['centroid']).distance(first_point)
    mean_of_distance = gdf['distance'].mean()
    # (a) Export distance column as an interactive map
    m = gdf.explore("distance", legend=True)
    interactive_map = m._repr_html_()
    # (ii) Use a custom pandas dataset
    df = pd.DataFrame(
        {'City': ['Buenos Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'],
         'Country': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'],
         'Latitude': [-34.58, -15.78, -33.45, 4.60, 10.48],
         'Longitude': [-58.66, -47.91, -70.66, -74.08, -66.86]})
    # Convert Pandas dataframe to GeoDataFrame
    gdf = geopandas.GeoDataFrame(
        # Use points_from_xy to convert to shapely.Point objects
        df, geometry=geopandas.points_from_xy(df.Longitude, df.Latitude)
    )
    # Use a map of South America
    path_to_data = geopandas.datasets.get_path("naturalearth_lowres")
    world = geopandas.read_file(path_to_data)
    ax = world[world.continent == 'South America'].plot(color='white', edgecolor='black')
    # (b) Export as a static image
    m = gdf.plot(ax=ax, color="red")
    static_map = plt_show(m.figure)
    return {"interactive_map": interactive_map, "static_map": static_map, "mean_of_distance": mean_of_distance}

Шаг 3: Вывод

На выходе отобразите две карты: outputs.static_map и outputs.interactive_map:

{{ outputs.static_map }}
{{ outputs.interactive_map }}

Для получения дополнительных руководств посетите здесь.