获取栅格的统计数据并导出至CSV

部署运行你感兴趣的模型镜像
from osgeo import gdal
import os
import pandas as pd
path = r"D:\GPP\0_data\4_VPM_GPP\11_IGBP_00_16_result\1_EBF"  # 文件路径
path_list = os.listdir(path)
tif_files = list()  # 创建一个只装tif格式的列表
for filename in path_list:  # 遍历
    # 用于分割文件名,将文件名分为两部分:文件的名称部分和文件的扩展名部分,返回值是一个包含两个元素的元组,第一个元素是文件名的名称部分,第二个元素是文件的扩展名部分(包括 . 符号)
    if os.path.splitext(filename)[1] == '.tif':
        tif_files.append(filename)  # 将原文件夹的tif文件加入只有tif的列表

min = []
max = []
mean = []
std = []
num = []
sum = []
for tif in tif_files:
    dataset = gdal.Open(path+'\\'+tif)
    data_width = dataset.RasterXSize
    data_height = dataset.RasterYSize
    data = dataset.ReadAsArray(0, 0, data_width, data_height)  # 读取整个 tif 为数组
    count = 0
    # 过滤无效值
    for i in range(0, data_height):
        for j in range(0, data_width):
            if data[i, j] >= 0:
                count = count+1
    num.append(count)

    band = dataset.GetRasterBand(1)
    # ComputeStatistics()方法将返回一个包含波段数据简单统计指标(具体为最小值,最大值,平均值和标准差)的列表
    # 参数为True时表示对数据进行抽样统计,参数为False表示统计所有像元值
    statistics = band.ComputeStatistics(False)
    min.append(statistics[0])
    max.append(statistics[1])
    mean.append(statistics[2])
    std.append(statistics[3])
    sum.append(statistics[2]*count)

    print(statistics)
