从熊猫数据框制作shapefile?


12

我想使用lon和lat行从Pandas Data Frame构造一个shapefile。

我有一个csv文件,并用熊猫对其进行处理以制作一个易于处理的数据框

是否可以在不逐行循环的情况下执行此操作?


如果是csv,是否可以在ArcMap中使用“添加XY数据”创建图层,然后导出为shapefile(单击rt并选择数据,然后导出数据)?
mkennedy

谢谢。但是我想做一个python脚本。无需GIS
kamome

1
使用GeoPandas
基因

知道了 也许我会删除我的评论!
mkennedy

Answers:


16

有点晚了,但也许对其他人也有用。是的,可以使用shapely和来完成geopandas

假设您的pandas数据框如下所示:

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

首先,确保geopandasshapely安装是否正确,有时是不容易的,因为他们与一些依赖(如GEOS和GDAL)。如果一开始不起作用,请尝试通过pip install geopandas shapely,在Google或StackOverflow / Gis.Stackexchange上搜索错误,因为很可能将有一个答案为您解决该问题。

然后,只需在数据框中创建一个新的几何列,即可将lat和lon值组合到一个shapely Point()对象中。请注意,Point()构造函数需要浮点值的元组,因此,如果数据帧的专栏dtypes尚未设定转换必须纳入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)

现在,将pandas DataFrame转换为GeoDataFrame。geopandas构造函数期望一个由几何形状对象组成的几何列,因此我们创建的列就可以了:

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

倾倒这个GeoDataFrame成shape文件,使用geopandas' to_file()方法(其它驱动器所支持菲奥娜GeoJSON也应工作):

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

这就是用QGIS可视化时得到的shapefile的样子:

产生的shapefile


2
嗨,我有类似的情况,但是我没有多边形,而是多边形。可以做类似df ['geometry'] = df.apply(lambda x:Point((float(x.lon),float(x.lat))),axis = 1)的事情,但使用多边形吗?
Valerio D. Ciotti

4

对于ArcMap,需要在导出到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')

我做了类似的事情,df.crs= "+init=epsg:27700"用来根据英国国家网格来投影我的shapefile。但是,当我在ArcGIS中打开它时,坐标系是未知的。我究竟做错了什么?
FaCoffee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.