Criando shapefile a partir do dataframe do Pandas?

12

Gostaria de construir um shapefile a partir de um Pandas Data Frame usando as linhas long e lat.

Eu tenho um arquivo csv e o processo com pandas para criar um quadro de dados mais fácil de manusear

É possível fazer isso sem fazer um loop linha por linha?

kamome
fonte
Se for csv, você poderia usar Add XY Data no ArcMap para criar uma camada e exportar como um shapefile (rt-click layer e selecionar dados, exportar dados)?
Mcknedy
Obrigado. Mas eu gostaria de fazer isso fazendo um script python. Não é necessário GIS
kamome
1
use GeoPandas
gene
Ah, entendi. Talvez eu apague meus comentários!
Mcknedy

Respostas:

16

Um pouco tarde, mas talvez também seja útil para os outros. Sim, isso pode ser feito com shapelye geopandas.

Suponhamos que seu dataframe do pandas se pareça com o seguinte:

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

Primeiro, certifique-se geopandase shapelyestão instalados corretamente o que por vezes não é fácil, porque eles vêm com algumas dependências (por exemplo GEOS e GDAL). Se não funcionar na primeira tentativa pip install geopandas shapely, procure o erro no Google ou no StackOverflow / Gis.Stackexchange, porque provavelmente haverá uma resposta disponível para solucionar esse problema.

Então, é apenas uma questão de criar uma nova coluna geométrica no seu quadro de dados que combine os valores lat e lon em um shapely Point()objeto. Observe que o Point()construtor espera uma tupla de valores flutuantes; portanto, a conversão deve ser incluída se os tipos de coluna da estrutura de dados ainda não estiverem configurados 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)

Agora, converta o DataFrame do panda em um GeoDataFrame. O construtor geopandas espera uma coluna de geometria que possa consistir em objetos de geometria bem torneados; portanto, a coluna que criamos é ótima:

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

Para despejar esse GeoDataFrame em um shapefile, use o to_file()método das geopandas (outros drivers suportados pela Fiona , como GeoJSONtambém devem funcionar):

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

E é assim que o shapefile resultante se parece quando visualizado com QGIS :

Shapefile resultante

Dirk
fonte
2
Oi, eu tenho uma situação semelhante, mas em vez de pontos, tenho polígonos. É possível fazer algo semelhante df ['geometry'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), eixo = 1) mas com polígonos?
Valerio D. Ciotti 23/08/16
4

Para o ArcMap, você precisa definir a Projeção antes de exportar para o 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')
Ivan Moran
fonte
Eu fiz algo parecido, usando df.crs= "+init=epsg:27700"para projetar meu shapefile de acordo com o British National Grid. No entanto, quando eu o abro no ArcGIS, o sistema de coordenadas é desconhecido. O que estou fazendo de errado?
FaCoffee