目前有一个数据处理的需求,需要使用python完成影像批处理,假设我只是个不懂编程的小白,决定采用AI工具辅助完成代码编写。

1.处理需求

        tif格式的遥感影像,获取其有效区域的范围,以shp格式导出。遥感影像在arcgis中打开如下,可以看到其周边无效区域的值为nodata。

2.提示词

        初始提示词为:python代码,读取tif格式影像,获取有效数据范围shp矢量,只导出有效区域的矢量范围,无效区域的不导出。

        后续的提示词根据处理的结果或程序的bug追加。

3.AI模型表现

3.1 DeepSeek网页端

        (1)访问方式

        百度搜索deepseek关键词,进入官网,点击开始对话

        (2)运行过程

                模型第一次运行给出了矢量代码如下:

import rasterio
from rasterio.features import shapes
import geopandas as gpd
from shapely.geometry import shape

def export_valid_areas(input_tif, output_shp):
    # 读取TIFF文件
    with rasterio.open(input_tif) as src:
        # 获取第一个波段的数据和元数据
        band = src.read(1)
        nodata = src.nodata
        transform = src.transform
        crs = src.crs

        # 创建有效数据掩膜(True表示有效数据)
        mask = band != nodata

        # 生成多边形特征
        features = shapes(mask, transform=transform, connectivity=4)

        # 收集所有有效区域的多边形
        geometries = []
        for geom, value in features:
            if value == 1:  # 仅保留有效区域(值为1的要素)
                geometries.append(shape(geom))

        # 创建GeoDataFrame并设置坐标系
        gdf = gpd.GeoDataFrame({'geometry': geometries}, crs=crs.to_wkt())

        # 导出为Shapefile
        gdf.to_file(output_shp)

if __name__ == "__main__":
    input_tif = "input.tif"    # 输入TIFF文件路径
    output_shp = "output.shp"  # 输出Shapefile路径
    export_valid_areas(input_tif, output_shp)

        我将其中的输入和输出路径重新设置后报错,如下图所示:

        将此段错误提示重新输入到deepseek提示词窗口,修改后的代码如下:

import rasterio
from rasterio.features import shapes
import geopandas as gpd
from shapely.geometry import shape
import numpy as np

def export_valid_areas(input_tif, output_shp):
    with rasterio.open(input_tif) as src:
        band = src.read(1)
        nodata = src.nodata
        transform = src.transform
        crs = src.crs

        # 生成有效数据掩膜,并显式转换为uint8类型
        mask = (band != nodata).astype('uint8')  # 关键修复:转换数据类型

        # 生成多边形特征
        features = shapes(mask, transform=transform, connectivity=4)

        geometries = []
        for geom, value in features:
            if value == 1:  # 有效区域对应掩膜值为1
                geometries.append(shape(geom))

        gdf = gpd.GeoDataFrame({'geometry': geometries}, crs=crs.to_wkt())
        gdf.to_file(output_shp)

if __name__ == "__main__":
    input_tif = "input.tif"
    output_shp = "output.shp"
    export_valid_areas(input_tif, output_shp)

(3)运行效果   

        运行成果,效果如下,红色框线为生成的矢量范围

3.2DeepSeek本地部署

(1)访问方式

        第一步:在官网下载对应的Ollama:ollama.com(注意可能要科学上网)

        第二步:进入Ollama官网,找到Models。

        第三步:找到deepseek-r1,点击进去找到对应的安装命令,电脑配置越高可选择的模型越大,但是运行越慢,我是16G的内存选择了7B模型。

        第三步:打开cmd,输入上述对应的命令即可完成安装

(2)运行过程

        模型第一次给出矢量代码如下:

        可以看到模型将输入数据理解为tif影像和shp矢量,但是我本次的需求是通过输入的tif数据,获取有效区域的shp矢量范围,代码完全不正确。差评!!!

import os
from osgeo import gdal
import shapely
from itertools import islice

def read_shapefile(shape_file):
    """读取Shape文件,返回出发矢量点坐标列表"""
    with open(shape_file, 'rb') as f:
        driver = shapely._utils.read_driver(f)
        shape = shapely.Shape()
        shape.read(f)
        points = [ (shape.polygon(0)[i][0], shape.polygon(0)[i][1]) for i in range(len(shape.polygon(0))) ]
    return points

