zoukankan      html  css  js  c++  java
  • OGR中空间叠加函数Union

     

        在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的一些简单用法,其他几个函数也基本相同,不妥之处,请批评指正!

  • 相关阅读:
    Android的LinearLayout中的权重android:layout_weight
    iPhone尺寸规范
    导出iPhone中安装的APP的iPA文件
    c++ json字符串转换成map管理
    mac 升级EI Capitan后遇到c++转lua时遇到libclang.dylib找不到的错
    sqlite3 数据库使用
    关于flyme5显示不到和卸载不到旧应用解决方法
    cocos2dx 通过jni调用安卓底层方法
    cocos2dx 单张图片加密
    安卓线程使用问题
  • 原文地址:https://www.cnblogs.com/abella/p/9473121.html
Copyright © 2011-2022 走看看