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.mzph.cn/diannao/8969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离开大厂创业一年,从未受过这么大的打击!

大家好&#xff0c;我是程序员鱼皮。时间过得真快呀&#xff0c;转眼间我从腾讯出来、自主创业竟然已经整整一年了&#xff01;上周末也带团队同学们搞了场公司周年庆团建。 我自己是一个很喜欢、也很注重复盘总结的人&#xff0c;这么重要的时间&#xff0c;当然要对过去的一…

预测市场?预测股票?如何让预测有更高的准确率?

我们发现在足球赛中&#xff0c;只要知道一个简单的讯息&#xff08;主队过去的获胜机率超过一半&#xff09;&#xff0c;预测力就会明显好过随便乱猜。如果再加上第二个简单的讯息&#xff08;胜负纪录较佳的队伍会略占优势&#xff09;&#xff0c;可以再进一步提升预测力。…

Centos固定静态ip地址

这里我用的是Vmware虚拟机搭建的三台机器 进入 cd /etc/sysconfig/network-scripts然后使用 ip addr命令&#xff0c;查看自己虚拟机的以太网地址。 我这里是ens33 上面的第一个选项是本地环回地址&#xff0c;不用管它 然后查看刚刚进入的network-scripts目录下的文件 找到…

ChatPPT开启高效办公新时代,AI赋能PPT创作

目录 一、前言二、ChatPPT的几种用法1、通过在线生成2、通过插件生成演讲者模式最终成品遇到问题改进建议 三、ChatPPT其他功能 一、前言 想想以前啊&#xff0c;为了做个PPT&#xff0c;我得去网上找各种模板&#xff0c;有时候还得在某宝上花钱买。结果一做PPT&#xff0c;经…

【回溯算法】【Python实现】TSP旅行售货员问题

文章目录 [toc]问题描述回溯算法Python实现时间复杂性 问题描述 给定一组城市和它们之间的距离矩阵&#xff0c;找到一条距离最短的路径&#xff0c;使得旅行商从一个城市出发&#xff0c;经过所有城市恰好一次&#xff0c;并最终回到出发城市 回溯算法 旅行售货员问题的解空间…

2.1初识Spark

Spark于2009年诞生&#xff0c;最初是加州大学伯克利分校的研究项目。2013年加入Apache孵化器项目&#xff0c;2014年成为Apache顶级项目。Spark以内存内运算技术为核心&#xff0c;包含多个计算框架&#xff0c;成为大数据计算领域的后起之秀&#xff0c;打破了Hadoop的基准排…

域名系统(DNS)、DNS 服务器和 IP 地址概念解释

​  域名系统、DNS服务器和IP地址是构成互联网基础设施的重要部分。它们共同协作&#xff0c;使得人们能够方便地使用各种网络服务&#xff0c;而无需去记住复杂的数字地址。那么&#xff0c;域名系统、DNS 服务器和 IP 地址又该如何理解?本文主要讲讲关于这几个名词的概念解…

自己动手实现BatchNorm(pytorch实现)

BatchNorm可以加速模型的收敛并且缓解梯度消失问题&#xff0c;是深度学习领域常用的一个技术 最近仔细学习了BatchNorm的原理&#xff0c;因此想自己动手实现一下它&#xff0c;加深理解 代码如下&#xff1a; import torch import torch.nn as nnclass MyBatchNorm(nn.Mod…

多线程使用说明

一、如何创建多线程 1、继承Thread类 如果调用run方法&#xff0c;相当于还是只有一条main线程&#xff0c;会把run的线程当成一条普通对象&#xff0c;如下&#xff0c;t会执行完再往下执行&#xff0c;这样t就不是一个线程类&#xff0c;而是一个普通的对象&#xff0c;所以必…

作文笔记9 修辞手法

反问 加强XX语气 强调XX情感 难道我不拿充电器你就不能用电脑了吗&#xff1f; 一般里面带有双重否定 设问 引发读者兴趣 我真的爱她吗&#xff1f;爱个屁 对比 给人鲜明形象和强烈感受 XX同学总是主动问老师有什么作业&#xff1b;而YY同学总是被老师提醒写作业。 排比…

Python网络编程 03 实验:FTP详解

文章目录 一、小实验FTP程序需求二、项目文件架构三、服务端1、conf/settings.py2、conf/accounts.cgf3、conf/STATUS_CODE.py4、启动文件 bin/ftp_server.py5、core/main.py6、core/server.py 四、客户端1、conf/STATUS_CODE.py2、bin/ftp_client.py 五、在终端操作示例 一、小…

Linux系统入侵排查(三)

前言 对我处在学生时期的我来说,目前web渗透还是为主,但是还是需要对于蓝队相关的应急响应,等保测评等还是需要有一定的了解的,攻防兼备才能越站越勇嘛,linux入侵排查也能够让我更加熟悉liunx命令,本篇博文紧接上一篇博文开始进行. 为什么要做系统入侵排查 当企业发生黑客入…

2024华为数通HCIP-datacom最新题库(变题版)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 H1…

本地搭建springboot服务并实现公网远程调试本地接口

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

HTML5 Canvas发光Loading动画源码

源码介绍 之前我们分享过很多基于CSS3的Loading动画效果&#xff0c;相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的&#xff0c;整个loading动画是发光3D的视觉效果&#xff0c;HTML5非常强大。 …

8.删除有序数组中的重复项 II

文章目录 题目简介题目解答解法一&#xff1a;双指针&#xff08;快慢指针&#xff09;代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 删除有序数组中的重复项 II 相关的讲解&#xff01;&#x1f600; 题目简介 题目解…

学习100个Unity Shader (17) --- 深度纹理

文章目录 效果shader部分C# 部分理解参考 效果 shader部分 Shader "Example/DepthTexture" {SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _CameraDepthTexture;struct a2v{float4 pos : POSITIO…

20个硬核Python脚本

整理了一个覆盖面比较广泛的Python脚本示例&#xff0c;涉及到机器学习、数据处理、还有算法er可能会遇到自己写后台的一些案例。 另外&#xff0c;每个模块底部提供了对于官网文档&#xff0c;更加方便的查询具体的使用方法。 内容由简到难&#xff0c;如果对你有帮助的话希…

运行时数据区-基础

运行时数据区-基础 为什么学习运行时数据区Java内存区域&#xff08;运行时数据区域&#xff09;和内存模型&#xff08;JMM&#xff09; 区别组成部分&#xff08;jdk1.7 / jdk1.8&#xff09;从线程隔离性分类与类加载的关系每个区域的功能参考文章 为什么学习运行时数据区 …

在安卓应用中实现Socket通信:创建服务端和客户端

介绍&#xff1a;本文主要介绍在安卓中使用Socket创建服务端和客户端进行通信&#xff0c;服务端可以管理多个客户端连接&#xff0c;完善的异常处理&#xff0c;接口回调&#xff0c;可以满足大部分需求&#xff0c;更多功能自行拓展… 关于Socket套接字&#xff1a; 是网络上…