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

OGR中空间叠加函数Union的更多相关文章

  1. Linux时间子系统之(三):用户空间接口函数

    专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...

  2. Linux时间子系统(三) 用户空间接口函数

    一.前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: 1.和系统时间相关的服务.例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时). 2.让进程睡眠一段时间 3. ...

  3. ARCGIS空间叠加分析(转)

    ARCGIS空间叠加分析 https://blog.csdn.net/gswwldp/article/details/66974465 (2)双击④处的Identity,打开Identity操作对话框 ...

  4. 由项目中一个hash2int函数引发的思考

    hash2int /** * 计算一个字符串的md5折算成int返回 * @param type $str * @return type */ function hash2int($str) { $m ...

  5. C中不安全函数

    C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库.最有害的罪魁祸首是不进行自变量检查的.有问题的字符串操作(strcpy.strcat.sprintf 和 gets).一般来讲,象“避免使用 st ...

  6. C/C++中的getline函数总结:

    来自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html C/C++中的getline函数总结 getline函数是一个比较 ...

  7. Qt调用dll中的功能函数

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:   ...

  8. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  9. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

随机推荐

  1. Java之枚举举例

    package enumdemo; /** * 枚举类 */ public enum MAPPER { // 实例 ELEMENT_NAME("mapper"), ATTRIBUT ...

  2. C/S架构引用Lodop 如何在C#调用web打印控件Lodop

    lodop是web打印控件,引用安装目录下的ocx文件,可以在c/s架构中使用. 该文件所在路径:C:\Program Files (x86)\MountTaiSoftware\Lodop 有32位和 ...

  3. WordPress 之 在注册界面 实现 注册后密码直接显示在页面上

    前言:WordPress 功能无疑强大的,但有些功能实现上还是有少许不尽人意,比如在 网站上有新用户注册后,必须下发到用户填写的邮件才能接收到新密码,而密码又是系统自动生成的,如果因为某些原因用户接收 ...

  4. 数据库左右连接on后的限制条件问题

    测试环境: MySQL 5.7.19 HeidiSQL 9.3 数据库界面连接工具(挺好用的) 碰到的问题是: Select * from t1 left outer join t2 on t1.id ...

  5. Deep Learning(深度学习)学习笔记整理系列二

    声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部 ...

  6. cf757F Team Rocket Rises Again (dijkstra+支配树)

    我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...

  7. luogu2279 消防局的设立 (贪心)

    按点的深度从大到小排序,每次取出深度最大的那个点,如果它还没被覆盖,就在它爷爷上放一个消防局,这样一定是最优的 为了判定是否被覆盖,可以记录从某点的子树中到这个点的最近消防局的距离dis[](如果没有 ...

  8. requests+beautifulsoup爬取豆瓣图书

    使用Xpath和BeautifulSoup来解析网页可以说真的很简便. import requests from bs4 import BeautifulSoup from random import ...

  9. des加密解密JAVA与.NET互通实例

    JAVA版本 import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFacto ...

  10. MATLAB:图像的与、或、非、异或逻辑运算(&、|、~、xor)

    图像的与.或.非.异或逻辑运算涉及到了&.|.~和xor符号 close all;%关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc; clear all; I=imrea ...