typedef Coordinate PT;
geos::geom::Geometry* CGlbGlobePolygonSymbol::Interection(CGlbPolygon *geom, CGlbExtent &ext)
{// 计算ext与geom的相交区域
    // CGlbPolygon  --->  Geometry(GEOS_MULTIPOLYGON/GEOS_POLYGON)
    if (geom==NULL) return NULL;
    CGlbPolygon* poly = geom;        
    glbDouble minX,minY,maxX,maxY;
    ext.Get(&minX,&maxX,&minY,&maxY);

geos::geom::CoordinateArraySequenceFactory csf;

// 1. 由ext生成rectPoly
    geos::geom::CoordinateSequence* cs1 = csf.create(5,2);
    if (cs1==NULL) return NULL;
    cs1->setAt(PT(minX,minY,0),0);
    cs1->setAt(PT(maxX,minY,0),1);
    cs1->setAt(PT(maxX,maxY,0),2);
    cs1->setAt(PT(minX,maxY,0),3);
    cs1->setAt(PT(minX,minY,0),4);
    geos::geom::LinearRing* ring1 = factory.createLinearRing(cs1);
    if (ring1==NULL) return NULL;
    geos::geom::Polygon* rectPoly = factory.createPolygon(ring1,NULL);
    if (rectPoly==NULL) return NULL;

// 2. 由geom生成Poly
    geos::geom::Polygon* otherPoly = NULL;
    CGlbLine* extRing = poly->GetExtRing();
    geos::geom::LinearRing* shell = NULL;
    
    if (extRing)
    {
        glbInt32 ptCnt = extRing->GetCount();
        const glbDouble* pts = extRing->GetPoints();
        geos::geom::CoordinateSequence* cs2 = csf.create(ptCnt+1,2);
        if (cs2)
        {
            for(glbInt32 k = 0; k < ptCnt; k++)
            {                
                cs2->setAt(PT(pts[2*k],pts[2*k+1],0),k);
            }
            cs2->setAt(PT(pts[0],pts[1],0),ptCnt);
            shell = factory.createLinearRing(cs2);
        }
    }
    glbInt32 inRingCnt = poly->GetInRingCount();
    std::vector<geos::geom::Geometry *>* holes = NULL;
    if (inRingCnt>0)
        holes = new vector<Geometry *>(inRingCnt);
    for (glbInt32 idx = 0; idx < inRingCnt; idx++)
    {
        CGlbLine* inRing = poly->GetInRing(idx);
        if (inRing)
        {
            glbInt32 ptCnt = inRing->GetCount();
            const glbDouble* pts = inRing->GetPoints();
            geos::geom::CoordinateSequence* cs2 = csf.create(ptCnt+1,2);
            if (cs2)
            {
                for(glbInt32 k = 0; k < ptCnt; k++)
                {                
                    cs2->setAt(PT(pts[2*k],pts[2*k+1],0),k);
                }
                cs2->setAt(PT(pts[0],pts[1],0),ptCnt);
                geos::geom::LinearRing* ring = factory.createLinearRing(cs2);
                if (ring)
                    (*holes)[idx] = ring;
            }
        }
    }

if (shell && holes==NULL)    
        otherPoly = factory.createPolygon(shell,NULL);
    else if (shell && holes)
        otherPoly = factory.createPolygon(shell,holes);
    
    geos::geom::Geometry* outGeom=NULL;
    //3. 求交集
    if (otherPoly && rectPoly)
    {
        try
        {
            outGeom = rectPoly->intersection(otherPoly);
        }        
        catch (std::exception* e)
        {
            outGeom = NULL;
        }        
    }

//4. 清除创建的对象
    if (rectPoly)                 
        factory.destroyGeometry(rectPoly);

if (otherPoly)        
        factory.destroyGeometry(otherPoly);
    
    return outGeom;
}

线,多线形中的点集是AutoPtr指针,自动释放,所以不需要外部来删除.

GEOS 使用的例子的更多相关文章

  1. GEOS库 介绍 (转)

    http://wiki.woodpecker.org.cn/moin/lilin/geos-introduce 介绍 GEOS是一个集合形状的拓扑关系操作实用库(可能这么说不太准确),简单得说,就是判 ...

  2. SQLServer地址搜索性能优化例子

    这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...

  3. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  4. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...

  5. CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子

    CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子 本文涉及的VolumeRendering相关的C#代码是从(https://github.com/toolchai ...

  6. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

  7. 简单的例子了解自定义ViewGroup(一)

    在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...

  8. kqueue例子

    网络服务器通常都使用epoll进行异步IO处理,而开发者通常使用mac,为了方便开发,我把自己的handy库移植到了mac平台上.移植过程中,网上居然没有搜到kqueue的使用例子,让我惊讶不已.为了 ...

  9. 今天有群友不是很清楚htm直接存数据库的危害,我简单举个例子

     通过这个案例就知道为什么不要把原生的html放数据库了  常见的几种转码  常用的几种显示方法 只有原生html和最下面一种弹框了,变成了持久xss 如果是Ajax的方式,请用@Ajax.JavaS ...

随机推荐

  1. Python基础-week02 Python的常用数据类型

    一.模块初识 import导入Py自带模块例如os,sys等及其自己编写的Py文件,导入到其他文件中,默认查找当前目录.如果不在同一目录,会报错,将该自定义py文件模块放到site-packages目 ...

  2. Composer 下载安装类库

    安装 Composer 你需要先下载 composer.phar 可执行文件. curl -sS https://getcomposer.org/installer | php composer.js ...

  3. MapReduce 使用案例

    MapReduce 使用案例 MapReduce在面试过程中出现的频率还是挺高的,尤其是数据挖掘等岗位.通常面试官会出一个大数据题目,需要被试者根据题目设计基于MapReduce的算法来解答.我在一个 ...

  4. caffe-dnnh实验

    下面是我在做基于深度哈希的大规模图像检索中的一个实验,相关文档介绍给大家,具体内容查看提供的相关链接,总结的很到位了,我就不再赘述. 实践cvpr2015年的深度哈希图像检索论文:Simultaneo ...

  5. activemq概念介绍

    ActiveMQ概念介绍 是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,消息中间件. 消息中间件: A传递消息到B(功能或者系统),有比较强的耦合 ...

  6. log4j.xml配置文件详解

    一 log4j.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:c ...

  7. java运行时间计算

    long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTime = System. ...

  8. Brain Powerd计划

    Brain Powerd这片子没有高清的版本,只有DVD..(我手上只有个DVDRip,X2字幕组的)同时字幕质量也不行. 开个坑用waifu2x压个好看一点(用DVDRip)的,码率大概是3.3M ...

  9. BZOJ2916 [Poi1997]Monochromatic Triangles 数论

    答案等于总三角形数-不合法数 一个不合法三角形一定存在两个顶点,在这个三角形中这个顶点的角的两边不同色 #include<cstring> #include<cmath> #i ...

  10. 【HDOJ5517】Triple(二维BIT)

    题意:给你n个二元组<a,b>, m个三元组<c,d,e>. 如果d = e,那么<a,c,d>会组成一个新的三元组集合G. 问G中有多少个三元组在凸点.(没有其它 ...