【实验笔记】谷歌地图配准哨兵二号影像制作遥感影像数据集

目录

一、目的背景

二、数据获取

三、数据集制作

四、遇见问题

1、谷歌影像与哨兵影像是否为同一时期,是否完全相同,谷歌影像的标签是否真的可以用作哨兵影像的标签?

2、谷歌影像如何下载?

3、anylabeling是什么?如何用?

4、GDAL包如何下载?

5、代码报错ERROR 1: PROJ: proj_create_from_name: Cannot find proj.db?


一、目的背景

由于哨兵二号影像分辨率为10m,较粗,在制作遥感影像数据集的时候手动划分有困难。我的想法是是否能够将其与谷歌地图影像配准,对谷歌地图的标签制作也就是哨兵二号的标签。

二、数据获取

哨兵二号:欧空局 2023年南京市江宁区某区域 10m

谷歌地图:Global Mapper 2023年南京市江宁区某区域(无偏移) 0.6m

三、数据集制作

根据前面章节,得到哨兵二号的数据集若干,本实验的关键在于配准谷歌影像以及标签的制作。

  1. 统一谷歌地图与哨兵二号影像的坐标系,在arcgis里进行检查。
  2. 使用得到的哨兵二号数据集对下载的谷歌影像进行裁剪,这里利用arcpy进行操作,用栅格范围对tif进行裁剪,代码如下:
    # coding=utf-8
    import arcpy
    import os
    
    # Sentinel 影像文件夹路径
    sentinel_folder = r"D:/DayDayUP/Eco_data/ShuJuJi/tif_sentinel/images"
    
    # 谷歌影像路径
    google_image = r"D:/DayDayUP/Eco_data/ShuJuJi/Googlemap/Googlemap.tif"
    
    # 输出文件夹路径
    output_folder = r"D:/DayDayUP/Eco_data/ShuJuJi/tif_google"
    
    # 设置工作空间
    arcpy.env.workspace = sentinel_folder
    
    # 确保输出文件夹存在,如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    print("工作空间设置完成")
    
    # 获取 Sentinel 影像文件夹中所有 tif 文件
    sentinel_images = arcpy.ListRasters("*.tif")
    
    print("找到 {} 个 Sentinel 影像".format(len(sentinel_images)))
    
    # 循环处理每个 Sentinel 影像
    for sentinel_image in sentinel_images:
        print("处理 {sentinel_image}")
    
        # 构建输出文件路径
        output_image = os.path.join(output_folder, "g" + os.path.basename(sentinel_image))
    
        # 使用哨兵影像裁剪谷歌影像
        arcpy.Clip_management(google_image, "#", output_image, os.path.join(sentinel_folder, sentinel_image), "0",
                              "ClippingGeometry")
    
        print("裁剪完成: {output_image}")
    
    print("脚本执行完成")
  3. 使用anylabeling对谷歌影像进行半自动化标签制作(模型下载时需要科学上网)。
  4. 将得到的json格式标签转换为带有地理坐标的tif文件,代码如下。
    # coding=utf-8
    import numpy as np
    import json
    import os
    from osgeo import gdal, ogr, osr
    import cv2  # 添加导入语句
    import os
    
    runtime_hooks = ['hook.py']
    # 指定JSON文件所在文件夹的路径
    json_folder = "D:/DayDayUP/Eco_data/ShuJuJi/tif_google"
    output_folder = "D:/DayDayUP/Eco_data/ShuJuJi/tif_label"  # 修改为保存 TIFF 的文件夹
    
    # 获取文件夹内所有后缀为.json的文件列表
    json_files = [f for f in os.listdir(json_folder) if f.endswith(".json")]
    
    # 遍历每个JSON文件
    for json_file_name in json_files:
        print(f"Processing {json_file_name}...")
        json_file_path = os.path.join(json_folder, json_file_name)
    
        # 1. 读取JSON文件
        with open(json_file_path, 'r') as json_file:
            data = json.load(json_file)
    
        # 2. 获取原始 TIFF 文件的路径(假设原始 TIFF 文件和 JSON 文件同名且在同一文件夹下)
        original_tiff_path = os.path.join(json_folder, json_file_name.replace(".json", ".tif"))  # 替换为实际路径
        print(f"Original TIFF Path: {original_tiff_path}")
    
        # 3. 使用GDAL打开原始 TIFF 文件获取地理信息
        original_dataset = gdal.Open(original_tiff_path)
        if original_dataset is None:
            print("Error: Unable to open the original TIFF file.")
            continue
    
        original_geotransform = original_dataset.GetGeoTransform()
        original_projection = original_dataset.GetProjection()
    
        # 4. 获取图像的高度和宽度
        image_height = data['imageHeight']
        image_width = data['imageWidth']
    
        # 5. 创建一个大小与图像高度和宽度相匹配的全零灰度图像
        gray_image = np.zeros((image_height, image_width), dtype=np.uint8)
    
        # 6. 遍历JSON数据并将多边形区域设置为相应的值
        for shape in data['shapes']:
            label = shape['label']
            points = shape['points']
            points = np.array(points, dtype=np.int32)
    
            # 根据不同的标签值设置不同的灰度值
            if label == 'b0':  # b0改成你的标签输入的类名(人工林地)
                cv2.fillPoly(gray_image, [points], 1)  # 将多边形区域设置为值为1
            elif label == 'b1':  # b1改成你第二个的标签类名(原生林地)
                cv2.fillPoly(gray_image, [points], 2)  # 将多边形区域设置为值为2
            # 添加其他标签的处理逻辑,根据需要设置不同的灰度值
    
        # 7. 生成文件名并保存灰度图像
        output_file_name = json_file_name.replace(".json", "_label.tif")  # 修改为保存 TIFF 文件
        output_file_path = os.path.join(output_folder, output_file_name)
        print(f"Output TIFF Path: {output_file_path}")
    
        # 8. 创建一个具有地理信息的 TIFF 文件
        driver = gdal.GetDriverByName('GTiff')
        dataset = driver.Create(output_file_path, image_width, image_height, 1, gdal.GDT_Byte)
    
        # 9. 设置地理信息(使用原始 TIFF 文件的地理信息)
        dataset.SetGeoTransform(original_geotransform)
    
        # 10. 设置投影信息
        dataset.SetProjection(original_projection)
    
        # 11. 将灰度图像数据写入 TIFF 文件
        band = dataset.GetRasterBand(1)
        band.WriteArray(gray_image)
    
        # 12. 关闭数据集
        band = None
        dataset = None
        original_dataset = None
    
        print("Processing complete.\n")
    四、遇见问题
