Построение карты с использованием геопанд и matplotlib - PullRequest
0 голосов
/ 08 января 2019

У меня есть маленький CSV, который имеет 6 координат из Бирмингема, Англия. Я прочитал CSV с пандами, а затем преобразовал его в GeoPandas DataFrame, изменив столбцы широты и долготы с помощью Shapely Points. Сейчас я пытаюсь построить свой GeoDataframe, и все, что я вижу, это точки. Как мне представить карту Бирмингема? Хороший источник документации по GeoPandas также будет очень признателен.

from shapely.geometry import Point
import geopandas as gpd
import pandas as pd

df = pd.read_csv('SiteLocation.csv')
df['Coordinates'] = list(zip(df.LONG, df.LAT))
df['Coordinates'] = df['Coordinates'].apply(Point)
# Building the GeoDataframe 
geo_df = gpd.GeoDataFrame(df, geometry='Coordinates')
geo_df.plot()  

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Документация GeoPandas содержит пример того, как добавить фон на карту (https://geopandas.readthedocs.io/en/latest/gallery/plotting_basemap_background.html),, что более подробно объясняется ниже.


Вам придется иметь дело с плитками , то есть (png) изображениями, подаваемыми через веб-сервер, с URL-адресом типа

http://.../Z/X/Y.png, где Z - уровень масштабирования, а X и Y идентифицируют плитку

И документ Геопандаса показывает, как установить плитки в качестве фона для ваших графиков, выбрать правильные и выполнить всю сложную работу по пространственной синхронизации и т. Д. *


установка

Предполагается, что GeoPandas уже установлен, вам необходим пакет contextily. Если вы находитесь под Windows, вы можете выбрать Как установить Contextily?

Вариант использования

Создайте скрипт на Python и определите вспомогательную функцию

import contextily as ctx

def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'):
    xmin, xmax, ymin, ymax = ax.axis()
    basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url)
    ax.imshow(basemap, extent=extent, interpolation='bilinear')
    # restore original x/y limits
    ax.axis((xmin, xmax, ymin, ymax))

и играйте

import matplotlib.pyplot as plt
from shapely.geometry import Point
import geopandas as gpd
import pandas as pd

# Let's define our raw data, whose epsg is 4326
df = pd.DataFrame({
    'LAT'  :[-22.266415, -20.684157],
    'LONG' :[166.452764, 164.956089],
})
df['coords'] = list(zip(df.LONG, df.LAT))

# ... turn them into geodataframe, and convert our
# epsg into 3857, since web map tiles are typically
# provided as such.
geo_df = gpd.GeoDataFrame(
    df, crs  ={'init': 'epsg:4326'},
    geometry = df['coords'].apply(Point)
).to_crs(epsg=3857)

# ... and make the plot
ax = geo_df.plot(
    figsize= (5, 5),
    alpha  = 1
)
add_basemap(ax, zoom=10)
ax.set_axis_off()
plt.title('Kaledonia : From Hienghène to Nouméa')
plt.show()

enter image description here


Примечание: вы можете поиграть с zoom, чтобы найти хорошее разрешение для карты. Например. / I.e. :

enter image description here

... и такие резолюции неявно требуют изменения пределов x / y.

0 голосов
/ 08 января 2019

Попробуйте df.unary_union . Функция объединит точки в одну геометрию. Jupyter Notebook может построить его

...