Matplotlib не может строить точки на базовой карте из CSV, но строит графики правильно из JSON - PullRequest
1 голос
/ 21 июня 2020

Проблема

Я пытаюсь нанести набор точек на базовую карту. Ниже мой код. Однако он не отображает его правильно там, где он должен был отображаться на карте. Я добавил ниже ссылку Dropbox на файл csv, который я использую.

Ссылка Dropbox на файл csv

import pandas as pd
import geopandas
import matplotlib.pyplot as plt
%matplotlib inline

#read data from CSV 
building = pd.read_csv('masteronlyfive.csv')

# convert coords to float type
building = building.astype({"lat": float, "long": float})

# convert to geodata series
building = geopandas.GeoDataFrame(towers, geometry=geopandas.points_from_xy(building.lat,building.long))

# set CRS
building.crs = {'init' :'epsg:4326'}
building.head()

# read basemap file and set CRS
world = geopandas.read_file("South_Africa_Polygon.shp")
world.crs = {'init' :'epsg:4326'}

# Plot basemap
ax = world.plot(color='white', edgecolor='black')

# plot points
building.plot(ax=ax, color='red')

plt.show()

This how it looks with the code, which is incorrect.

What I have tried

I have taken the co-ordinates and re-coded them in a json format, instead of csv, so Im reading the data from a json array rather than doing a csv import, as such below and they work completely fine, its totally shocking for me.

import pandas as pd
import geopandas
import matplotlib.pyplot as plt
%matplotlib inline

#reading from json array
df = pd.DataFrame(
    {'Country': ['building', 'building', 'building', 'building', 'building'],
     'Latitude': [-28.506806, -27.463611, -29.192053, -28.871950, -27.242444],
     'Longitude': [28.613972, 28.040001, 26.235583,27.873739, 28.838861]})

#creating geopandas points from the coordinates
gdf = geopandas.GeoDataFrame(
    df, geometry=geopandas.points_from_xy(df.Longitude, df.Latitude))


#reading the basemap file
world = geopandas.read_file("South_Africa_Polygon.shp")

# plotting the basemap 
ax = world.plot(color='white', edgecolor='black')

# plotting the geodata points
gdf.plot(ax=ax, color='red')

plt.show()

Вот как это выглядит - и это правильно, когда он читает из импорта данных JSON

Что я мог делать не так, что одни и те же коорды отлично работают с JSON, но не с CSV.

1 Ответ

0 голосов
/ 21 июня 2020

При создании фрейма геоданных измените порядок долготы / широты, как показано ниже:

# convert to geodata series
building = geopandas.GeoDataFrame(
    geometry=geopandas.points_from_xy(building.long, building.lat)
)

Ваша долгота - x, а не y. Ваша широта y. Следовательно, при работе с функцией points_from_xy() на первом месте стоит долгота (которая равна x). Это очень распространенная ошибка, и вы можете заметить ее на графике - границы многоугольника по диагонали противоположны вашему кластеру точек, поэтому чаще всего это порядок широты / долготы!

PS Я не уверен, почему ваш исходный код ссылается на переменную towers в этом фрагменте кода, поэтому я удалил ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...