arcpy-GIS获取字段的唯一值、重复值、最值、平均值、方差、标准差、中数、众数等数值。

本文介绍了一种使用Python的arcpy模块进行地理信息系统(GIS)数据统计的方法,包括获取字段的唯一值、重复值、最大最小值、平均值、中位数、众数、方差及标准差等统计指标。

arcpy-GIS获取字段的唯一值、重复值、最值、平均值、方差、标准差、中数、众数等数值。

import numpy
from arcpy import da

#唯一值
def GetFieldUniqueValue(inTable,inField):
    value_list=[]
    rows=arcpy.da.SearchCursor(inTable,inField)
    for row in rows:
        if row[0] not in value_list:
            value_list.append( str(row[0]).decode('utf-8') )
    del row
    del rows
    return value_list

# 重复值
def GetDuplicateValue(inTable,inField):
    dic={
   
   }
    rows=arcpy.da.SearchCursor(inTable,inField)
    for row in rows:
        if row[0] in dic
<think>我们使用arcpy的GetRasterProperties_management函可以获取栅格据的统计信息。 注意:要获取中位(median)和变异系(coefficient of variation)可能需要额外的步骤,因为GetRasterProperties_management函不直接提供中位和变异系。 变异系可以通过标准差除以平均值得到,而中位则需要使用其他方法(例如使用NumPy组计算)。 步骤: 1. 获取平均值标准差。 2. 计算变异系(变异系 = 标准差 / 平均值)。 3. 获取中位:我们可以将栅格转换为NumPy组,然后计算中位(需要安装NumPy)。 注意:如果栅格据很大,转换为NumPy组可能会消耗大量内存。 另外,也可以使用arcpy.RasterToNumPyArray函将栅格转换为NumPy组,然后使用NumPy的函计算中位和变异系。 但是,用户要求使用arcpy,所以我们可以结合arcpy和NumPy(如果允许使用NumPy的话)。 如果环境中不能使用NumPy,那么获取中位可能比较困难,因为arcpy本身没有直接提供计算栅格中位的工具。 因此,我们有两种方法: 方法一:使用GetRasterProperties_management获取基本统计信息,然后通过计算得到变异系,再通过转换为NumPy组计算中位(需要NumPy)。 方法二:如果不想使用NumPy,可能需要使用其他地理处理工具(例如分位)来间接获取中位,但arcpy中也没有直接获取中位的函。 这里我们假设可以使用NumPy,因为中位和变异系不是GetRasterProperties_management直接支持的。 具体步骤: 1. 使用GetRasterProperties_management获取平均值标准差。 2. 计算变异系(注意:如果平均值为0,则变异系无意义,需要避免除以0)。 3. 使用arcpy.RasterToNumPyArray将栅格据转换为NumPy组,然后使用numpy.median计算中位。 注意:使用NumPy组时,忽略NoData。 代码示例: 首先,确保已经导入arcpy和numpy。 如果栅格据有NoData,我们在转换为NumPy组时应该将其设置为NaN,然后使用numpy.nanmedian来计算中位。 但是,请注意arcpy.RasterToNumPyArray默认会将NoData转换为NaN(如果栅格有NoData的话),如果没有设置NoData,则所有像素都会参与计算。 示例代码: ```python import arcpy import numpy as np # 设置工作空间 arcpy.env.workspace = r"路径到工作空间" # 输入栅格 input_raster = "栅格名称.tif" # 获取基本统计信息 min_val = arcpy.GetRasterProperties_management(input_raster, "MINIMUM") max_val = arcpy.GetRasterProperties_management(input_raster, "MAXIMUM") mean_val = arcpy.GetRasterProperties_management(input_raster, "MEAN") std_val = arcpy.GetRasterProperties_management(input_raster, "STD") # 将获取转换为浮点 min_val = float(min_val.getOutput(0)) max_val = float(max_val.getOutput(0)) mean_val = float(mean_val.getOutput(0)) std_val = float(std_val.getOutput(0)) # 计算变异系 if mean_val != 0: coefficient_of_variation = std_val / mean_val else: coefficient_of_variation = None # 或者设置为一个特殊,如NaN # 将栅格转换为NumPy组,忽略NoData raster_array = arcpy.RasterToNumPyArray(input_raster, nodata_to_value=np.nan) # 计算中位,忽略NaN(即NoData) median_val = np.nanmedian(raster_array) # 输出结果 print(":", min_val) print(":", max_val) print("平均值:", mean_val) print("标准差:", std_val) print("变异系:", coefficient_of_variation) print("中位:", median_val) ``` 注意:如果栅格据非常大,转换为NumPy组可能会占用大量内存,甚至导致内存不足。因此,对于大型栅格,建议使用其他方法(如分块处理)或使用地理据库的统计功能。 另外,变异系通常用于反映据的离散程度,是一个无量纲的,但前提是平均值不为0。 如果环境中没有NumPy,则需要先安装NumPy(通常ArcGIS自带的Python会包含NumPy)。 如果用户不能使用NumPy,那么可能需要考虑使用其他工具(如ArcGIS的“波段统计”工具)来获取中位,但标准工具中并没有直接提供。在ArcGIS Pro中,可以使用“计算分位”工具(CalculatePercentiles)来计算中位(中位即第50百分位),然后获取。但是,在arcpy中,我们可以使用分位吗? 在ArcGIS Pro中,有一个工具叫做“计算分位”(CalculatePercentiles),属于Image Analyst扩展模块,但该工具会生成一个新的栅格,而不是直接返回统计。因此,我们可以使用该工具计算中位,然后从结果栅格中获取(但这样效率较低)。 因此,如果用户不能使用NumPy,且需要处理大栅格,可能需要考虑使用分块读取或者寻找其他替代方案。 综上所述,如果可以使用NumPy,上述代码是可行的。如果栅格据很大,建议使用分块处理,但那样代码会更复杂。 这里我们提供使用NumPy的方法,因为这是较为直接的方式。 另外,注意在运行前设置好工作空间和输入栅格路径。 如果用户没有安装NumPy,则需要先安装(对于ArcGIS自带的Python,通常已经安装了NumPy)。 如果用户使用的是ArcGIS Desktop 10.x,自带的Python环境通常包含NumPy。ArcGIS Pro也包含NumPy。 因此,上述方法应该是可行的。 后,注意变异系(coefficient of variation)在统计学中通常用于比较不同单位或不同均据集的离散程度,但在地统计学中也有应用。 以上代码仅供参考,请根据实际情况调整。 引用:GetRasterProperties_management函的文档[^1]。</think>### 使用 ArcPy 获取栅格统计信息 在 ArcPy获取栅格据的统计信息(平均值、中位标准差、变异系)可通过以下步骤实现: #### 核心方法 ```python import arcpy import numpy as np # 设置工作环境 arcpy.env.workspace = r"路径/到/栅格文件夹" raster_path = "栅格名称.tif" # 替换为实际栅格路径 # 获取基础统计信息 min_val = arcpy.GetRasterProperties_management(raster_path, "MINIMUM").getOutput(0) max_val = arcpy.GetRasterProperties_management(raster_path, "MAXIMUM").getOutput(0) mean_val = arcpy.GetRasterProperties_management(raster_path, "MEAN").getOutput(0) std_val = arcpy.GetRasterProperties_management(raster_path, "STD").getOutput(0) # 计算中位(需转换为NumPy组) raster_array = arcpy.RasterToNumPyArray(raster_path, nodata_to_value=np.nan) median_val = np.nanmedian(raster_array) # 忽略NoData # 计算变异系标准差/平均值) cv_val = float(std_val) / float(mean_val) if float(mean_val) != 0 else np.nan # 打印结果 print(f": {min_val}") print(f": {max_val}") print(f"平均值: {mean_val}") print(f"中位: {median_val:.4f}") print(f"标准差: {std_val}") print(f"变异系: {cv_val:.4f}") ``` #### 关键说明: 1. **基础统计** 使用 `GetRasterProperties_management` 直接获取- `MINIMUM`/`MAXIMUM`:小/ - `MEAN`:平均值 - `STD`:标准差 2. **中位计算** 需将栅格转为 NumPy 组后使用 `np.nanmedian`,`nodata_to_value=np.nan` 会忽略 NoData [^1]。 3. **变异系** 通过公式 $ \text{CV} = \frac{\sigma}{\mu} $ 计算,其中 $\sigma$ 为标准差,$\mu$ 为平均值。需处理除零错误。 4. **注意事项**: - 确保栅格已构建统计信息(右键栅格 > 属性 > 源 > 统计信息) - 大栅格处理建议分块读取: ```python for x in range(0, width, block_size): for y in range(0, height, block_size): block = arcpy.RasterToNumPyArray(..., top_left_corner=[x,y]) ``` #### 替代方案(无 NumPy) ```python # 使用分位近似中位(需Spatial Analyst许可) arcpy.CheckOutExtension("Spatial") median_raster = arcpy.sa.Percentile(raster_path, 50) median_val = arcpy.GetRasterProperties_management(median_raster, "MINIMUM") ``` --- ### 相关问题 1. **如何处理未计算统计信息的栅格据?** 2. **ArcPy 中如何批量处理多个栅格的统计信息?** 3. **超大栅格据统计有哪些优化方法?** 4. **如何将统计结果导出为CSV或Excel文件?** [^1]: NumPy 的 `nanmedian` 函可有效处理包含 NoData 的栅格计算。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木易GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值