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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/595451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电商-虾皮】

电商-虾皮 ■ 人口分布■ 市场■ 欧美市场■ 东南亚市场 ■ ■ 人口分布 ■ 市场 ■ 欧美市场 亚马逊 ■ 东南亚市场 shopee ■

如何通过前端表格控件在10分钟内完成一张分组报表?

前言&#xff1a; 当今时代&#xff0c;报表作为信息化系统的重要组成部分&#xff0c;在日常的使用中发挥着关键作用。借助报表工具使得数据录入、分析和传递的过程被数字化和智能化&#xff0c;大大提高了数据的准确性及利用的高效性。而在此过程中&#xff0c;信息化系统能…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是&#xff1a; 每次按起键盘后&#xff0c;都将之前的定时器删除&#xff0c;重新开始计时。 节流 连续触发事件&#xff0c;只执行一次 …

【005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放】

005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放 文章目录 005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放创作背景MA120X0P输出模式BTLSEPBTLSEBTL 硬件配置方式/硬件Limiter限幅器限幅器作用过程 主要寄存器操作指令 ma120x0p.cma120x0p.h 创作背景 学历代表过去、能…

node应用部署运行案例

生产环境: 系统&#xff1a;linux centos 7.9 node版本&#xff1a;v16.14.0 npm版本:8.3.1 node应用程序结构 [rootRainYun-Q7c3pCXM wiki]# dir assets config.yml data LICENSE node_modules nohup.out output.log package.json server wiki.log [rootRainYun-Q7c…

Coursera: An Introduction to American Law 学习笔记 Week 06: Civil Procedure (完结)

An Introduction to American Law Course Certificate Course Introduction 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 06: Civil Pro…

伙伴匹配(后端)-- 组队功能

文章目录 需求分析数据库表设计基础接口开发系统设计及开发创建队伍业务逻辑细化业务层代码优化完成控制层 查询队伍列表业务逻辑vo层业务层代码接口代码 修改队伍信息业务逻辑同样在请求包里封装一个用户登录请求体接口修改业务实现类 用户可以加入队伍同样在请求包里封装一个…

电脑问题2【彻底删除CompatTelRunner】

彻底删除CompatTelRunner 电脑偶尔会运行CompatTelRunner造成CPU占用的资源非常大,所以这里要想办法彻底关闭他 本文摘录于&#xff1a;https://mwell.tech/archives/539只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 解决办法是进入W…

WinForm DataGridView 垂直滑动条显示异常

WinForm DataGridView的垂直滑动条不正常显示&#xff0c;当总行高超过控件高度&#xff08;控件高度为227及以下不会出现该问题&#xff09;时&#xff0c;右下角会出现一个灰框&#xff0c;因为表格控件位处TabControl下&#xff0c;当切换其他选项卡后再切回来时&#xff0c…

Python类方法探秘:从单例模式到版本控制

引言&#xff1a; 在Python编程中&#xff0c;类方法作为一种特殊的实例方法&#xff0c;以其独特的魅力在众多编程范式中脱颖而出。它们不仅提供了无需实例即可调用的便捷性&#xff0c;还在设计模式、版本控制等方面发挥着重要作用。本文将通过几个生动的示例&#xff0c;带您…

RS2057XH功能和参数介绍及规格书

RS2057XH 是一款由润石科技&#xff08;Runic Semiconductor&#xff09;生产的模拟开关芯片&#xff0c;其主要功能和参数如下&#xff1a; 产品特点&#xff1a; 低电压操作&#xff1a;支持低至1.8V的工作电压&#xff0c;适用于低功耗应用。 高带宽&#xff1a;具有300MHz的…

库存管理方法有哪些?

库存管理对于企业的成本控制、运营效率及市场竞争力至关重要。有效的库存管理能够确保生产连续、降低成本、提升效率&#xff0c;进而增强企业市场竞争力。本文旨在介绍几种主流的库存管理方法&#xff0c;包括高效利用仓库管理软件&#xff0c;定量库存管理法、定期库存管理法…

配电网变压器容量选择与变损计算方法及python简易实现

1. 配电网变压器容量选择方法 1.1. 配电网变压器容量选择方法 在选择变压器容量时&#xff0c;需要考虑的最大因素是负荷的峰值&#xff08;或称为最大需求&#xff09;&#xff0c;同时也要考虑变压器的效率、预期负载系数&#xff08;负载占额定容量的比例&#xff09;、以…

2024数维杯数学建模B题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

multipass launch失败:launch failed: Remote ““ is unknown or unreachable.

具体问题情况如下&#xff1a; C:\WINDOWS\system32>multipass launch --name my-vm 20.04launch failed: Remote "" is unknown or unreachable.​C:\WINDOWS\system32>multipass lsNo instances found.​C:\WINDOWS\system32>multipass startlaunch fail…

Linux 磁盘管理命令fdisk mount umount mkfs mkfs.ext2

文章目录 3.Linux 磁盘管理命令3.4 fdisk&#xff1a;磁盘分区案例练习 3.5 mount&#xff1a;挂载文件系统案例练习 3.6 umount&#xff1a;卸载文件系统案例练习 3.7 mkfs&#xff1a;建立各种文件系统案例练习 3.8 mkfs.ext2&#xff1a;建立一个 Ext2/Ext3 文件系统案例练习…

深度学习中的归一化:BN,LN,IN,GN的优缺点

目录 深度学习中归一化的作用常见归一化的优缺点 深度学习中归一化的作用 加速训练过程 归一化可以加速深度学习模型的训练过程。通过调整输入数据的尺度&#xff0c;归一化有助于改善优化算法的收敛速度。这是因为归一化后的数据具有相似的尺度&#xff0c;使得梯度下降等优化…

Redis - Zset 有序集合

前言 它保留了集合不能有重复成员的特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数&#xff08;score&#xff09;与之关联&#xff0c;有序集合中的元素是可以维护有序性的&#xff0c;但这个有序不是⽤下标作为排序依据⽽是…

数据分析师 医学spss数据分析,游程检验(Run Test)是一种非参数性统计假设的检验方法,也称为“连贯检验”,医学统计学

游程检验&#xff08;Run Test&#xff09;是一种非参数性统计假设的检验方法&#xff0c;也称为“连贯检验”。它是基于样本标志表现排列所形成的游程&#xff08;即连续出现相同数值的序列&#xff09;的多少进行判断的检验方法。游程检验主要用于两个独立样本的比较和观测结…

TC3xx MTU概述(1)

目录 1.MTU基本功能 2.MBIST 3.小结 1.MTU基本功能 在TC3xx中&#xff0c;MTU(Memory Unit Test)被用来管理控制芯片内部各种RAM的测试、初始化和数据完整性检查。 既然MTU主要是管理和控制&#xff0c;那干活的想必另有他人。所以在该平台中&#xff0c;我们可以看到SRAM…
最新文章