在上一篇介绍了通过影像获取边界范围,这一篇介绍通过XML获取影像边界范围,不过下面是生成的点图层,需要的可以改为面图层。
在国产卫星影像(如GF1,GF2)压缩包中,通常会存在一个XML文件,里面存有一些影像的基本信息,先需要通过XML中的四角点的坐标生成一个shp文件,即影像对应的有效范围边框。
在此也非常感谢提供Markup.h和Markup.cpp(需要的可以去我的资源中下载)的那个朋友<img alt="微笑" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif" />,帮我解决了一个大问题。也希望这能帮助需要的朋友。
<ImgFour_points(const char *pszXMLFileName,const char *pszDSTShpFileName) { CMarkup xml; bool load=false; load=xml.Load(pszXMLFileName); xml.ResetMainPos(); if (load) { cout<<"从XML提取影像四角点并生成点shp图层..."<<endl; //获取四个点坐标 vector<Point_xy> BoundaryPoint; Point_xy temPoint; //点结构体对象
if (xml.FindChildElem("SatelliteID")) cout<<"卫星:"<<xml.GetChildData()<<endl; if(xml.FindChildElem("SceneID")) cout<<"景序列号:"<<xml.GetChildData()<<endl;
<span style="white-space:pre"> </span>//XML中的四个点坐标 if(xml.FindChildElem("TopLeftLatitude")) { CString str = (xml.GetChildData().GetBuffer(0)); //为了CString 转为 double temPoint.y =atof(str.GetBuffer(str.GetLength()));
<span style="white-space:pre"> </span> } if(xml.FindChildElem("TopLeftLongitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.x =atof(str.GetBuffer(str.GetLength())); } BoundaryPoint.push_back(temPoint); //加入Vector为了后面shp的生成 if(xml.FindChildElem("TopRightLatitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.y =atof(str.GetBuffer(str.GetLength())); } if(xml.FindChildElem("TopRightLongitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.x =atof(str.GetBuffer(str.GetLength())); // temPoint.x = xml.GetChildData(); // cout<<"TopRightLongitude"<<xml.GetChildData()<<endl; } BoundaryPoint.push_back(temPoint); if(xml.FindChildElem("BottomRightLatitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.y =atof(str.GetBuffer(str.GetLength())); } if(xml.FindChildElem("BottomRightLongitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.x =atof(str.GetBuffer(str.GetLength())); } BoundaryPoint.push_back(temPoint); if(xml.FindChildElem("BottomLeftLatitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.y =atof(str.GetBuffer(str.GetLength())); } if(xml.FindChildElem("BottomLeftLongitude")) { CString str = (xml.GetChildData().GetBuffer(0)); temPoint.x =atof(str.GetBuffer(str.GetLength())); } BoundaryPoint.push_back(temPoint);
//为了支持中文路径 CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO"); //注册shape文件驱动 const char* pszDriverName="ESRI Shapefile"; OGRSFDriver *poDriver; OGRRegisterAll(); poDriver=OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName); if (poDriver==NULL) { printf("%s driver is not available!",pszDriverName); exit(1); } //创建shape文件; OGRDataSource *poShpDS; //如果名字有.shp后缀,则直接在当前目录下生成文件; poShpDS=poDriver->CreateDataSource(pszDSTShpFileName,NULL); if (poShpDS==NULL) { printf("Create my shape file failed!"); exit(1); } //创建输出图层; OGRLayer *poLayer;; //为shp设置地理坐标 OGRSpatialReference oSRS; char *pszWKT = NULL; oSRS.SetWellKnownGeogCS( "WGS84" ); oSRS.exportToWkt( &pszWKT ); // printf( "%s\n",pszWKT ); poLayer=poShpDS->CreateLayer(pszDSTShpFileName,&oSRS,wkbPoint,NULL); if (poLayer==NULL) { printf("Creat layer failed!"); exit(1); } //添加属性字段 OGRFieldDefn oFieldfilename("ImgName",OFTString); oFieldfilename.SetWidth(100); if (poLayer->CreateField(&oFieldfilename,1)!=OGRERR_NONE) { printf("Create Point Field Failed!"); exit(1); } OGRFieldDefn oFieldX("X",OFTReal); if (poLayer->CreateField(&oFieldX,1)!=OGRERR_NONE) { printf("Create Point Field Failed!"); exit(1); } OGRFieldDefn oFieldY("Y",OFTReal); if (poLayer->CreateField(&oFieldY,1)!=OGRERR_NONE) { printf("Create Point Field Failed!"); exit(1); } //创建features,写入feature到磁盘; OGRFeature *poFeature; poFeature=OGRFeature::CreateFeature(poLayer->GetLayerDefn()); //添加属性信息 string path = pszXMLFileName; int pos = path.find_last_of('\\'); string tifName(path.substr(pos + 1) ); poFeature->SetField("ImgName",tifName.c_str()); //绘制外边框 OGRLineString Line; OGRLinearRing ob_LinearRing; for (int n_point = 0; n_point < BoundaryPoint.size(); n_point++ ) { OGRPoint Point(BoundaryPoint[n_point].x,BoundaryPoint[n_point].y ); poFeature->SetField("X",BoundaryPoint[n_point].x); poFeature->SetField("Y",BoundaryPoint[n_point].y); poFeature->SetGeometry(&Point); if (poLayer->CreateFeature(poFeature)!=OGRERR_NONE) { printf("Failed create feature in shapefile!"); exit(1); } } OGRFeature::DestroyFeature(poFeature); OGRDataSource::DestroyDataSource(poShpDS); printf("创建矢量数据成功!\n"); cout<<"BoundaryPoint.capacity :"<<BoundaryPoint.capacity()<<endl; vector<Point_xy>().swap(BoundaryPoint); cout<<"BoundaryPoint.capacity :"<<BoundaryPoint.capacity()<<endl; }return true;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。