【GEOS】GEOS库学习之简单几何图形的创建
一、GEOS库介绍
GEOS
的前⾝是JTS,JTS提供了全功能的,强⼤的空间操作和空间判断。 后来PostGIS缺少⼀套完整的空间查询操作,于是就将JTS移植成为C++版本,正式命名为GEOS
。
GEOS
为开源库,它包括了完整的空间查询和⼀⼤部分空间操作,是从事图形操作和GIS⾏业开发⼈员经常接触的开发库。较为知名的使⽤GEOS的GIS软件就有QGIS,QGIS使⽤GEOS的c接⼝,c接⼝函数名称不会经常发⽣更改,具有更多的稳定性。
简单得说,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+2*offset));cas->add(Coordinate(x+2*offset,y+2*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+2*offset));cas->add(Coordinate(x+2*offset,y+2*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(7,2);cs->setAt(Coordinate(x,y),0);cs->setAt(Coordinate(x,y+offset),1);cs->setAt(Coordinate(x+offset,y+offset),2);cs->setAt(Coordinate(x+offset,y+2*offset),3);cs->setAt(Coordinate(x+2*offset,y+2*offset),4);cs->setAt(Coordinate(x+2*offset,y),5);cs->setAt(Coordinate(x,y),6); //与第一个点相等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); //如果多边形中间没有孔洞,第二个参数设为NULLreturn poly;
}
测试
#include "geos.h"
int main()
{LineString *ls=createGeosRing(10,10,5);cout<<"线条点数:"<<ls->getNumPoints()<<" 线条长度:"<<ls->getLength()<<endl;Polygon *poly=createGeosPolygon(10,10,5);cout<<"多边形面积:"<<poly->getArea()<<endl;system("pause");return 1;
}
【GEOS】GEOS库学习之简单几何图形的创建相关推荐
- muduo网络库学习(七)用于创建服务器的类TcpServer
目前为止,涉及到的绝大多数操作都没有提及线程,EventLoop,Poller,Channel,Acceptor,TcpConnection,这些对象的执行都是在单独线程完成,并没有设计多线程的创建销 ...
- muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool
muduo是支持多线程的网络库,在muduo网络库学习(七)用于创建服务器的类TcpServer中也提及了TcpServer中有一个事件驱动循环线程池,线程池中存在大量线程,每个线程运行一个Event ...
- GIS开源库GEOS库学习教程(二):geos中的几何图形(Geometry)
前言 上一节我们学过了GEOS库的介绍和环境编译及示例代码,在这一节我们将了解一下geos中的各种几何图形类,它们大部分都是从Geometry类派生的.而几何图形(Geometry)是geos里面 ...
- STM32CubeMX与HAL库学习--简单的CAN回环测试
STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...
- 【libevent】libevent库学习总结(一)——基础
libevent库学习总结(一)--基础 一.基础 1.1. 介绍 Libevent是一个用于开发可伸缩网络服务器的事件通知库.Libevent API提供了一种机制来执行回调函数,当某个特定事件发生 ...
- Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例
2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...
- [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...
[Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Python学习] ...
- muduo网络库学习(四)事件驱动循环EventLoop
muduo的设计采用高并发服务器框架中的one loop per thread模式,即一个线程一个事件循环. 这里的loop,其实就是muduo中的EventLoop,所以到目前为止,不管是Polle ...
- 【itext学习之路】--1.创建一个简单的pdf文档
来源:https://blog.csdn.net/tomatocc/article/details/80666011 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文 ...
最新文章
- c语言 编码规范 C Coding Standard
- python使用for循环打印99乘法表-Python中的九九乘法表(for循环)
- 设计模式复习-代理模式
- extjs 限制上传文件类型_如何让extjg 支持选择多文件上传
- php.h: No such file or directory
- Flutter 中的国际化之多语言环境
- Unity渲染管线-百人计划笔记
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 华为Mate8刷低Android版本,华为mate8怎么刷机 华为mate8刷机方法【图文教程】
- redis 系列19 客户端
- 【NLP】近期必读ICLR 2021相关论文
- windows上pip安装及使用详解
- Java实现顺序表的创建及基本操作(增删改查)
- 高级前端工程师知识图谱
- English语法_分词 - 概述
- 【银行】2016年中国银行信息科技岗 笔试+面试经验汇总。。。。《转》
- suger BI 创建任务
- 哥德尔命题6、背景知识和ω一致性观念——哥德尔读后之十七021-08-09
- 七剑下天山(二)疑问篇
- java路由架构_《大型分布式网站架构设计与实践》读书笔记之 服务的路由和负载均衡...