几何图形(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库的学习之二:简单几何图形的创建的更多相关文章

  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. eclipse创建本地maven

    一.下载maven安装包和maven的eclipse插件 apache-maven-3.3.9-bin.zip eclipse-maven-plugin.zip 下载地址:http://pan.bai ...

  2. Node.js Web框架收集

    原文地址:http://geek.csdn.net/news/detail/4020 框架列表: http://nodeframework.com/ 与其他很多语言一样,Node.js也有很多Web框 ...

  3. Effective Java 19 Use interfaces only to define types

    Reason The constant interface pattern is a poor use of interfaces. That a class uses some constants ...

  4. 用java程序输出自己的姓名

    代码部分: public class Hello { public static void main(String[] args) { System.out.println("$$$$$$$ ...

  5. C++分类

    VS的ncb.pdb文件分析 在C/C++函数中使用可变参数 #pragma VS查看DLL接口 线程本地存储TLS(Thread Local Storage)的原理和实现--分类和原理

  6. 观察者模式--java jdk中提供的支持

    一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...

  7. Java读写文件方法总结

    Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...

  8. .net framework 4.6.2 下载

    .net framework   .net framework版本: 4.6.2 File Name: NDP462-KB3151800-x86-x64-AllOS-ENU.exe 发布日期: 201 ...

  9. c#MD5珍藏

    c#MD5珍藏 using System; using System.Collections.Generic; using System.Text; namespace MD5 { public cl ...

  10. SPOJ AMR10I Dividing Stones --DFS

    题意:给n个石头,分成一些部分(最多n部分,随便分),问分完后每部分的数量的乘积有多少种情况. 分析:可以看出,其实每个乘积都可以分解为素数的乘积,比如乘积为4,虽然可以分解为4*1,但是更可以分解为 ...