GEOS库的学习之二:简单几何图形的创建
几何图形(Geometry)是geos里面基本的操作对象,因此Geometry类就是最重要的一个类
几何图形中主要有三个要素:点,线,面。横纵坐标构成点,多个点构成线,环线构成面,点线面混合构成几何集合。对应的几个类为
坐标:Coordinate
点:Point、MultiPoint
线:LineString、MultiLineString(多条线)、LinearRing(环线)
面:Polygon、MultiPolygon
集合:GeometryCollection
在geos中,最小的组成单位是坐标,由Coordinate类来创建,如:Coordinate(2,3),表示一个点,横坐标是2,纵坐标是3.
所有的几何图形的创建,都是由类GeometryFactory来完成。因此,在创建几何图形前,可以先创建一个全局的GeometryFactory对象;
- GeometryFactory factory; //全局对象,所有的图形都由此对象创建
1、点的创建
- Point* createGeosPoint(double x,double y)
- {
- Coordinate pt(x,y);
- Point* p=factory.createPoint(pt);
- return p;
- }
2、非闭合线条的创建
- LineString* createGeosLine(double x,double y, double offset)
- {
- CoordinateArraySequence *cas=new CoordinateArraySequence(); //构建点序列
- cas->add(Coordinate(x,y));
- cas->add(Coordinate(x,y+offset));
- cas->add(Coordinate(x+offset,y+offset));
- cas->add(Coordinate(x+offset,y+*offset));
- cas->add(Coordinate(x+*offset,y+*offset));
- LineString *ls=factory.createLineString(cas);
- return ls;
- }
3、闭合线条的创建
- //创建一条环线,与线的区别就是环线是闭合的。即第一个点和最后一点重合
- LinearRing* createGeosRing(double x,double y,double offset)
- {
- CoordinateArraySequence *cas=new CoordinateArraySequence(); //构建点序列
- cas->add(Coordinate(x,y));
- cas->add(Coordinate(x,y+offset));
- cas->add(Coordinate(x+offset,y+offset));
- cas->add(Coordinate(x+offset,y+*offset));
- cas->add(Coordinate(x+*offset,y+*offset));
- cas->add(Coordinate(x+2*offset,y));
- cas->add(Coordinate(x,y)); //与第一个点相等
- LinearRing *lr=factory.createLinearRing(cas);
- return lr;
- }
除了用add的方法来构建点序列,也可以用另外一种方法setAt
- LinearRing* createGeosRing(double x,double y,double offset)
- {
- CoordinateArraySequenceFactory csf;
- CoordinateSequence* cs = csf.create(,);
- cs->setAt(Coordinate(x,y),);
- cs->setAt(Coordinate(x,y+offset),);
- cs->setAt(Coordinate(x+offset,y+offset),);
- cs->setAt(Coordinate(x+offset,y+*offset),);
- cs->setAt(Coordinate(x+*offset,y+*offset),);
- cs->setAt(Coordinate(x+2*offset,y),);
- cs->setAt(Coordinate(x,y),); //与第一个点相等
- LinearRing *lr=factory.createLinearRing(cs);
- return lr;
- }
4、多边形的创建
- //创建一个多边形,如果多边形内部没有孔洞实际上与环线是一样的
- Polygon* createGeosPolygon(double x,double y,double offset)
- {
- LinearRing *lr=createGeosRing(x,y,offset);
- Polygon *poly=factory.createPolygon(lr,NULL); //如果多边形中间没有孔洞,第二个参数设为NULL
- return poly;
- }
测试:
- #include "geos.h"
- int main()
- {
- LineString *ls=createGeosRing(,,);
- cout<<"线条点数:"<<ls->getNumPoints()<<" 线条长度:"<<ls->getLength()<<endl;
- Polygon *poly=createGeosPolygon(,,);
- cout<<"多边形面积:"<<poly->getArea()<<endl;
- system("pause");
- return ;
- }
GEOS库的学习之二:简单几何图形的创建的更多相关文章
- GEOS库的学习之一:介绍和编译
对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...
- Html学习笔记(二) 简单标签
标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...
- EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)
上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点 ...
- Python Pandas库的学习(二)
今天我们继续讲下Python中一款数据分析很好的库.Pandas的学习 接着上回讲到的,如果有人听不懂,麻烦去翻阅一下我前面讲到的Pandas学习(一) 如果我们在数据中,想去3,4,5这几行数据,那 ...
- Numpy库的学习(二)
今天来继续学习一下Numpy库的使用 接着昨天的内容继续 在Numpy中,我们如果想要进行一个判断使用“==” 我们来看下面的代码 vector = np.array([5,10,15,20,25]) ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- redis 学习笔记二 (简单动态字符串)
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...
- rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld
首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...
随机推荐
- 不小心改了Xcode系统的头文件,运行报错,解决办法
- 网易新闻iOS版使用的18个开源组件
转载来自:http://www.jianshu.com/p/8952944f7566 原文最后编辑时间:2015.05.19 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFN ...
- linux命令----网络地址
IP即时生效(重启后失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 route add default gw 192.168.1.1 ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
- rails关于utf8问题-------------------utf8申明必须置顶
utf-8必须置顶,如果放在其他位置,会导致后面如果遇到中文无法解析,然后报其他乱七八糟的错误,比如不能连接数据库,比如语法错误......这种错误不好找,切记!!! 出错代码: #!/bin/env ...
- ThinkPHP 获取get post参数与I方法
传统方式获取变量 $id = $_GET['id']; // 获取get变量 $name = $_POST['name']; // 获取post变量 $value = $_SESSION['var'] ...
- js实现(全选)多选按钮
第一种,全部选中: <html> <head> <title>复选框checked属性</title> <script language=&quo ...
- Linux常用压缩和解压命令
.tar 解包 tar xvf filename.tar.tar 打包 tar cvf filename.tar dirname.gz 解压1 gunzip filename.gz.gz 解压2 gz ...
- linux 创建和删除目录
创建目录命令 mkdir 目录名 [root@wang whp]# mkdir catalog[root@wang whp]# lscatalog [root@wang whp]# mkdir cat ...
- 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题
关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati ...