GDAL在Unity3D中的使用以及坐标转换

这是一篇记录帖,应届毕业生一枚,第一次写博客有点小紧张,有大神路过的话也希望帮忙看看对不对~

引言

本文的目的是用Unity读取tif图像数据的经纬度转换成Unity的坐标并放到对应的位置上

开发平台

vs2019+Unity2021.3.6

GDAL下载

首先解决Unity读取tif数据的问题,这里我用了GDAL来读取tif数据,相信有小伙伴不知道怎么配置GDAL,这里我就把我踩坑配置的方法说下。

首先去官网http://www.gisinternals.com/release.php下载Unity的GDAL ,(这里我参考了(2条消息) GDAL在Unity3D中的配置与测试(超详细!)_减肥的吉吉的博客-CSDN博客这位大佬的配置教学)没法科学上网没关系,在csdn上面也有很多GDAL可以下载,自行搜索下载就好。我这里用的是2.4.4版本,(GDAL—release-1911-x64-gdal-2-4-4-mapserver-7-4-3) ,这里不在过多描述导入的过程了。

GDAL使用

我们可以在start函数里面去测试一下导入是否成功,path就是你存放tif的路径,我们这里的w和h就是图片的宽和高。

 如果打印成功了也就证明你导入成功了,可以开始下面步骤了。

新建一个double类型数组,用来储存读取tif时候的数据。

然后利用GDAL的API来进行读取。

该Api会存放给你6个值,这6个值代表了不同的意义,如图下。

0 和3代表经度和纬度,也就是你读取影像的左上角的经纬度,1代表遥感图像的水平空间分辨率,5代表遥感图像的垂直空间分辨率,一般相等。如果遥感图是正的话没有发生偏转,2和4就是0。

我们可以按照图上的点算出对应点的对应地理坐标,(参考(2条消息) Gdal中GetGeoTransfrom的含义_alexsci的博客-CSDN博客_getgeotransform这位大佬)

如果行数和列数分别为row,column;

xGeo = geoTransform[0] + column * geoTransform[1] + row * geoTransform[2]
yGeo = geoTransform[3] + column * geoTransform[4] + row * geoTransform[5]

我们就可以求出点的四个边角的经纬度了,从而能求出中点的经纬度

把经纬度带到经纬度转3d坐标的方法中即可。

分割线————————————————————————————————

经纬度转世界坐标:

网上有这方面的代码,大家可以自行CV,如果你懒的话当我没说。我这里是翻译的python经纬度转3d坐标的代码。

public class Cartesian3{public double x = 0;public double y = 0;public double z = 0;Transform3D tan = new Transform3D();public Cartesian3(double x = 0, double y = 0, double z = 0){this.x = x;this.y = y;this.z = z;}public void print(){Console.Write($"{x}");}}#endregionpublic class Transform3D {public Transform3D(){}/// <summary>/// 度转角度/// </summary>/// <param name="degrees">十进制度/param>/// <returns>弧度</returns>public double ToRadians(double degrees){return degrees * (Math.PI / 180.0);}/// <summary>/// 向量求模/// </summary>/// <param name="cartesian"></param>/// <returns></returns>public double MagnitudeSquared(Cartesian3 cartesian){return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z;}/// <summary>/// 模的平方/// </summary>/// <param name="cartesian"></param>/// <returns></returns>public double Magnitude(Cartesian3 cartesian){return Math.Sqrt(MagnitudeSquared(cartesian));}public Cartesian3 Normalize(Cartesian3 cartesian, Cartesian3 result){double ma = Magnitude(cartesian);result.x = cartesian.x / ma;result.y = cartesian.y / ma;result.z = cartesian.z / ma;return result;}public Cartesian3 MultiplyComponents(Cartesian3 left, Cartesian3 right, Cartesian3 result){result.x = left.x * right.x;result.y = left.y * right.y;result.z = left.z * right.z;return result;}public double dot(Cartesian3 left, Cartesian3 right){double result = left.x * right.x + left.y * right.y + left.z * right.z;return result;}public Cartesian3 DivideByScalar(Cartesian3 cartesian, double scalar, Cartesian3 result){result.x = cartesian.x / scalar;result.y = cartesian.y / scalar;result.z = cartesian.z / scalar;return result;}public Cartesian3 MultiplyByScalar(Cartesian3 cartesian, double scalar, Cartesian3 result){result.x = cartesian.x * scalar;result.y = cartesian.y * scalar;result.z = cartesian.z * scalar;return result;}public Cartesian3 Add(Cartesian3 left, Cartesian3 right, Cartesian3 result){result.x = left.x + right.x;result.y = left.y + right.y;result.z = left.z + right.z;return result;}/// <summary>/// 角度转世界坐标/// </summary>/// <param name="longitude"></param>/// <param name="latitude"></param>/// <param name="height"></param>/// <param name="result"></param>/// <returns></returns>public Cartesian3 FromRadians(double longitude, double latitude, double height){Cartesian3 result = new Cartesian3();Cartesian3 scratchN = new Cartesian3();Cartesian3 scratchK = new Cartesian3();Cartesian3 radiiSquared = new Cartesian3(6378.1370 * 6378.1370,//缩放1000倍6378.1370 * 6378.1370,6378.1370 * 6378.1370//6356752.3142451793 * 6356752.3142451793);double cosLatitude = Math.Cos(latitude);scratchN.x = cosLatitude * Math.Cos(longitude);scratchN.y = cosLatitude * Math.Sin(longitude);scratchN.z = Math.Sin(latitude);scratchN = Normalize(scratchN, scratchN); // 转换为单位向量scratchK = MultiplyComponents(radiiSquared, scratchN, scratchK);double gamma = Math.Sqrt(dot(scratchN, scratchK));scratchK = DivideByScalar(scratchK, gamma, scratchK);scratchN = MultiplyByScalar(scratchN, height, scratchN);return Add(scratchK, scratchN, result);}public Cartesian3 FromDegrees(double longitude, double latitude, double height = 0){longitude = ToRadians(longitude);latitude = ToRadians(latitude);return FromRadians(longitude, latitude, height);}}

