В этом примере представлен краткий обзор того, как использовать 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 }}
Для получения дополнительных руководств посетите здесь.