Я хотів би побудувати файл форми з кадру даних Pandas, використовуючи рядки lon & lat.
У мене є файл CSV, і я обробляю його з пандами, щоб зробити кадр даних, який легше обробляти
Чи можливо це зробити, не роблячи циклу рядок?
Я хотів би побудувати файл форми з кадру даних Pandas, використовуючи рядки lon & lat.
У мене є файл CSV, і я обробляю його з пандами, щоб зробити кадр даних, який легше обробляти
Чи можливо це зробити, не роблячи циклу рядок?
Відповіді:
Трохи пізно, але, можливо, також корисно для інших. Так, це можна зробити shapely
і за допомогою geopandas
.
Припустимо, що тип даних вашого панди виглядає приблизно так:
import pandas as pd
data = [
{'some_attribute': 'abc', 'lat': '50.1234', 'lon': '10.4023'},
{'some_attribute': 'def', 'lat': '40.5678', 'lon': '8.3365'},
{'some_attribute': 'ghi', 'lat': '60.9012', 'lon': '6.2541'},
{'some_attribute': 'jkl', 'lat': '45.3456', 'lon': '12.5478'},
{'some_attribute': 'mno', 'lat': '35.7890', 'lon': '14.3957'},
]
df = pd.DataFrame(data)
print(df)
=>
lat lon some_attribute
0 50.1234 10.4023 abc
1 40.5678 8.3365 def
2 60.9012 6.2541 ghi
3 45.3456 12.5478 jkl
4 35.7890 14.3957 mno
По- перше, переконайтеся , що geopandas
і shapely
встановлені правильно , які іноді не так просто , тому що вони приходять з деякими залежностями (наприклад , ГЕОС і GDAL). Якщо спочатку не вдалося спробувати pip install geopandas shapely
, знайдіть помилку в Google або StackOverflow / Gis.Stackexchange, оскільки, швидше за все, буде відповідь на вирішення цієї проблеми.
Потім, це лише питання створення нового стовпця геометрії у вашому фреймі даних, який поєднує значення lat і lon в shapely Point()
об'єкт. Зауважте, що Point()
конструктор очікує набір значень float, тому перетворення повинно бути включено, якщо типи стовпців кадру даних не встановлені float
.
from shapely.geometry import Point
# combine lat and lon column to a shapely Point() object
df['geometry'] = df.apply(lambda x: Point((float(x.lon), float(x.lat))), axis=1)
Тепер конвертуйте панди DataFrame у формат a GeoDataFrame
. Конструктор geopandas очікує, що стовпець геометрії може складатися з фігурних геометричних об'єктів, тому колона, яку ми створили, просто чудова:
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
Щоб скинути цей GeoDataFrame у файл формату, використовуйте to_file()
метод geopandas (інші драйвери, які підтримує Fiona, такі як GeoJSON
також повинні працювати):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
Ось як виглядає отриманий форм-файл під час візуалізації за допомогою QGIS :
Для ArcMap вам потрібно визначити Projection перед експортом у Shapefile.
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
# proj WGS84
df.crs= "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
df.crs= "+init=epsg:27700"
для проектування свого формату файлів відповідно до Британської національної сітки. Однак, коли я відкриваю її в ArcGIS, система координат невідома. Що я роблю неправильно?