tif数据84坐标经纬度转Unity3D坐标相关推荐

  1. 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版...

    转自:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标.百度坐标.WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版 火星坐标 ...

  2. 【转】火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版...

    原文地址:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地 ...

  3. 【GIS - 地理信息系统】WGS 84 坐标系和 GCJ-02 坐标加密偏移 ( 大地坐标系 和 加密坐标系 | WGS 84 坐标体系简介 | GCJ-02 坐标加密偏移 )

    文章目录 一.WGS 84 坐标系和 GCJ-02 坐标加密偏移 1.大地坐标系 和 加密坐标系 大地坐标系 加密坐标系 2.WGS 84 坐标体系简介 坐标加密 WGS 84 由来 经度和纬度 WG ...

  4. vue 编写H5页面在公众号外部获取手机本地坐标经纬度

    1.必须先注册个公众号,且认证后去下面这个地方配置好您的域名这仨地方都得设置,目前我试了下用域名还是用具体项目所在的文件夹目录没什么明显差异 譬如你是用shuzhiqiang.com或者shuzhiq ...

  5. 数据增强之图像旋转及坐标对应(附代码)

    海康威视研究院ImageNet2016竞赛经验分享 深度学习之图像的数据增强 data augmentation 数据增强方法总结 图片的数据增强(Data Augmentation)方法 openc ...

  6. 百度地图经纬度和像素坐标互转

    百度地图经纬度和像素坐标互转 1.经纬度转像素坐标 // 投影实例 const projection = map.getMapType().getProjection()// 地图div宽高 cons ...

  7. 根据地址获取坐标经纬度

    根据地址获取经纬度坐标 根据地址获取坐标经纬度 根据地址查经纬度坐标 目标:根据提供的一串地址的文字描述,查出此地址对应的经纬度. 例如你要查询『北京市西城区西长安街2号 』或『国家大剧院』的坐标. ...

  8. WGS84经纬度坐标与北京54坐标或者…

    WGS84经纬度坐标与北京54坐标或者西安80坐标的关系     一般来讲,GPS直接提供的坐标(B,L,H)是1984年世界大地坐标系(Word Geodetic System1984即WGS-84 ...

  9. php 经纬度坐标转换 WGS84、火星坐标 (GCJ-02)、百度坐标 (BD-09)

    项目有gps上报的功能, 由于前端插件问题导致大量gps定位数据转换百度坐标(BD-09)时产生极大偏移, 故需要后端做经纬度坐标转换, 看到一篇java的相关技术帖, 拿来做了修改 Ps: 坐标转换 ...

  10. java 经纬度坐标转换 WGS84、火星坐标 (GCJ-02)、百度坐标 (BD-09)

    会有偏移,但是还能接受 WGS84 国际标准,从 GPS 设备中取出的数据的坐标系 国际地图提供商使用的坐标系 火星坐标 (GCJ-02) 中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系 ...

最新文章

  1. 关于全国大学生智能汽车竞赛有关问题的建议
  2. PMCAFF微课堂 | 运营女神揭秘产品运营推广中的场景思维
  3. ajax callback 在什么时候运行
  4. 【CyberSecurityLearning 74】DC系列之DC-5渗透测试
  5. swift 可变參数
  6. 一文搞懂JAVA与GO垃圾回收
  7. 计算机准考证打印山东省招生教育,山东省教育招生考试院2020高考准考证打印入口:wsbm.sdzk.cn...
  8. 【Java】Java 的Object对象你真的懂了吗
  9. JavaScript数据结构——字典(Dictionary)
  10. Servlet+Jsp实现图片或文件的上传功能
  11. 老肖有话说:如期而至的Swarm新工具Crane开源解读
  12. c++11 function
  13. 【UIKit】UITableView 5
  14. 计算机专业基础820考什么,820计算机专业基础考纲
  15. CAD怎么统计图纸中的设备材料?
  16. spacy 名词性短语_使用spacy nlp进行词法化,词法化,停用词和短语匹配的快速指南...
  17. 计算机二级word安装包,是否有word 2010安装包,计算机二级需要,怎么安装不了呢?...
  18. 一种级联前后端实现方案
  19. 【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)
  20. 5分钟学会Linux上传文件和下载文件命令

热门文章

  1. codevs 切糕 网络流
  2. 反引号在linux中的作用
  3. WISP Client+AP WDS  的区别
  4. python 爬虫 一键爬取携程旅游团数据
  5. bilibili笔试题
  6. 不小心格式化硬盘,重新分区了硬盘的恢复方法
  7. Python自定义豆瓣电影种类,排行,点评的爬取与存储(基础)
  8. Android中图片压缩方式总结
  9. 面向对象:兜兜转转了很久,希望你恰好也在
  10. 我们不应歧视任何语言,她们都是萌娘!(有图有真相)