Unity读取GDAL格式航拍图的经纬度,高程,像素值

2024-05-07 14:36

本文主要是介绍Unity读取GDAL格式航拍图的经纬度,高程,像素值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        最近在做一个项目:依赖大疆航拍数据,在应用中渲染航拍图片,并获取每个点位的经纬高。

        gdal解析工具:https://www.gisinternals.com/query.html?content=filelist&file=release-1930-x64-gdal-3-6-3-mapserver-8-0-0.zip

        资源分析:

        大疆航拍图是分片的,可以用大疆公司工具,导出整合数据,我们需要用到其中两个资源:

        1.result.tif  这个资源包含所有像素的经纬度和像素信息

        2.dsm.tif 这个资源包含所有的高程信息

        一、项目分解一下需要实现三个功能:

        1.1.获取像素信息用来渲染图片

        1.2.获取经纬度信息

        1.3.获取高程信息

        二、需要解决的难题:        

        2.1.像素值太大,需要分片渲染

        2.2.数据太大,读取速度太慢

        2.3 精度如何

        

1.1 获取像素信息

读取文件:result.tif

//注册gdal
Gdal.AllRegister();//读取result。tif文件
var dataset = Gdal.Open(sourcePath, Access.GA_ReadOnly);//图片像素
var RasterXSize = dataset.RasterXSize;
var RasterYSize = dataset.RasterYSize;Band band1 = dataset.GetRasterBand(1);
Band band2 = dataset.GetRasterBand(2);
Band band3 = dataset.GetRasterBand(3);

band1、band2、band3分别用来读取像素的rgb值

Color[] RGBData = new Color[width * height];var bufR = new double[width * height];
band1.ReadRaster(startX, startY, width, height, bufR, width, height, 0, 0);var bufG = new double[width * height];
band2.ReadRaster(startX, startY, width, height, bufG, width, height, 0, 0);var bufB = new double[width * height];
band3.ReadRaster(startX, startY, width, height, bufB, width, height, 0, 0);for (int i = 0; i < height; i++)
{for (int j = 0; j < width; j++){var y = i;var x = j;int index = y * width + x;var valueR = (byte) bufR[index];var valueG = (byte) bufG[index];var valueB = (byte) bufB[index];RGBData[(height - i - 1) * width + j] = new Color32(valueR, valueG, valueB, 1);}
}texture.SetPixels(RGBData);
texture.Apply();

        用此方法读取从startX、startY到 startX + width、startY + height的像素值,每一片宽高我设置的是2048,可以根据机器性能适当调整。

        最后将读取的像素保存到Texture2D中,按顺序渲染就可以了。

1.2 获取经纬度信息

读取文件:result.tif

//获取经纬度信息
dataset.GetGeoTransform(ori_transform);//GeoTransform[0],左上角横坐标(应该是投影坐标)
//GeoTransform[2],行旋转
//GeoTransform[1],像元宽度(影像在水平空间的分辨率)
//GeoTransform[3],左上角纵坐标(应该是投影坐标)
//GeoTransform[4],列旋转
//GeoTransform[5],像元高度(影像在垂直空间的分辨率)var lonMin = ori_transform[0];
var lonMax = ori_transform[0] + (RasterXSize * ori_transform[1]);
var latMax = ori_transform[3];
var latMin = ori_transform[3] + (RasterYSize * ori_transform[5]);

无人机拍摄时,保证正北方向是图片y轴方向,行旋转和列旋转就可以忽略不用计算。

将图片渲染之后,获取到点击位置所在图片中的比例,就可以计算出经纬度了

var rate = GetRateByPoint(point);var xSize = rate.x * RasterXSize;
var ySize = rate.y * RasterYSize;var lon = lonMin + ori_transform[1] * xSize;
var lat = latMax + ori_transform[5] * ySize;var gps = new Gps(lat, lon, 0);

1.3 获取高程

读取文件dsm.tif,读取过程和获取像素类似,高程保存在band1里面

band1.ReadRaster(x, y, 1, 1, bufH, 1, 1, 0, 0);

将高程填入gps的海拔就可以了

2.1 像素值太大,需要分片渲染

在1.1中,已经按分片读取处理了;实测航拍图有十几公里的时候,如果不分片,占用内存会超过10G,普通电脑难以运行起来,分片之后及时清理内存就可以适配大部分设备了

2.2 数据太大,读取速度太慢

我的解决方案是将分片读取的像素保存到本地外存中,dataset中的数据也保存到本地,在一次读取之后,再次运行时,值读取本地的分片图和配置文件就可以了,无需再解析gdal数据,速度会快几十倍。

2.3 精度如何

经过实地测量验证,精度误差小于1cm

这篇关于Unity读取GDAL格式航拍图的经纬度,高程,像素值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967628

相关文章

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现