1.前言
使用QGIS开源库打开“*.raw”裸数据时,需要裸数据的格式说明文件“*.vrt”,来间接打开裸数据,怎样根据现有的裸数据信息编写对应的“.vrt”文件,博主调研了两天的时间才算搞清楚,现在记录下来以备后用。
2.".VRT"文件格式讲解
在编写“.vrt”文件前,首先需要了解“.vrt”文件的具体格式,现给出李民录老师关于“.vrt”文件格式讲解的博文地址:
http://www.jb51.cc/article/p-hoadeife-tm.html
完整的“.vrt”文件格式如下所示
- @H_502_28@<VRTDatasetrasterXSize="4800"rasterYSize="6000">
- SRS>GEOGCS["WGS84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],"6326"]],PRIMEM["Greenwich","8901"]],UNIT["degree",0.0174532925199433,"9122"]],"4326"]]</>
- 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>
2.1 字段“SRS”
看到一大堆的SRS值,当时我就蒙了,怎么填写、从哪里获取这么多的信息。后来调研得知,这一大堆的数据可以利用gdal中获取,具体的代码如下:
- OGRSpatialReference oSRS;
- oSRS.SetWellKnownGeogCS("WGS84");//设置坐标系
- oSRS.SetUTM(16);//设置投影区编号,全球共划分为60个投影区
- char* pszWKT = NULL;
- 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");
- if(vrtFile.open("QIODevice::ReadWrite"))
- {
- return;
- }
- //创建xml
- QDomDocument vrtDoc("vrt");
- vrtDoc.setContent(vrtFile);
- QString strHeader("version=\"1.0\" encoding=\"UTF-8\" ");
- vrtDoc.appendChild(vrtDoc.createProcessingInstruction("xml",strHeader));
- //创建根节点
- QDomElement vrtDatasetElement = vrtDoc.createElement("VRTDataset");
- vrtDatasetElement.setAttribute("rasterXSize",4800);
- vrtDatasetElement.setAttribute("rasterYSize",4800);
- vrtDoc.appendChild(vrtDatasetElment);
- //添加坐标系节点SRS
- QDomElementvrtSRSElement = vrtDoc.createElement("SRS");
- //pszWKT为前面讲到的利用gdal生成的坐标系说明字符串
- QDomTextvrtSRSText = vrtDoc.createTextNode(QString(pszWKT));
- vrtSRSElement.appendChild(vrtSRSText);
- vrtDoc.appendChild(vrtSRSElement);
- //添加仿射变换系数
- QDomElementvrtGeoTransformElement = vrtDoc.createElement("GeoTransform");
- Transfor需要根据实际情况自己编写生成
- QDomTextvrtGeoTransformText= vrtDoc.createTextNode(Transform);
- vrtGeoTransformElement.appendChild(vrtGeoTransformText);
- vrtDoc.appendChild(vrtGeoTransformElement);
- //其余的字段在此省略不写了,大家可以参考前面的代码自己编写
- //...
- //保存到文件
- QTextStream vrtStream(&vrtFile);
- vrtDoc.save(vrtStream,4);
- vrtFile.close();
至此“.vrt”文件就介绍完成了,使用QGIS或者其他支持".vrt"文件的地理信息软件就能打开裸数据了,自己俺写".vrt"文件打开裸数据的方式,一般在地理信息软件开发中使用较多。
原文链接:https://www.f2er.com/xml/295377.html