df = pd.DataFrame({'number': range(1, len(tif_files) + 1), 'file_name': tif_files, 'min': min, 'max': max, 'mean': mean,'count':num, 'sum': sum, 'std': std})
df.to_csv(r"D:\pythonProject\python_GIS_study\VPM_EBF_2000_statistics.csv", index=False, encoding='utf-8')

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决如何将栅格数据换为CSV文件的问题。首先,用户提到了使用ArcGIS和PostGIS的方法,我需要先回顾一下这些工具的具体步骤。 首先,用户提供的引用中,引用[2]提到了ArcGIS中面栅格,再栅格点,最后导出CSV。这可能涉及到几个步骤:创建面状shp文件,换为栅格,提取栅格中的点坐标,然后导出CSV。我需要详细分解这些步骤,确保每一步都正确,比如在ArcGIS中使用“面栅格”工具时,需要设置像元大小和字段,接着用“栅格点”工具生成点要素,然后添加经纬度字段,最后导出属性表为CSV。 接下来是PostGIS的方法,引用[1]提到将各种GIS数据导入PostGIS数据库,但用户现在是要导出栅格数据为CSV。这时候可能需要使用PostGIS的函数,比如ST_PixelAsXXX系列函数来提取栅格的像素值。可能需要将栅格分解为像素点,然后导出这些点的坐标和值到CSV。但我不太确定具体的SQL语句怎么写,可能需要查阅PostGIS的文档,确认如何分解栅格生成坐标。 另外,用户可能还需要其他工具的方法,比如GDAL的gdal2xyz.py脚本,这是一个常用的命令行工具,可以将栅格数据换为XYZ格式,再换为CSV。这个步骤需要用户安装GDAL,正确使用命令行参数,比如跳过NoData值。 然后,我需要考虑用户的实际操作中可能遇到的问题。例如,在ArcGIS中添加经纬度字段时,是否正确计算了地理坐标或投影坐标?如果数据是投影坐标系,是否需要先换为地理坐标系才能得到经纬度?或者在PostGIS中处理时,栅格的坐标系是否正确,是否需要换? 还有,用户可能对编程方法感兴趣,比如Python使用GDAL库读取栅格数据,遍历每个像素,获取坐标和值,然后写入CSV。这需要代码示例,确保正确读取栅格的地理变换参数,计算每个像素的坐标,处理NoData值。 在组织回答时,需要分步骤说明每个方法,确保逻辑清晰。同时,相关问题部分需要引导用户深入探讨,比如不同工具的比较、处理大型栅格的效率、坐标系的影响,以及如何处理多维栅格数据等。 需要验证每个步骤的正确性,例如在ArcGIS导出属性表时,是否确实包含经纬度字段;使用GDAL的gdal2xyz.py时,是否正确处理了不同数据格式。可能还需要提醒用户注意数据量大的时候,CSV文件可能会很大,需要适当的内存和存储空间。 最后,确保回答符合用户的要求:结构清晰,步骤详细,引用正确,且生成的相关问题能够覆盖用户可能进一步的需求。同时,避免使用Markdown格式,保持自然的中文表达,口语化但不啰嗦。</think>### 栅格数据换为CSV表格的方法 将栅格数据(如高程、温度、遥感影像等)换为CSV文件的核心步骤是提取每个栅格像元的坐标(经纬度或投影坐标)及其对应值。以下是具体实现方法: --- #### **1. 使用ArcGIS工具链** **步骤说明:** 1. **面栅格(可选)** 若需要特定区域的栅格数据,先用面状shp文件裁剪目标范围,再通过 `ArcToolbox > Conversion Tools > 栅格 > 面栅格` 生成栅格数据[^2]。 2. **栅格点** 使用 `ArcToolbox > Conversion Tools > 从栅格出 > 栅格点`,将栅格像元为点要素图层,每个点对应一个像元的中心坐标。 3. **添加坐标字段** 在点要素属性表中,通过 `计算几何` 工具添加经度(`X`)和纬度(`Y`)字段,选择坐标系(地理坐标系则输出经纬度,投影坐标系输出平面坐标)。 4. **导出CSV** 右键点击点要素图层,选择 `导出表格`,保存为CSV格式,包含 `X`、`Y` 和栅格值字段。 --- #### **2. 使用GDAL命令行工具** **方法:** 通过 `gdal2xyz.py` 脚本直接将栅格换为文本格式(XYZ),再另存为CSV: ```bash gdal2xyz.py -skipnodata input_raster.tif output.xyz # 将.xyz重命名为.csv,或使用Excel换 ``` 参数 `-skipnodata` 可跳过无效值,适用于大型栅格数据。 --- #### **3. 通过PostGIS数据库处理** **步骤:** 1. **导入栅格到PostGIS** 使用 `raster2pgsql` 工具将栅格数据导入数据库: ```bash raster2pgsql -s 4326 -I -C -M input.tif -F public.raster_table | psql -d your_db ``` 2. **提取像元坐标和值** 执行SQL查询,通过 `ST_PixelAsXXX` 函数分解栅格: ```sql SELECT (ST_PixelAsPoints(rast)).* FROM public.raster_table; ``` 3. **导出查询结果为CSV** 使用 `COPY` 命令或PgAdmin导出工具将结果保存为CSV。 --- #### **4. Python脚本(基于GDAL库)** **代码示例:** ```python from osgeo import gdal import csv # 读取栅格 ds = gdal.Open("input.tif") band = ds.GetRasterBand(1) data = band.ReadAsArray() gt = ds.GetGeoTransform() # 计算坐标 with open("output.csv", "w", newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(["X", "Y", "Value"]) for y in range(data.shape[0]): for x in range(data.shape[1]): x_coord = gt[0] + x * gt[1] + y * gt[2] y_coord = gt[3] + x * gt[4] + y * gt[5] writer.writerow([x_coord, y_coord, data[y, x]]) ``` 此脚本遍历每个像元,计算其坐标写入CSV,适用于自定义处理逻辑[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值