def main():
    # 读取输入参数
    input_tif = "your_input.tif"
    input_shape = "your_shape.shp"

    # 读取Shape文件中的出发矢量点
    shape_points = read_shapefile(input_shape)

    # 初始化输出TIF文件路径
    output_tif = os.path.join(os.path.dirname(input_tif), "valid_region.tiff")

    # 使用GDAL读取输入TIF数据
    dataset = gdal.Open(input_tif)
    if dataset is None:
        raise ValueError("无法打开TIF文件:%s" % input_tif)

    # 获取投影信息和分辨率
    projection = dataset.GetProjection()
    cols = dataset.GetRasterXSize()
    rows = dataset.GetRasterYSize()
    band_count = dataset.RasterCountOf Bands()

    # 创建一个标记数组,用于记录有效区域的像素
    valid_mask = [[False for _ in range(cols)] for _ in range(rows)]

    # 遍历每个像素
    for i in range(rows):
        for j in range(cols):
            pixel_value = dataset.GetPixel(i, j, 1)
            x_center = (j + 0.5) * dataset.GetResolutionX()
            y_center = (i + 0.5) * dataset.GetResolutionY()

            # 检查是否接近任何出发矢量点
            for p in shape_points:
                if (x_center - p[0])**2 + (y_center - p[1])**2 <= 2.25:  # 假设邻域半径为0.5像素
                    valid_mask[i][j] = True
                    break

    # 创建一个新的GDAL数据集,用于输出结果
    output_dataset = None
    try:
        output_driver = gdal.GetDriverByName("GTiff")
        output_dataset = output_driver.Open(output_tif, 1)
        if output_dataset is None:
            raise ValueError("无法创建TIF文件:%s" % output_tif)

        # 将valid_mask写入新数据集中
        band = output_dataset.AddBand()
        band.Data = valid_mask
        band.NeededUpdate = 0
        output_dataset.Write()

    finally:
        if output_dataset is not None:
            output_dataset = None

    # 关闭输入数据集
    dataset = None

if __name__ == "__main__":
    main()

        后面考虑到提示词可能设置不正确的原因,我对提示词按照如下格式进行了重新修改:

        语言:python

        功能:获取影像有效数范围(shp格式)

        要求:输入tif格式影像;输出为有效数据(不为nodata或0)的矢量范围(shp格式);使用gdal库;代码格式规范,复用性强。

        下面是运行15分钟后给出的代码,可以看到其整体逻辑是按照像素遍历的方式完成了有效区搜索:

import os
import argparse
from osgeo import gdal
from fiona import Fiona

def main():
    # 使用argparse处理输入参数
    parser = argparse.ArgumentParser(description='提取tif影像的有效数据范围并保存为shp文件')
    parser.add_argument('input_tif', help='输入的tif文件路径')
    parser.add_argument('output_shp', help='输出的shp文件路径')
    parser.add_argument('--compressed', action='store_true',
                           help='压缩shp文件(默认不压缩)')
    args = parser.parse_args()

    # 打开tif文件并获取空间参考信息
    dataset = None
    try:
        driver = gdal.GetDriverByName('GTiff')
        dataset = gdal.Open(args.input_tif)
        if dataset is None:
            raise ValueError("无法打开输入的tif文件:%s" % args.input_tif)
        proj = dataset.GetProjection()
        geotiff = dataset.GetGeoTransform()

        # 初始化变量来记录有效区域
        min_row = float('inf')
        max_row = -float('inf')
        min_col = float('inf')
        max_col = -float('inf')

        # 遍历影像数据,查找非nodata值的最小和最大行列
        band = dataset.GetRasterBand(1)
        if band is None:
            raise ValueError("tif文件缺少有效的波段")

        # 使用gdal读取数据块,并检查是否存在有效值
        for row in range(dataset.RowCount):
            for col in range(band.Cols):
                pixel = band.GetPixel(row, col)
                if pixel != None and pixel is not gdal.NODATA:
                    if row < min_row:
                        min_row = row
                    if row > max_row:
                        max_row = row
                    if col < min_col:
                        min_col = col
                    if col > max_col:
                        max_col = col

            # 提前终止循环,如果找到有效数据(至少一个点)
            if (min_row != float('inf')) and (max_row != -float('inf')):
                break

        if (min_row == float('inf')) or (max_row == -float('inf')):
               raise ValueError("输入的tif文件中没有发现有效数据")

        # 创建shp文件
        schema = {
            'type': 'Polygon',
            'coordinates': [
                [(min_col, min_row), (max_col, min_row),
                (max_col, max_row), (min_col, max_row)]
               ],
            'transform': {'epsg': proj.GetEPSG() if proj is not None else 0}
        }

        # 使用Fiona库生成shp文件
        if args.compressed:
            f = Fiona(
                schema=schema,
                filename=args.output_shp,
                driver='gpkg',
                compress='DEFLATE'
            )
        else:
            f = Fiona(
                schema=schema,
                filename=args.output_shp,
                driver='gpkg'
               )

        # 将几何内容写入文件
        f.write()

        print("有效数据范围已生成,输出为:%s" % args.output_shp)
    except Exception as e:
        print(e)
    finally:
        if dataset:
            dataset = None  # 释放资源

