博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GEOS库的学习之二:简单几何图形的创建
阅读量:5064 次
发布时间:2019-06-12

本文共 2533 字,大约阅读时间需要 8 分钟。

几何图形(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); //如果多边形中间没有孔洞,第二个参数设为NULL    return poly;}

测试:

#include "geos.h"int main(){       LineString *ls=createGeosRing(10,10,5);    cout<<"线条点数:"<
getNumPoints()<<" 线条长度:"<
getLength()<
getArea()<

 

转载于:https://www.cnblogs.com/denny402/p/4967049.html

你可能感兴趣的文章
SpringMVC的@Validated校验注解使用方法
查看>>
Python之os模块
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
【蓝桥杯】PREV-21 回文数字
查看>>
html 简介
查看>>
python使用上下文对代码片段进行计时,非装饰器
查看>>
js中比较实用的函数用法
查看>>
安装预览版镜像后无法检测到预览版更新的解决方案
查看>>
【bzoj5099】[POI2018]Pionek 双指针法
查看>>
别让安全问题拖慢了 DevOps!
查看>>
JAR打包和运行
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
idea设置自定义图片
查看>>
[高级]Android多线程任务优化1:探讨AsyncTask的缺陷
查看>>
选择器
查看>>
rownum 的使用
查看>>
Mysql与Oracle 的对比
查看>>
MVC系列博客之排球计分(三)模型类的实现
查看>>