几何图形(Geometry)是geos里面基本的操作对象,因此Geometry类就是最重要的一个类

几何图形中主要有三个要素:点,线,面。横纵坐标构成点,多个点构成线,环线构成面,点线面混合构成几何集合。对应的几个类为

坐标:Coordinate

点:Point、MultiPoint

线:LineString、MultiLineString(多条线)、LinearRing(环线)

面:Polygon、MultiPolygon

集合:GeometryCollection

在geos中,最小的组成单位是坐标,由Coordinate类来创建,如:Coordinate(2,3),表示一个点,横坐标是2,纵坐标是3.

所有的几何图形的创建,都是由类GeometryFactory来完成。因此,在创建几何图形前,可以先创建一个全局的GeometryFactory对象;

  1. GeometryFactory factory; //全局对象,所有的图形都由此对象创建

1、点的创建

  1. Point* createGeosPoint(double x,double y)
  2. {
  3. Coordinate pt(x,y);
  4. Point* p=factory.createPoint(pt);
  5. return p;
  6. }

2、非闭合线条的创建

  1. LineString* createGeosLine(double x,double y, double offset)
  2. {
  3. CoordinateArraySequence *cas=new CoordinateArraySequence(); //构建点序列
  4. cas->add(Coordinate(x,y));
  5. cas->add(Coordinate(x,y+offset));
  6. cas->add(Coordinate(x+offset,y+offset));
  7. cas->add(Coordinate(x+offset,y+*offset));
  8. cas->add(Coordinate(x+*offset,y+*offset));
  9. LineString *ls=factory.createLineString(cas);
  10. return ls;
  11. }

3、闭合线条的创建

  1. //创建一条环线,与线的区别就是环线是闭合的。即第一个点和最后一点重合
  2. LinearRing* createGeosRing(double x,double y,double offset)
  3. {
  4. CoordinateArraySequence *cas=new CoordinateArraySequence(); //构建点序列
  5. cas->add(Coordinate(x,y));
  6. cas->add(Coordinate(x,y+offset));
  7. cas->add(Coordinate(x+offset,y+offset));
  8. cas->add(Coordinate(x+offset,y+*offset));
  9. cas->add(Coordinate(x+*offset,y+*offset));
  10. cas->add(Coordinate(x+2*offset,y));
  11. cas->add(Coordinate(x,y)); //与第一个点相等
  12. LinearRing *lr=factory.createLinearRing(cas);
  13. return lr;
  14. }

除了用add的方法来构建点序列,也可以用另外一种方法setAt

  1. LinearRing* createGeosRing(double x,double y,double offset)
  2. {
  3. CoordinateArraySequenceFactory csf;
  4. CoordinateSequence* cs = csf.create(,);
  5. cs->setAt(Coordinate(x,y),);
  6. cs->setAt(Coordinate(x,y+offset),);
  7. cs->setAt(Coordinate(x+offset,y+offset),);
  8. cs->setAt(Coordinate(x+offset,y+*offset),);
  9. cs->setAt(Coordinate(x+*offset,y+*offset),);
  10. cs->setAt(Coordinate(x+2*offset,y),);
  11. cs->setAt(Coordinate(x,y),); //与第一个点相等
  12. LinearRing *lr=factory.createLinearRing(cs);
  13. return lr;
  14. }

4、多边形的创建

  1. //创建一个多边形,如果多边形内部没有孔洞实际上与环线是一样的
  2. Polygon* createGeosPolygon(double x,double y,double offset)
  3. {
  4. LinearRing *lr=createGeosRing(x,y,offset);
  5. Polygon *poly=factory.createPolygon(lr,NULL); //如果多边形中间没有孔洞,第二个参数设为NULL
  6. return poly;
  7. }

测试:

  1. #include "geos.h"
  2. int main()
  3. {
  4. LineString *ls=createGeosRing(,,);
  5. cout<<"线条点数:"<<ls->getNumPoints()<<" 线条长度:"<<ls->getLength()<<endl;
  6. Polygon *poly=createGeosPolygon(,,);
  7. cout<<"多边形面积:"<<poly->getArea()<<endl;
  8. system("pause");
  9. return ;
  10. }

GEOS库的学习之二:简单几何图形的创建的更多相关文章

  1. GEOS库的学习之一:介绍和编译

    对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...

  2. Html学习笔记(二) 简单标签

    标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...

  3. C++的开源跨平台日志库glog学习研究(二)--宏的使用

    上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...

  4. EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)

    上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点 ...

  5. Python Pandas库的学习(二)

    今天我们继续讲下Python中一款数据分析很好的库.Pandas的学习 接着上回讲到的,如果有人听不懂,麻烦去翻阅一下我前面讲到的Pandas学习(一) 如果我们在数据中,想去3,4,5这几行数据,那 ...

  6. Numpy库的学习(二)

    今天来继续学习一下Numpy库的使用 接着昨天的内容继续 在Numpy中,我们如果想要进行一个判断使用“==” 我们来看下面的代码 vector = np.array([5,10,15,20,25]) ...

  7. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  8. redis 学习笔记二 (简单动态字符串)

    redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...

  9. rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld

    首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...

随机推荐

  1. 不小心改了Xcode系统的头文件,运行报错,解决办法

  2. 网易新闻iOS版使用的18个开源组件

    转载来自:http://www.jianshu.com/p/8952944f7566  原文最后编辑时间:2015.05.19 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFN ...

  3. linux命令----网络地址

    IP即时生效(重启后失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0  route add default gw 192.168.1.1   ...

  4. 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则

    第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...

  5. rails关于utf8问题-------------------utf8申明必须置顶

    utf-8必须置顶,如果放在其他位置,会导致后面如果遇到中文无法解析,然后报其他乱七八糟的错误,比如不能连接数据库,比如语法错误......这种错误不好找,切记!!! 出错代码: #!/bin/env ...

  6. ThinkPHP 获取get post参数与I方法

    传统方式获取变量 $id = $_GET['id']; // 获取get变量 $name = $_POST['name']; // 获取post变量 $value = $_SESSION['var'] ...

  7. js实现(全选)多选按钮

    第一种,全部选中: <html> <head> <title>复选框checked属性</title> <script language=&quo ...

  8. Linux常用压缩和解压命令

    .tar 解包 tar xvf filename.tar.tar 打包 tar cvf filename.tar dirname.gz 解压1 gunzip filename.gz.gz 解压2 gz ...

  9. linux 创建和删除目录

    创建目录命令 mkdir 目录名 [root@wang whp]# mkdir catalog[root@wang whp]# lscatalog [root@wang whp]# mkdir cat ...

  10. 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题

    关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati ...