栅格计算器可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。它是一种强大的工具,允许用户通过输入复杂的数学表达式,对栅格数据进行处理和分析。
用人话说就是:栅格计算器可以对栅格图像中的像素值进行各种规则的运算,得出你想要的结果,例如根据多光谱遥感图像中植物的光谱值计算NDVI指数。
在ArcMap中使用栅格计算器可以按照以下方法寻找:
举个例子说明栅格计算器的原理:
- 比如现在有一副DEM图,其中出现了一些负数值,要消除负数,我们就需要使用栅格计算器对每一个负数加上一个正数或者减去整个图像中最小的数值。被计算后重新输出就得到了计算过的栅格图像。
- 但是栅格计算器有个问题,就是复杂的操作不好做,比如在计算的过程中统计数据。
-
因此使用python将会强大很多,下面介绍一下rasterio:
-
Rasterio是一个专门用于栅格数据读写操作的Python库,它支持多种栅格数据格式,如GeoTIFF、ENVI和HDF5,为处理和分析栅格数据提供了强大的工具,基于GDAL(地理数据抽象库)构建,提供了快速和可靠的栅格数据处理能力,适用于各种栅格数据应用,如卫星遥感、地图制作、地理信息系统(GIS)等领域。
-
rasterio的官网:https://rasterio.readthedocs.io/en/latest/installation.html
-
rasterio安装相关问题:https://blog.youkuaiyun.com/ruankun521/article/details/143324078?spm=1001.2014.3001.5502
下面给一个rasterio的案例:
import numpy as np
import pandas as pd
import rasterio
with rasterio.open('ndvi.tif') as src:
ds = np.around(src.read(1), decimals=3)
ds = ds + 1
profile = src.profile
with rasterio.open('result.tif', 'w', **profile) as dst:
dst.write(ds, 1)
下面给一个实际的例子:
import pandas as pd
import numpy as np
import rasterio
if __name__ == '__main__':
# 读取数据
data = pd.read_csv('result.csv', header=0)
tif = np.array(data['level']).reshape((934, 1035))
with rasterio.open('GDP.tif') as origin:
transform = origin.transform
profile = origin.profile
csr = origin.crs
with rasterio.open('result.tif', 'w', driver='GTiff', height=934, width=1035, count=1, dtype=rasterio.int8, transform=transform, crs=csr) as dst:
dst.write(tif, 1)
解释一下:通过读入一个csv文件,然后变成一个934x1035的形状,然后输出为一个tif图像。
如果你觉得有点难,可以打开AI问,下面以codeGeex为例:
问:
假如有一个csv文件,只有一列数据,长度为966690,类型为浮点数,请使用python读入后,使用rasterio输出为934*1035的tif图像,假如图像的transform和crs从碳排放.tif中读取。
答:
要将一个CSV文件中的数据转换为GeoTIFF图像,我们需要使用Python的几个库:pandas用于读取CSV文件,numpy用于数据处理,rasterio用于写入GeoTIFF文件。同时,我们需要从现有的GeoTIFF文件(如“碳排放.tif”)中读取地理变换(transform)和坐标参考系统(CRS)。
以下是一个示例代码,展示了如何完成这一任务:
import pandas as pd
import numpy as np
import rasterio
from rasterio.transform import from_origin
# 读取CSV文件
csv_file = 'your_data.csv' # 替换为你的CSV文件路径
data = pd.read_csv(csv_file, header=None)
data = data.iloc[:, 0].values # 假设数据在第一列
# 确保数据长度与所需图像大小匹配
required_length = 934 * 1035
if len(data) != required_length:
raise ValueError(f"CSV文件中的数据长度应为{required_length}, 但现在是{len(data)}")
# 读取现有的GeoTIFF文件以获取transform和CRS
reference_tif = '碳排放.tif' # 替换为你的参考GeoTIFF文件路径
with rasterio.open(reference_tif) as src:
transform = src.transform
crs = src.crs
# 重塑数据为图像的形状
image_data = data.reshape((934, 1035))
# 写入GeoTIFF文件
output_tif = 'output.tif' # 替换为你想要保存的GeoTIFF文件路径
with rasterio.open(
output_tif, 'w', driver='GTiff',
height=934, width=1035, count=1,
dtype=str(image_data.dtype),
crs=crs,
transform=transform
) as dst:
dst.write(image_data, 1)
print(f"GeoTIFF文件已成功保存为 {output_tif}")
请确保替换示例代码中的文件路径(your_data.csv 和 碳排放.tif)为你的实际文件路径。这个代码假设CSV文件中只有一列数据,并且数据长度与所需图像大小匹配。如果数据长度不匹配,代码会抛出一个错误。
这个代码首先读取CSV文件中的数据,然后从参考的GeoTIFF文件中获取地理变换和坐标参考系统。接着,将数据重塑为所需的图像形状,并使用rasterio将数据写入一个新的GeoTIFF文件中。