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

相关文章

hevc和H.264格式的区别

HEVC(High Efficiency Video Coding)和H.264(也称为Advanced Video Coding,AVC)都是视频压缩标准,但它们之间存在一些显著的区别,主要集中在压缩效率、资源需求和兼容性方面。 压缩效率 HEVC,也被称为H.265,提供了比H.264更高的压缩效率。这意味着在相同的视频质量下,HEVC能够以大约一半的比特率进行编码,从而减少存储空间需求和

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

BD错误集锦8——在集成Spring MVC + MyBtis编写mapper文件时需要注意格式 You have an error in your SQL syntax

报错的文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yuan.dao.YuanUserDao"><!

el-upload 上传图片及回显照片和预览图片,文件流和http线上链接格式操作

<div v-for="(info, index) in zsjzqwhxqList.helicopterTourInfoList" :key="info.id" >编辑上传图片// oss返回线上地址http链接格式:<el-form-itemlabel="巡视结果照片":label-width="formLabelWidth"><el-upload:action="'http:

【Unity Shader】片段着色器(Fragment Shader)的概念及其使用方法

在Unity和图形编程中,片段着色器(Fragment Shader)是渲染管线中的一个阶段,负责计算屏幕上每个像素(片段)的颜色和特性。片段着色器通常在顶点着色器和任何几何处理之后运行,是决定最终像素颜色的关键步骤。 Fragment Shader的概念: 像素处理:片段着色器处理经过顶点着色器和几何着色器处理后,映射到屏幕空间的像素。颜色计算:它计算每个像素的颜色值,这可能包括纹理采样、光

【Unity Shader】Alpha Blend(Alpha混合)的概念及其使用示例

在Unity和图形编程中,Alpha Blend(也称为Alpha混合)是一种用于处理像素透明度的技术。它允许像素与背景像素融合,从而实现透明或半透明的效果。Alpha Blend在渲染具有透明度的物体(如窗户、玻璃、水、雾等)时非常重要。 Alpha Blend的概念: Alpha值:Alpha值是一个介于0(完全透明)和1(完全不透明)的数值,用于表示像素的透明度。混合模式:Alpha B

标准分幅下的图幅号转换成经纬度坐标【原理+源代码】

最近要批量的把标准分幅下的图幅号转换成经纬度坐标,所以这两天写了个程序来搞定这件事情。 先举个例子说明一下这个程序的作用。 例如:计算出图幅号I50G021040的经纬度范围,即最大经度、最小经度、最大纬度、最小纬度。 运用我编写的这个程序,可以直接算出来,这个图幅号的经纬度范围,最大经度为115.3125°,最小经度为115.25°,最大纬度为31.167°,最小纬度为31.125°。

PHP生成csv格式Excel,秒级别实现excel导出功能

防止报超内存,兼容中文,兼容科学技术法。 爽。。。。很爽。。。。 /*** 告诉浏览器下载csv文件* @param string $filename*/public static function downloadCsv($data, $filename, $encoding = 'utf-8'){header("Content-type: text/csv");header("Conten

PHP 读取或生成大的Excel

场景,在很多情况下,需要读取Excel文件。 常用的有PHPExcel包或者使用 maatwebsite/excel 包 但是使用这个包读取或生成excel,如果excel文件过大,很容易出现超内存情况。 解决方法: 上传:要求上传者使用.csv 文件上传。然后使用php自带的 fgetcsv()函数来读取文件。http://php.net/manual/zh/function.fgetc

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存