MATLAB批量读取航摄相片EXIF信息和GNSS信息以及MATLAB批量经纬度坐标转换空间直角坐标
前言
没有前言,创作不易,希望家人们点点赞,如有错误评论留言,感谢支持!
文章目录
- 前言
- 一、MATLAB批量读取航摄相片的EXIF信息,并批量提取其GNSS经纬度信息
- (1)前述:
- (2)代码实现和结果:
- 二、地理经纬度坐标转空间直角坐标原理及公式
- (1) 转换原理
- (2) 转换公式
- 三、利用MATLAB批量转换坐标
- 四、根据外部工具验证其转换精度
- (1)利用pix4D的航线报告与MATLAB转换后绘制的航线比较
- (2)利用坐标转换COORD软件转换后与MATLAB转换后的结果比较
一、MATLAB批量读取航摄相片的EXIF信息,并批量提取其GNSS经纬度信息
(1)前述:
所谓航摄相片的EXIF信息,就是 (可交换图像文件格式)(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。下图分别是航摄图片的详细属性信息以及在matlab中读取的结果。
图1 图片属性信息 | 图2 MATLAB显示 |
GNSS经纬度信息就是BLH(纬度,经度,大地高),我们在图片的详细信息可以看见,而在matlab中读取之后字段名分别为BLH(GPSLatitude,GPSLongitude,GPSAltitude)
(2)代码实现和结果:
1: 代码思路: (批量的航摄相片===>matlab读取每张相片EXIF信息===>读取EXIF信息的GNSS经纬度坐标===>经纬度的度分秒转换为度===>导出保存为xls文件。)
2:程序清单:
(1) dir函数----格式:a=dir(‘filename’ , ‘*.txt / *.jpg / *.tiff’ ) 其表示将盘定位到你存放文件的文件里面,会列举出你指定问filename路径下的固定格式的文件,我下面的代码是由于我将相片文件放在和程序运行保存的文件夹里面,所以没有fliename
(2) imfinfo函数----格式:a=imfinfo(‘filename’) 其用于读取图片的文件信息,相同用法的还有exifread函数
(3) xlswrite函数----格式:xlswrite(’ filename+名字.xls ’ , 变量名) 用于将变量里面的内容保存为xls表格输出
clc;
clear all;
data=dir('*.JPG');
m=[];
n=[];
%data.name表示相片的全名,用m集合储存; data.folder表示相片所在文件夹的位置,用n集合储存
for i=1:length(data)m_data=data(i).name;folder=data(i).folder;m=[m;m_data];n=[n;folder];
end
%利用imfinfo函数循环读取每一张相片的exif信息
GNSS=[];
for j=1:length(data)GNSS_data=imfinfo([n(j,:),'\',m(j,:)]);%这里的imfinfo('filename'),这里的filename就是第j张相片的文件夹的位置+ \ +第j张相片的全名GNSS=[GNSS;GNSS_data];
end
%将exif信息中的GPS信息赋值给GNSS_data,依次读取其经纬度坐标
E=[];
N=[];
H=[];
for k=1:length(data)GNSS_data=GNSS(k,:).GPSInfo;E_data=GNSS_data.GPSLatitude;N_data=GNSS_data.GPSLongitude;H_data=GNSS_data.GPSAltitude;E=[E;E_data];N=[N;N_data];H=[H;H_data];
end
%注意由于相片经纬度坐标的组织形式,因此读取的经纬度的度分秒以矩阵形式存在
%将度分秒转换为度为单位
EAST=E(:,1)+E(:,2)/60+E(:,3)/3600;
NORTH=N(:,1)+N(:,2)/60+N(:,3)/3600;
image_GNSS=[EAST,NORTH,H];
%保存转换后的坐标为xls
xlswrite('C:\Users\稳魂\Desktop\GNSS.xls',image_GNSS);
我们将程序提取保存后的经纬度的表格打开,可以看见明显的BLH格式。
二、地理经纬度坐标转空间直角坐标原理及公式
(1) 转换原理
我国的参心坐标系可以分为参心大地坐标系和参心空间直角坐标系;参心大地坐标系的坐标元素是BLH(也就是我们常见的经纬度坐标)而参心空间直角坐标系的坐标元素是XYZ(注意不是笛卡尔坐标系,xy的方向是反的),他们的原点都是参考椭球的原点。
图1 参心大地坐标系 | 图2 参心空间直角坐标系 |
而其转换原理就是将两个坐标系上的同名点投影到点所在的子午平面上,建立对应的数学关系,进行转换。
(2) 转换公式
我们设A点的大地坐标(B,L,H)以及对应的空间直角坐标(X,Y,Z)以及下面的一系列参数:
椭球基准:西安80坐标系
参考椭球长半轴:a=6378140±5(m)
参考椭球短半轴:b=6356755.2882(m)
过A点的卯酉圈曲率半径:
参考椭球的第二偏心率:
公式:
三、利用MATLAB批量转换坐标
2:程序清单:
(1) importdata函数—格式:a=imortdata(‘filename’) 用于读取表格以及文本格式文件
(2) format long g:用于关闭数据科学计数法显示
clc;
clear all;
%利用importdata函数读取上一个程序保存的GNSS经纬度表格
BLH_data=importdata('C:\Users\稳魂\Desktop\GNSS.xls');
B=BLH_data(:,1);
L=BLH_data(:,2);
H=BLH_data(:,3);
a=6378140;
b=6356755.2882;
e2=(a^2-b^2)/(a^2);
NN=[];
format long g;
for i=1:length(BLH_data)N=a/((1-e2*(sind(B(i,:)).^2)).^0.5);NN=[NN;N];
end
XX=[];
YY=[];
ZZ=[];
for j=1:length(BLH_data)X=((NN(j,:)+H(j,:)).*cosd(B(j,:)).*cosd(L(j,:)));Y=((NN(j,:)+H(j,:)).*cosd(B(j,:)).*sind(L(j,:)));Z=((NN(j,:).*(1-e2)+H(j,:)).*sind(B(j,:)));XX=[XX;X];YY=[YY;Y];ZZ=[ZZ;Z];
end
XYZ=[XX,YY,ZZ];
figure;
xlswrite('C:\Users\稳魂\Desktop\XYZ.xls',XYZ);
四、根据外部工具验证其转换精度
根据上述转换后的坐标数据,绘制其这一组航摄相片的航线图
plot(XX,YY,'--gs',...'LineWidth',2,...'MarkerSize',3,...'MarkerEdgeColor','r',...'MarkerFaceColor',[1,0.5,0.5]);
xlim([-1517450 -1517150]);
ylim([5268200 5268340]);
xlabel('Y',"Color",'r');
ylabel('X',"Color",'r');
title('该航摄相片组的航线','color','r');
grid on;
(1)利用pix4D的航线报告与MATLAB转换后绘制的航线比较
需要注意的是我在pix4D中选用的WGS 84 UTM 48N的平面投影,是经纬度与平面坐标之间的转换
而我计算的经纬度与空间直角坐标之间的转换,所以航线会有差别,这里只为了做参考。
图1 MATLAB绘制的航线 | 图2 pix4D质量报告的航线 |
(2)利用坐标转换COORD软件转换后与MATLAB转换后的结果比较
我们抽取第一张相片的经纬度利用坐标转换软件转换后与matlab转换后的结果比较,转换精度还可以,至于毫米级之后的精度,是因为西安80椭球参数长半轴a=6378140±5(m),我直接省略了±5,所以各位可以自行选用。
图1 COORD软件 | 图2 MATLAB |
MATLAB批量读取航摄相片EXIF信息和GNSS信息以及MATLAB批量经纬度坐标转换空间直角坐标相关推荐
- python批量提取word指定内容_使用python批量读取word文档并整理关键信息到excel表格的实例...
目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...
- python批量提取word指定内容到excel_(转)用python批量读取word文档并整理关键信息到excel表格...
目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...
- matlab经纬度画轨迹图_MATLAB将经纬度坐标转换成直角坐标
代码如下 % 从northEastChina20文本中读取经纬度坐标及台站名,该文件中存放格式为三列,第一列是经度,第二列是纬度,第三列是台站名的三个字母缩写 [lon,lat,sta]=text ...
- matlab文件名批量读取dat文件,matlab批量读取dat
matlab如何生成数据dat文件_数学_自然科学_专业资料.第一种方法:sav... matlab中读取txt中数据 2页 1下载券 MATLAB读取文本格式数据 21页 1下载券 用Matlab读 ...
- python导入txt为dataframe-python批量读取txt文件为DataFrame的方法
我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...
- 纯 python 开发批量读取照片 Exif 信息的小程序
自己动手写一些小程序解决工作中的问题,是学习 python 的高效途径.这中间会遇到一些不动手想不到的问题,一个一个地解决它们,你 python 开发水平就会突飞猛进! 本文总结一下实战 python ...
- python批量修改图片的exif信息,增加GPS信息。
有时候需要给图片增加地理信息,比如在用无人机影像做3维建模或者正射影像时,可以将无人机的gps写入图片,然后用ODM快速完成三维模型与正射影像生成. ODM的使用方法可以参看下面这篇博客. h ...
- [转]数码照片的JPG文件高级信息(用C#读取图片的EXIF信息)
[转]数码照片的JPG文件高级信息(用C#读取图片的EXIF信息) 数码相机的照片很多,而且文件名也不直观,所以写了个程序批量改名,就是把文件名都改成相机的拍照日期,呵呵,谁知道拍照日期不是那么好取, ...
- MATLAB 批量读取NC文件并转为TIF文件
因为课题处理30年的降雨和蒸发的遥感资料(.NC格式),而想要在Arcgis中处理要求的是raster格式的,所以需要批量转化为tif文件,所以在此分享自己改编之后的代码,可以简洁明了的实现这个过程: ...
最新文章
- Android中级篇之百度地图SDK v3.5.0-百度地图定位[超详细图解定位基础]
- python脚本自动发邮件功能
- .net讀取指定節點的值
- 074_html5音频
- CTFshow 命令执行 web57
- linux 编译src.rpm,CentOS6.5下编译src.rpm包的内核
- XCode5.1.1怎样实现代码块自己主动排版
- [吴恩达机器学习笔记]14降维3-4PCA算法原理
- MOSS中删除绑定到List上的Eventhandler
- Syncovery for mac(文件备份和同步工具)
- ab st语言编程手册_罗克韦尔ab plc micrologix 1400 编程手册中文高清版 .pdf
- Oracle项目管理系统之合同控制概述
- 如何用ps做一个魔法棒
- word中怎么把脚注转换为尾注
- 【django】如何获取字段最大值,最新的记录
- 献给那些没有自信的人。
- 商务网站建设与维护【11】
- 【CSS】grid和flex
- tch-rs指南 - Tensor的基本操作
- 最近被刷屏的这道小学数学题,你怎么看?
热门文章
- 使用OpenLayers根据经纬度对地图进行单个标点,以及点击标点弹框的实现(没有从后台获取经纬度数据)
- 将一个整数分解为质数的乘积的实现方式
- 验证boost是否安装成功
- 让工程师沉思的68个经典小故事
- Linux请求调页技术,linux零页技术.doc
- 世界杯小组赛频繁爆冷?这或许是强队的谋略 一分钟带你了解2022卡塔尔世界杯赛制
- riak数据库php7,Riak (Engine)
- Easy Connect无法连接的情况,当前IE代理启用了自动配置脚本,不允许使用CS客户端登录
- mac电脑解压缩报错:错误22 无效的参数
- 微信支付找不到sdk