1、谷歌影像与哨兵影像是否为同一时期,是否完全相同,谷歌影像的标签是否真的可以用作哨兵影像的标签?

答:下载了相同时期的谷歌影像,经对比二者一致,

2、谷歌影像如何下载?

答:教你如何轻松下载指定区域谷歌影像_哔哩哔哩_bilibili

3、anylabeling是什么?如何用?

答:如何制作遥感深度学习标签&样本(3)-_那咋办嘛-稍后再看-哔哩哔哩视频 (bilibili.com)

4、GDAL包如何下载?

答:GDAL不同于普通的包,可能直接用命令会报错,要求你下载与之匹配的Visual Studio 2019,如果报错的话,可以从anaconda中下载,结果是一样的。GDAL包是设置地理信息的关键。

5、代码报错ERROR 1: PROJ: proj_create_from_name: Cannot find proj.db?

答:网上找到的解决方式大多是手动下载包到虚拟环境,配置一句环境就可以,但是我试过并不行,这里找到一种真的灵的方法:

将下载的proj文件从运行环境中复制到可执行项目所在的目录,然后在项目运行目录中添加运行挂钩,也就是新建py文件hook.py,代码如下:

import os
import sys

os.environ['PROJ_LIB'] = os.path.dirname(sys.argv[0])

在上面代码中添加:

runtime_hooks = ['hook.py']

运行即可。

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值