GEOS 使用的例子
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 使用的例子的更多相关文章
- GEOS库 介绍 (转)
http://wiki.woodpecker.org.cn/moin/lilin/geos-introduce 介绍 GEOS是一个集合形状的拓扑关系操作实用库(可能这么说不太准确),简单得说,就是判 ...
- SQLServer地址搜索性能优化例子
这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
- REGEX例子
作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...
- CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子
CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子 本文涉及的VolumeRendering相关的C#代码是从(https://github.com/toolchai ...
- 简单例子了解View的事件分发
什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...
- 简单的例子了解自定义ViewGroup(一)
在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...
- kqueue例子
网络服务器通常都使用epoll进行异步IO处理,而开发者通常使用mac,为了方便开发,我把自己的handy库移植到了mac平台上.移植过程中,网上居然没有搜到kqueue的使用例子,让我惊讶不已.为了 ...
- 今天有群友不是很清楚htm直接存数据库的危害,我简单举个例子
通过这个案例就知道为什么不要把原生的html放数据库了 常见的几种转码 常用的几种显示方法 只有原生html和最下面一种弹框了,变成了持久xss 如果是Ajax的方式,请用@Ajax.JavaS ...
随机推荐
- python-day3-之函数
不使用函数的情况下只能遵循面向过程的编程,即,根据业务逻辑从上到下实现功能,往往重复的功能,使得代码出现重复. #最简单的函数调用 #由于python遵循从上到下读入内存的规律,所以函数要放到调用的前 ...
- python 学习分享-面向对象2
面向对象进阶 静态方法 一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可以调用静态方法: class Foo: ...
- Redis的 SORT命令
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [S ...
- Map-Reduce基础
1.设置文件读入分隔符 默认按行读入; 按句子读入 : conf1.set("textinputformat.record.delimiter", "."); ...
- [python][django学习篇][11]后台admin用户登录博客,添加文章---这一章和博客首页设计没有关系
1 如果没有创建超级管理员账号,先要创建python manage.py createsuperuser 2 在admin后台注册模型(如果没有这一步,登录http://127.0.0.1:8000/ ...
- linux系统mysql密码修改脚本
编写了一个适用于阿里云linux系统 mysql密码修改脚本,使用阿里云提供的一键安装包配置后,如果account.log文件删除,并且忘记mysql密码时,可以通过脚本来重置mysql密码. 附:一 ...
- 【bzoj1221】[HNOI2001] 软件开发 费用流
题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...
- Scala学习之路----基础入门
一.Scala解释器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环) scala解释器也被称为REPL,会快速编译s ...
- 亚瑟王(arthur)
亚瑟王(arthur) 题目描述 小K不慎被LL邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...
- 关于在redux当中 reducer是如何知道传入的state是初始化state下面的哪一条数据
首先初始化redux的数据 reducer 那么问题来了,todos这个reducer是如何知道传入的是初始化state下面的todos这条数据呢? 合并reducer 合并之后是这样的 他们之间的关 ...