微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用gdal+Qt生成QGIS等常用地理信息软件支持的.vrt文件

1.前言

使用QGIS开源库打开“*.raw”裸数据时,需要裸数据的格式说明文件“*.vrt”,来间接打开裸数据,怎样根据现有的裸数据信息编写对应的“.vrt”文件,博主调研了两天的时间才算搞清楚,现在记录下来以备后用。


2.".VRT"文件格式讲解

在编写“.vrt”文件前,首先需要了解“.vrt”文件的具体格式,现给出李民录老师关于“.vrt”文件格式讲解的博文地址:

http://www.jb51.cc/article/p-hoadeife-tm.html

完整的“.vrt”文件格式如下所示

  1. <VRTDatasetrasterXSize="4800"rasterYSize="6000">
  2. SRS>GEOGCS["wgs84",DATUM["WGS_1984",SPHEROID["wgs84",6378137,298.257223563,AUTHORITY["epsg","7030"]],"6326"]],PRIMEM["Greenwich","8901"]],UNIT["degree",0.0174532925199433,"9122"]],"4326"]]</>
  3. GeoTransform>20,0.008333333333333,0.0,40,-0.008333333333333VRTRasterBanddataType="Int16"band="1"subClass="VRTRawRasterBand"SourceFilenamerelativetoVRT="0">D:/SRTM/e020n40.Bathymetry.srtmSourceFilenameImageOffset>0PixelOffset>2LineOffset>9600ByteOrder>MSBVRTRasterBandVRTDataset>
字段“SRS”是对裸数据影像的坐标系进行说明,字段“GeoTransform”是对裸数据影像的仿射变换系数进行说明,加上这两个字段就能够显示影像的经纬度信息;


2.1 字段“SRS”

看到一大堆的SRS值,当时我就蒙了,怎么填写、从哪里获取这么多的信息。后来调研得知,这一大堆的数据可以利用gdal中获取,具体的代码如下:

    OGRSpatialReference oSRS;
  1. oSRS.SetWellKNownGeogCS("wgs84");//设置坐标系
  2. oSRS.SetUTM(16);//设置投影区编号,全球共划分为60个投影区
  3. char* pszWKT = NULL;
  4. oSRS.exportToWkt(&pszWKT);


2.2 字段"GeoTransform"

字段“ GeoTransform”是指定影像的投影信息,可以根据影像四个顶点的经纬度信息计算出来,具体参数说明如下:

<GeoTransform>para1,para2,para3,para4,para5,para6</>

para1:投影X方向的坐标

para2:投影X方向的每个像素的分辨率

para3:投影X方向的旋转角度,一般为零

para4:投影y方向的坐标

para5:投影y方向的每个像素的分辨率

para6:投影X方向的旋转角度,一般为零

其余字段的含义可以参考李民录老师的博客讲解。


2.3 字段 "SourceFilename"

字段"SourceFilename"是在".vrt"文件中指定裸数据的存放位置:

属性relativetoVRT = 0:说明该路径为绝对路径

属性relativetoVRT = 1:说明该路径为相对路径,一般是裸数据与".vrt"文件在同一路径下;

SourceFilenamerelativetoVRT="0"D:/SRTM/e020n40.Bathymetry.srtmSourceFilename>


3.使用QT编写".vrt"文件

    QFile vrtFile("temp.vrt");
  1. if(vrtFile.open("qiodevice::ReadWrite"))
  2. {
  3. return;
  4. }
  5. //创建XML
  6. QDomDocument vrtDoc("vrt");
  7. vrtDoc.setContent(vrtFile);
  8. QString strHeader("version=\"1.0\" encoding=\"UTF-8\" ");
  9. vrtDoc.appendChild(vrtDoc.createProcessingInstruction("xml",strHeader));
  10. //创建根节点
  11. QDomElement vrtDatasetElement = vrtDoc.createElement("VRTDataset");
  12. vrtDatasetElement.setAttribute("rasterXSize",4800);
  13. vrtDatasetElement.setAttribute("rasterYSize",4800);
  14. vrtDoc.appendChild(vrtDatasetElment);
  15. //添加坐标系节点SRS
  16. QDomElementvrtSRSElement = vrtDoc.createElement("SRS");
  17. //pszWKT为前面讲到的利用gdal生成的坐标系说明字符串
  18. QDomTextvrtSRSText = vrtDoc.createTextNode(QString(pszWKT));
  19. vrtSRSElement.appendChild(vrtSRSText);
  20. vrtDoc.appendChild(vrtSRSElement);
  21. //添加仿射变换系数
  22. QDomElementvrtGeoTransformElement = vrtDoc.createElement("GeoTransform");
  23. Transfor需要根据实际情况自己编写生成
  24. QDomTextvrtGeoTransformText= vrtDoc.createTextNode(Transform);
  25. vrtGeoTransformElement.appendChild(vrtGeoTransformText);
  26. vrtDoc.appendChild(vrtGeoTransformElement);
  27. //其余的字段在此省略不写了,大家可以参考前面的代码自己编写
  28. //...
  29. //保存到文件
  30. QTextStream vrtStream(&vrtFile);
  31. vrtDoc.save(vrtStream,4);
  32. vrtFile.close();

至此“.vrt”文件就介绍完成了,使用QGIS或者其他支持".vrt"文件的地理信息软件就能打开裸数据了,自己俺写".vrt"文件打开裸数据的方式,一般在地理信息软件开发中使用较多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。