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

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

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"] 每个类别标注的框数: