在OGRLayer的对象中调用Union函数了。先看一下Union函数的原型:
Union(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions=NULL, GDALProgressFunc pfnProgress=NULL, void *pProgressArg=NULL),根据OGR提供的解释来看,前三个参数是比较重要的:
pLayerMethod:要跟当前图层做Union的那个图层,如果我要对layer1、layer2做Union操作,通过layer1对象调用Union函数,那么layer2就是pLayerMethod,不能为空。
pLayerResult:很明显,存储Union结果的图层,也不能为空。这里可以是用ArcGIS创建好的没有要素的图层,也可以是在程序中用OGR创建的新图层,个人倾向与在程序 中用代码创建一个,简单的代码就能实现。
papszOptions:这个二维指针中有其实包括了四个参数——SKIP_FAILURES=YES/NO、PROMOTE_TO_MULTI=YES/NO、INPUT_PREFIX=string、METHOD_PREFIX=string。当SKIP_FAILURES=YES的时候,如果某个要素的合并出现错误,则会跳过该要素继续后续要素的合并。PROMOTE_TO_MULTI=YES时,可以将单空间对象转换为多空间对象,如将Polygons转换为MultiPolygons, LineStrings转换为MultiLineStrings。INPUT_PREFIX=string,输入图层的属性字段在结果图层中的前置标记。METHOD_PREFIX=string,操作图层的属性字段在结果图层中的前置标记。还是拿layer1和layer2来举例,layer1、layer2合并后的结果图层中包含有layer1和layer2的所有属性字段,那么如果我们设置INPUT_PREFIX=1,METHOD_PREFIX=2,那么在结果图层的字段中,来自layer1的所有字段将在字段名称前加上前缀"1",来自layer2的将加前缀"2"。
后面的两个参数没做尝试。
下面看一个具体的代码示例
char *filePath = "D:\CeShi_Data\CESHI_NEW"; char *layerName1 = "layer1"; char *layerName2 = "layer2"; OGRLayer *pLayer1 = NULL; OGRLayer *pLayer2 = NULL; OGRDataSource *pODS = NULL; OGRRegisterAll(); pODS = OGRSFDriverRegistrar::Open(filePath,TRUE); //读取取要进行Union的两个图层 pLayer1 = pODS->GetLayerByName(layerName1); pLayer2 = pODS->GetLayerByName(layerName2); //创建结果图层 OGRLayer *pResultLayer = NULL; pResultLayer = pODS->CreateLayer("result",pLayer2->GetSpatialRef(),wkbMultiPolygon,NULL); //配置Union函数中的第三个参数 char **p = new char *[4]; p[0] = "SKIP_FAILURES=YES"; p[1] = "PROMOTE_TO_MULTI=YES"; p[2] = "INPUT_PREFIX=1"; p[3] = "METHOD_PREFIX=2"; pLayer2->Union(pLayer1,pResultLayer,p,NULL,NULL); //将对pResultLayer的编辑写入文件,如果不加这句,result文件中将没有记录 pResultLayer->SyncToDisk(); OGRDataSource::DestroyDataSource(pODS);
如下图:
layer1
layer2:
结果图层result:
如果layer1、layer2中的属性字段相同,如示例中,在结果图层中想保存一份属性字段,则在创建结果图层的时给结果图层创建同layer1一样的属性字段集即可,在代码中做如下修改:
//创建结果图层 OGRLayer *pResultLayer = NULL; pResultLayer = pODS->CreateLayer("result",pLayer2->GetSpatialRef(),wkbMultiPolygon,NULL); //为结果图层创建跟输入图层layer1相同的属性字段 OGRFeatureDefn *pOGRFeatureDefn = pLayer1->GetLayerDefn(); for (int i = 0 ; i < pOGRFeatureDefn->GetFieldCount(); i++) pResultLayer->CreateField( pOGRFeatureDefn->GetFieldDefn(i)); pLayer2->Union(pLayer1,pResultLayer,p,NULL,NULL);
生成的结果图层的属性表如下:
以上便是Union的一些简单用法,其他几个函数也基本相同,不妥之处,请批评指正!