Створення формфайлу з фрейму даних Pandas?


12

Я хотів би побудувати файл форми з кадру даних Pandas, використовуючи рядки lon & lat.

У мене є файл CSV, і я обробляю його з пандами, щоб зробити кадр даних, який легше обробляти

Чи можливо це зробити, не роблячи циклу рядок?


Якщо це CSV, чи можете ви використовувати Add XY Data в ArcMap для створення шару, а потім експортувати у вигляді файлу форми (rt-клацання клавіші та вибирати дані, експортувати дані)?
mkennedy

Спасибі. Але я хотів би зробити це, роблячи сценарій python. Не потрібно GIS
kamome

1
використовувати GeoPandas
ген

Ах, зрозумів. Можливо, я видалю свої коментарі!
mkennedy

Відповіді:


17

Трохи пізно, але, можливо, також корисно для інших. Так, це можна зробити 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 :

Отриманий формуляр


2
Привіт, у мене схожа ситуація, але замість балів у мене багатокутники. Можна зробити щось подібне df ['геометрія'] = df.apply (лямбда x: Point ((float (x.lon), float (x.lat))), вісь = 1), але з багатокутниками?
Валеріо Д. Кіотті

4

Для 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, система координат невідома. Що я роблю неправильно?
FaCoffee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.