You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQGIS中QgsVectorLayer无法读取Pandas DataFrame转换的JSON问题

解决无几何Pandas DataFrame转QgsVectorLayer的问题

问题根源

你直接用parsed_data_df.to_json()生成的是普通键值对结构的JSON,OGR驱动无法将其识别为合法的矢量数据源——OGR仅支持GeoJSON(带几何字段)或特定格式的表格数据源,普通JSON不在其支持范围内。

两种可行解决方案

方案一:CSV格式中转(快速实现)

将DataFrame转为CSV字符串,通过OGR的CSV驱动加载为纯属性图层,同时设置参数避免OGR尝试解析几何字段:

# in processAlgorithm
....
parsed_data_df = self.parse_response_data(response_data) 
if parsed_data_df is not None:
    # 将DataFrame转为CSV字符串(不含索引)
    csv_content = parsed_data_df.to_csv(index=False)
    # 构造CSV数据源URI,指定无几何字段
    csv_uri = f"data:text/csv;charset=utf-8,{csv_content}"
    # 加载为矢量图层,使用CSV驱动
    matrix_layer = QgsVectorLayer(csv_uri, "matrix", "csv")
    # 设置编码确保中文等特殊字符正常显示
    matrix_layer.setProviderEncoding('UTF-8')
    
    # 检查图层有效性,有效才加入结果
    if matrix_layer.isValid():
        results['Matrix'] = matrix_layer
    else:
        QgsMessageLog.logMessage("CSV图层创建失败", "处理脚本", Qgis.Warning)
return results

方案二:手动构建内存图层(灵活可控)

直接创建无几何的内存图层,根据DataFrame的字段类型手动添加属性字段,再逐行导入数据:

# in processAlgorithm
....
from qgis.core import QgsField, QgsFeature, QVariant

parsed_data_df = self.parse_response_data(response_data) 
if parsed_data_df is not None:
    # 创建无几何的内存图层
    matrix_layer = QgsVectorLayer("None", "matrix", "memory")
    provider = matrix_layer.dataProvider()
    
    # 根据DataFrame字段添加图层字段(匹配数据类型)
    field_list = []
    for col_name in parsed_data_df.columns:
        col_dtype = parsed_data_df[col_name].dtype
        if col_dtype == 'int64':
            field = QgsField(col_name, QVariant.Int)
        elif col_dtype == 'float64':
            field = QgsField(col_name, QVariant.Double)
        else:
            field = QgsField(col_name, QVariant.String)
        field_list.append(field)
    provider.addAttributes(field_list)
    matrix_layer.updateFields()
    
    # 逐行导入DataFrame数据到图层
    for _, row in parsed_data_df.iterrows():
        feature = QgsFeature(matrix_layer.fields())
        for col_idx, col_name in enumerate(parsed_data_df.columns):
            feature.setAttribute(col_idx, row[col_name])
        provider.addFeature(feature)
    
    # 检查有效性后加入结果
    if matrix_layer.isValid():
        results['Matrix'] = matrix_layer
    else:
        QgsMessageLog.logMessage("内存图层创建失败", "处理脚本", Qgis.Warning)
return results

注意事项

  • 两种方案都需先验证图层isValid(),避免无效图层进入模型输出
  • 内存图层性能更优,适合数据量不大的场景;CSV方案适合快速调试

内容的提问来源于stack exchange,提问作者nefertarip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:52:47