代码报错如下,库引入不正确,后面重新安装了库依旧没有解决问题。

cannot import name 'Fiona' from 'fiona' (c:\Users\97421\anaconda3\envs\python310\lib\site-packages\fiona\__init__.py)

File "C:\D\python\GetValiData_deepseekr1.py", line 4, in <module> from fiona import Fiona ImportError: cannot import name 'Fiona' from 'fiona' (c:\Users\97421\anaconda3\envs\python310\lib\site-packages\fiona\__init__.py)

(3)运行效果   

        在运行了45分钟左右后,最终本地部署的模型没有帮我解决问题。

3.3 文心一言3.5

(1)访问方式

百度搜索文心一言直接数据

(2)运行过程

模型第一次给出的矢量代码如下:

import rasterio
from rasterio.mask import mask
import geopandas as gpd
from shapely.geometry import mapping, Polygon

def get_valid_data_range(tif_path):
    with rasterio.open(tif_path) as src:
        # 创建一个多边形,包含整个影像的范围
        bounds = src.bounds
        full_polygon = Polygon([(bounds.left, bounds.bottom), 
                                (bounds.left, bounds.top), 
                                (bounds.right, bounds.top), 
                                (bounds.right, bounds.bottom), 
                                (bounds.left, bounds.bottom)])
        
        # 使用mask函数找出有效数据的范围
        out_image, out_transform = mask(src, [full_polygon], crop=True)
        
        # 有效数据范围的外边界(bounding box)
        valid_bounds = out_image.bounds
        valid_polygon = Polygon([(valid_bounds.left, valid_bounds.bottom), 
                                 (valid_bounds.left, valid_bounds.top), 
                                 (valid_bounds.right, valid_bounds.top), 
                                 (valid_bounds.right, valid_bounds.bottom), 
                                 (valid_bounds.left, valid_bounds.bottom)])
        
    return valid_polygon

def main(tif_path, shp_path):
    # 获取有效数据范围
    valid_polygon = get_valid_data_range(tif_path)
    
    # 创建GeoDataFrame
    gdf = gpd.GeoDataFrame({'geometry': [valid_polygon]}, crs=rasterio.open(tif_path).crs)
    
    # 导出为Shapefile
    gdf.to_file(shp_path, driver='ESRI Shapefile')

# 示例用法
tif_path = 'path/to/your/image.tif'
shp_path = 'path/to/output/valid_data_range.shp'
main(tif_path, shp_path)

代码运行报错,把报错信息输入到提示词中,终于在第三次运行出如下结果,可以看到矢量和影像没有重叠,因此继续将问题输入到提示词中,得到下图右图结果,结果为四至坐标:

        重新输入如下提示词,依旧报错,不再尝试。

        语言:python

        功能:获取影像有效数范围(shp格式)

        要求:输入tif格式影像;输出为有效数据(不为nodata或0)的矢量范围(shp格式);使用gdal库;代码格式规范,复用性强。

(3)运行效果

        将过至少5轮测试,最终没有达到效果,不过运行效率比较快。

4.总结

4.1模型表现总结

        (1)DeepSeek网页端顺利写出了程序代码,执行效率在2分钟内,但是多次提问会出现服务器无法响应情况。

        (2)Deepseek本地部署的模型,执行效率低,占用内存,且无法解决实际问题,比较鸡肋,不适合本次应用的实验场景,测试完果断删除了。

        (3)文心一言模型,执行效率快,但是其代码编写水平低,易爆bug。

        总结:deepseek网页端可理解复杂提示词,能解决实际问题。完胜其他模型。

4.2 AI感悟

        惊叹于deepseek网页端模型强大的能力,其水平至少能达到中级程序员水准,预测未来会是很好的AI助手。

        

        

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