Um pouco tarde, mas talvez também seja útil para os outros. Sim, isso pode ser feito com shapely
e 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 geopandas
e shapely
estã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 GeoJSON
também devem funcionar):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
E é assim que o shapefile resultante se parece quando visualizado com QGIS :