Membuat shapefile dari bingkai data Pandas?


12

Saya ingin membuat shapefile dari Frame Data Pandas menggunakan baris lon & lat.

Saya sudah punya file csv dan saya memprosesnya dengan panda untuk membuat bingkai data yang lebih mudah ditangani

Apakah mungkin melakukan itu tanpa membuat garis per baris?


Jika csv, dapatkah Anda menggunakan Tambah Data XY di ArcMap untuk membuat layer, lalu ekspor sebagai shapefile (rt-klik layer dan pilih data, ekspor data)?
mkennedy

Terima kasih. Tapi saya ingin melakukan itu membuat skrip python. Tidak perlu SIG
kamome

1
gunakan GeoPandas
gen

Ah, mengerti. Mungkin saya akan menghapus komentar saya!
mkennedy

Jawaban:


16

Sedikit terlambat tapi mungkin juga bermanfaat untuk orang lain. Ya, itu bisa dilakukan dengan shapelydan geopandas.

Misalkan panda dataframe Anda terlihat seperti ini:

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

Pertama, pastikan itu geopandasdan shapelydiinstal dengan benar yang kadang-kadang tidak mudah karena mereka datang dengan beberapa dependensi (misalnya GEOS dan GDAL). Jika tidak berhasil pada percobaan pertama melalui pip install geopandas shapely, cari kesalahan di Google atau StackOverflow / Gis.Stackexchange karena kemungkinan besar akan ada jawaban yang tersedia untuk menyelesaikan masalah itu untuk Anda.

Kemudian, itu hanya masalah membuat kolom geometri baru dalam kerangka data Anda yang menggabungkan nilai lat dan lon menjadi shapely Point()objek. Perhatikan bahwa Point()konstruktor mengharapkan tupel nilai float, jadi konversi harus disertakan jika dtip kolom dataframe belum diatur ke 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)

Sekarang, ubah panda DataFrame menjadi a GeoDataFrame. Konstruktor geopanda mengharapkan kolom geometri yang dapat terdiri dari objek geometri yang indah, sehingga kolom yang kami buat baik-baik saja:

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

Untuk membuang GeoDataFrame ini ke dalam shapefile, gunakan to_file()metode geopanda (driver lain yang didukung oleh Fiona seperti yang GeoJSONseharusnya juga berfungsi):

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

Dan seperti itulah bentuk shapefile yang dihasilkan ketika divisualisasikan dengan QGIS :

Shapefile yang dihasilkan


2
Hai, saya memiliki situasi yang sama, tetapi alih-alih poin, saya memiliki poligon. Dimungkinkan untuk melakukan sesuatu yang serupa df ['geometry'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), sumbu = 1) tetapi dengan poligon?
Valerio D. Ciotti

4

Untuk ArcMap Anda perlu menentukan Proyeksi sebelum mengekspor ke 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')

Saya melakukan sesuatu yang serupa, menggunakan df.crs= "+init=epsg:27700"untuk memproyeksikan shapefile saya sesuai dengan British National Grid. Namun, ketika saya membukanya di ArcGIS, sistem koordinat tidak diketahui. Apa yang saya lakukan salah?
FaCoffee
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.