Panda veri çerçevesinden şekil dosyası mı yapıyorsunuz?


12

Lon & lat satırlarını kullanarak bir Pandas Data Frame'den bir şekil dosyası oluşturmak istiyorum.

Bir csv dosyam var ve kullanımı daha kolay bir veri çerçevesi yapmak için pandalarla işliyorum

Bunu bir satır satır döngü yapmadan yapmak mümkün müdür?


Eğer csv ise, bir katman oluşturmak için ArcMap'te XY Verileri Ekle'yi kullanabilir, sonra bir şekil dosyası olarak dışa aktarabilir (rt-tıklamalı katman ve verileri seçebilir, verileri dışa aktarabilirsiniz)?
mkennedy

Ama bunu bir python betiği yapmak istiyorum. CBS'ye gerek yok
kamome


Ah, anladım. Belki yorumlarımı sileceğim!
mkennedy

Yanıtlar:


17

Biraz geç ama belki başkaları için de yararlıdır. Evet, shapelyve ile yapılabilir geopandas.

Panda veri çerçeve türünüzün şöyle gözüktüğü varsayılmıştır:

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

İlk olarak, bazı bağımlılıklarla (örn. GEOS ve GDAL) birlikte geldiklerinden, bazen kolay olmayan geopandasve shapelydüzgün bir şekilde yüklendiğinden emin olun . İlk denemede işe yaramazsa, pip install geopandas shapelyGoogle veya StackOverflow / Gis.Stackexchange'te hatayı arayın, çünkü büyük olasılıkla bu sorunu sizin için çözecek bir cevap olacaktır.

Daha sonra, veri çerçevenizde lat ve lon değerlerini bir shapely Point()nesnede birleştiren yeni bir geometri sütunu oluşturma meselesidir . Point()Yapıcı bir kayan noktalı sayı değeri beklediğini unutmayın , bu nedenle veri çerçevesinin sütun türleri zaten olarak ayarlanmamışsa dönüştürme dahil edilmelidir 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)

Şimdi, pandalar DataFrame'i bir GeoDataFrame. Geopanda yapıcısı, düzgün geometri nesnelerinden oluşabilecek bir geometri sütunu bekler, bu nedenle oluşturduğumuz sütun gayet iyi:

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

Shape dosyasına içine bu GeoDataFrame dökümü için, kullanım geopandas' to_file()yöntemi (diğer sürücüler tarafından desteklenen Fiona gibi GeoJSONçalışmaları da gerekir):

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

Ve QGIS ile görselleştirildiğinde ortaya çıkan şekil dosyası şöyle görünür :

Ortaya çıkan şekil dosyası


2
Merhaba, benzer bir durumum var, ancak noktalar yerine çokgenlerim var. Df ['geometry'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), eksen = 1) ama çokgenlerle benzer bir şey yapmak mümkün mü?
Valerio D. Ciotti

4

ArcMap için, Shapefile'a dışa aktarmadan önce Projeksiyonu tanımlamanız gerekir.

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"İngiliz Ulusal Şebekesine göre şekil dosyamı yansıtmak için benzer bir şey yaptım . Ancak ArcGIS'te açtığımda koordinat sistemi bilinmiyor. Neyi yanlış yapıyorum?
FaCoffee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.