使用GeoPandas读取Python中的GRASS矢量数据源

使用GeoPandas读取Python中的GRASS矢量数据源,python,gdal,geopandas,ogr,grass,Python,Gdal,Geopandas,Ogr,Grass,我正在尝试将草地GIS矢量层读入GeoPandas数据帧 因为我无法在Fiona 我采用了一种“黑客”方法(有效)将草地GIS矢量层读入GeoPandas数据帧中: 导入操作系统 从osgeo导入ogr 作为pd进口熊猫 来自shapely import wkt 作为gpd导入geopandas def grass2gpd(图层名称、grassdb、位置名称、地图集): datafile=os.path.join(GRASSDB、位置名称、地图集、“向量”、图层名称、“头”) driver=o

我正在尝试将
草地GIS
矢量层读入
GeoPandas数据帧

因为我无法在
Fiona

我采用了一种“黑客”方法(有效)将
草地GIS
矢量层读入
GeoPandas数据帧中:


导入操作系统
从osgeo导入ogr
作为pd进口熊猫
来自shapely import wkt
作为gpd导入geopandas
def grass2gpd(图层名称、grassdb、位置名称、地图集):
datafile=os.path.join(GRASSDB、位置名称、地图集、“向量”、图层名称、“头”)
driver=ogr.GetDriverByName('GRASS'))
#在这里,数据是以只读模式读取的,但GDAL-GRASS驱动程序也没有写功能
#在方法的末尾,我不确定如何正确地关闭数据源(实际上,如果必须的话…)
dataSource=driver.Open(数据文件,0)
layer=dataSource.GetLayer()
srs=layer.GetSpatialRef().ExportToWkt()
lyrDefn=layer.GetLayerDefn()
字段名=[]
对于范围内的i(lyrDefn.GetFieldCount()):
fieldnames.append(lyrDefn.GetFieldDefn(i).GetName())
#避免调用'layer.ResetReading()`并再次迭代功能
#
#我首先建立一个字典列表
#列表中的每个元素的形式如下:
#{geom:WKT_几何
#属性:{field_1:val,field_2:val,…,field_N:val}
#因此attr键本身就是一个字典
#嵌套循环首先获取特性,然后创建一个属性字典,在字段列表上循环
# 
wktgeom=[{'geom':feature.GetGeometryRef().ExportToWkt(),
'attr':{i:feature.GetField(i)for i in fieldnames}}for feature in layer]
#此时,我应该关闭或取消数据源的链接,但我找不到正确的方法
#
#从字典列表中创建数据帧
#
df=pd.DataFrame(wktgeom)
#将WKT字符串转换为形状优美的WKT对象
#将几何数据帧与属性数据帧连接起来
df_geom=局部混凝土([df['geom']适用(工作荷载),
pd.DataFrame(列表(df['attr'].values)),
轴=1,排序=假)
#将pandas数据帧转换为geopandas数据帧
gdf=gpd.GeoDataFrame(df_geom,geometry='geom',crs=srs)
返回gdf
运行它,例如:


GRASSDB=“/home/epinux/Data/grassdata”
位置\u NAME=“lonlat”
MAPSET=“永久”
layername=“img\u left\u filteredBS”
gdf=grass2gpd(layername=layername,
grassdb=grassdb,
地点名称=地点名称,
地图集=地图集)
类型(gdf)
#返回
#geopandas.geodataframe.geodataframe
该方法将返回一个
geopandas.geodataframe.geodataframe
,正如我所希望的,但是


我想知道是否存在一种直接传递到
GeoPandas
GDAL-OGR-Python
接口读取的OGR数据源的方法。如果没有,你有什么建议来改进我提出的“黑客方法”吗?我在代码中添加了一些内联注释,试图解释我的担忧。

我刚收到问题的回复,通过在
Fiona
中启用
OGR\u GRASS
驱动程序解决了问题,下面的代码工作得很好:

<代码>导入菲奥娜 作为gpd导入geopandas 菲奥娜。支持的司机[奥格拉斯草] =“R” gdf=gpd.read_文件('/GRASSDB/LOCATION_NAME/MAPSET/vector/layername/head')