GeoPandas - GeoData не перекрывает карту Shapefile - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь отобразить некоторые данные широты и длины, преобразованные в объекты shapely.geometry.Point из геопанда.GeoDataFrame, в британский шейп-файл, загруженный из здесь .После извлечения существует 3 .shp файла, и проблема ниже возникает с каждым из них.

Ниже приведен мой код:

import geopandas as gpd

geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])]
crs = {'init': 'epsg:4326'}
geo_df = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)

ukmap = gpd.read_file("..\\gb_1km.shp")
fig, ax = plt.subplots(figsize=(6,6))
ukmap.plot(ax=ax) #check map
geo_df.plot(ax=ax, markersize=20, color='blue', marker = 'o', label = 'C')

Вывод выглядит так:

enter image description here

Без фонового шейп-файлаграфик геометрии выглядит следующим образом:

enter image description here

Почему это происходит и как я могу это исправить?Спасибо

РЕДАКТИРОВАТЬ: С epsg = 27700

enter image description here

1 Ответ

2 голосов
/ 03 июля 2019

Ответьте немного подробнее, так как это кажется достаточно ясным ...

В вашем коде, генерирующем geo_df, вы указываете crs из 'epsg:4326', и, основываясь на вашем коде, вы работаете в градусах широт и долгот. Это подтверждается просмотром EPSG 4326 , который определяет границы CRS как [-180, -90, 180, 90].

Я скачал и прочитал в файле, который вы связали. Этот код:

uk_10km = gpd.read_file(r'/Users/brendancox/Downloads/Great_Britain_shapefile/gb_10km.shp')
uk_10km.crs

возвращает

{'init': 'epsg:3035'}

EPSG 3035 указывает, что его единицы измерения указаны в метрах. Границы WGS84 равны [-10.6700, 34.5000, 31.5500, 71.0500], но прогнозируемые границы равны [2426378.0132, 1528101.2618, 6293974.6215, 5446513.5222].

Таким образом, когда вы наносите geo_df на британский шейп-файл, он выравнивается по ukmap crs, помещая его в нижний угол.

Учитывая, что EPSG 4326 предназначен для всего земного шара, а вы ориентируетесь на Великобританию, я бы рекомендовал использовать проекцию для Великобритании. EPSG 3035, похоже, подходит для всей Европы, так что вы, вероятно, можете найти специфическую для Великобритании проекцию, в которую можно конвертировать оба ваших файла формы, используя geopandas.GeoDataFrame.to_crs().

Воспроизводимый пример

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
world.to_crs(epsg='3035', inplace=True)
fig, ax = plt.subplots(figsize=(10,8))
world.plot(ax=ax)
cities.plot(ax=ax, color='red')
plt.show()

Reproducible example map

Это показывает, как повторное проецирование встроенной формы world в EPSG 3035 увеличивает масштаб и заставляет фигуру cities появляться в небольшом кластере вблизи (0, 0) - в данном случае, на центр карты.

...