Shapefile aus Pandas Datenrahmen erstellen?


12

Ich möchte ein Shapefile aus einem Pandas Data Frame mit den Lon & Lat-Zeilen erstellen.

Ich habe eine CSV-Datei und verarbeite sie mit Pandas, um einen Datenrahmen zu erstellen, der einfacher zu handhaben ist

Ist es möglich, das zu tun, ohne eine Schleife Zeile für Zeile zu machen?


Wenn es sich um eine CSV-Datei handelt, können Sie mithilfe von "XY-Daten hinzufügen" in ArcMap einen Layer erstellen und dann als Shapefile exportieren (klicken Sie mit der rechten Maustaste auf den Layer, und wählen Sie Daten aus, exportieren Sie Daten).
Mkennedy

Danke. Aber ich würde gerne ein Python-Skript erstellen. Keine Notwendigkeit, GIS
kamome

1
benutze GeoPandas
Gen

Ah, verstanden. Vielleicht lösche ich meine Kommentare!
mkennedy

Antworten:


16

Ein bisschen spät, aber vielleicht auch nützlich für andere. Ja, das geht mit shapelyund geopandas.

Angenommen, Ihr Pandas-Datenframe sieht ungefähr so ​​aus:

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

Stellen Sie zunächst sicher, dass geopandasund shapelyordnungsgemäß installiert sind, was manchmal nicht einfach ist, da einige Abhängigkeiten bestehen (z. B. GEOS und GDAL). Wenn dies beim ersten Versuch über nicht funktioniert pip install geopandas shapely, suchen Sie in Google oder StackOverflow / Gis.Stackexchange nach dem Fehler, da höchstwahrscheinlich eine Antwort verfügbar ist, die das Problem für Sie löst.

Dann müssen Sie lediglich eine neue Geometriespalte in Ihrem Datenrahmen erstellen, in der die Werte lat und lon zu einem shapely Point()Objekt kombiniert werden. Beachten Sie, dass der Point()Konstruktor ein Tupel von Gleitkommawerten erwartet. Daher muss die Konvertierung eingeschlossen werden, wenn die Spaltentypen des Datenrahmens nicht bereits auf festgelegt sind 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)

Konvertieren Sie nun den pandas DataFrame in einen GeoDataFrame. Der Geopandas-Konstruktor erwartet eine Geometriespalte, die aus formschönen Geometrieobjekten bestehen kann. Die von uns erstellte Spalte ist also in Ordnung:

import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')

Um dieses GeoDataFrame in eine Shape - Datei Dump, Verwendung geopandas' to_file()Methode (andere Treiber unterstützt von Fiona wie GeoJSONsollte auch Arbeit):

df.to_file('MyGeometries.shp', driver='ESRI Shapefile')

Und so sieht das resultierende Shapefile aus, wenn es mit QGIS visualisiert wird :

Resultierendes Shapefile


2
Hallo, ich habe eine ähnliche Situation, aber anstelle von Punkten habe ich Polygone. Es ist möglich, etwas Ähnliches zu tun: df ['geometry'] = df.apply (Lambda x: Punkt ((float (x.lon), float (x.lat))), Achse = 1), aber mit Polygonen?
Valerio D. Ciotti

4

Für ArcMap müssen Sie die Projektion definieren, bevor Sie nach Shapefile exportieren.

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')

Ich habe etwas Ähnliches gemacht, indem df.crs= "+init=epsg:27700"ich mein Shapefile nach dem British National Grid projiziert habe. Wenn ich es jedoch in ArcGIS öffne, ist das Koordinatensystem unbekannt. Was mache ich falsch?
FaCoffee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.