GDAL C++ API 学习之路 (5) OGRGeometry 几何类 OGRGeometry

这篇具有很好参考价值的文章主要介绍了GDAL C++ API 学习之路 (5) OGRGeometry 几何类 OGRGeometry。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Distance

virtual double Distance(const OGRGeometry*) const

计算两个几何之间的距离        返回两个几何图形之间的最短距离。距离表示为与几何坐标相同的单位

参数:

poOtherGeom -- 另一个要比较的几何图形。

返回: 几何图形之间的距离,如果发生错误,则为 -1

// 创建两个点
OGRPoint point1(0, 0);
OGRPoint point2(3, 4);

// 计算两个点之间的距离
double distance = point1.Distance(&point2);

cout << "Distance between point1 and point2: " << distance << endl;

ConvexHull

Virtual OGRGeometry *ConvexHull() const

计算凸包        将创建并返回一个新的几何对象,其中包含调用该方法的几何的凸包

返回: 现在由调用方拥有的新分配的几何图形,或失败时为 NULL

    // 创建一个线环(LinearRing)
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(1, 0);
    ring.addPoint(1, 1);
    ring.addPoint(0, 1);
    ring.addPoint(0, 0);

    // 创建一个多边形(Polygon)
    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算凸包
    OGRGeometry* convexHull = polygon.ConvexHull();

    // 输出凸包的WKT表示
    char* wkt;
    convexHull->exportToWkt(&wkt);
    std::cout << "Convex Hull: " << wkt << std::endl;

    // 释放内存
    CPLFree(wkt);
    delete convexHull;

ConcaveHull

virtual OGRGeometry *ConcaveHull(double dfRatio, bool bAllowHoles) const

计算几何图形的“凹壳”        计算几何图形的“凹壳”

凹壳完全包含在凸包内,并且还包含输入的所有点,但面积较小。面积比是凸包和凹壳面积的比值。常用于将多点转换为多边形区域。包含输入几何图形中的所有点

参数:

  • dfRatio -- 凸包和凹包面积的比率。

  • bAllowHole -- 是否允许孔。

返回: 现在由调用方拥有的新分配的几何图形,或失败时为 NULL

    // 创建一个线环(LinearRing)
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(1, 0);
    ring.addPoint(1, 1);
    ring.addPoint(0, 1);
    ring.addPoint(0, 0);

    // 创建一个多边形(Polygon)
    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算凹多边形凸包
    double concaveHullRatio = 0.8; // 指定一个凹多边形凸包的压缩比例
    bool allowHoles = true;        // 允许生成含有洞的凹多边形凸包
    OGRGeometry* concaveHull = polygon.ConcaveHull(concaveHullRatio, allowHoles);

    // 输出凹多边形凸包的WKT表示
    char* wkt;
    concaveHull->exportToWkt(&wkt);
    std::cout << "Concave Hull: " << wkt << std::endl;

    // 释放内存
    CPLFree(wkt);
    delete concaveHull;


Buffer

virtual OGRGeometry *Buffer(double dfDist, int nQuadSegs = 30) const

计算几何的缓冲区

生成一个新几何图形,其中包含调用该几何图形的缓冲区。缓冲区是一个面,其中包含原始几何的缓冲距离内的区域

某些缓冲区部分被正确描述为曲线,但会转换为近似多边形。nQuadSegs 参数可用于控制应使用多少条线来定义 90 度曲线 - 圆的象限。值 30 是合理的默认值。较大的值会导致生成的缓冲区几何中出现大量顶点,而较小的数字会降低结果的准确性

参数:

  • dfDist -- 要应用的缓冲距离。应表示为与几何坐标相同的单位。

  • nQuadSegs -- 用于近似 90 度(象限)曲率的段数。

返回: 新创建的几何图形,如果发生错误,则为 NULL

 // 创建一个点(Point)
 OGRPoint point(0, 0);

// 对点进行缓冲区分析,生成一个缓冲区几何对象
double bufferDistance = 1.0; // 缓冲区的距离
int numQuadSegments = 30;    // 四边形段数,用于控制缓冲区的平滑程度
OGRGeometry* buffer = point.Buffer(bufferDistance, numQuadSegments);

Intersection

Virtual OGRGeometry *Intersection(const OGRGeometry*) const

计算交集

生成一个新的几何图形,它是操作的两个几何图形的交点区域。Intersects() 方法可用于测试两个几何图形是否相交

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 另一个几何与“这个”几何相交。

返回: 表示交点的新几何图形,如果没有交集或发生错误,则为 NULL

    // 创建两个多边形对象
    OGRLinearRing ring1, ring2;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    ring2.addPoint(0.5, 0.5);
    ring2.addPoint(0.5, 1.5);
    ring2.addPoint(1.5, 1.5);
    ring2.addPoint(1.5, 0.5);
    ring2.addPoint(0.5, 0.5);

    OGRPolygon polygon1, polygon2;
    polygon1.addRing(&ring1);
    polygon2.addRing(&ring2);

    // 计算两个多边形的交集
    OGRGeometry* intersection = polygon1.Intersection(&polygon2);

Union

Virtual OGRGeometry *Union(const OGRGeometry*) const 

计算联合

生成一个新的几何图形,该几何图形是操作的两个几何图形的并集区域

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 与“这个”几何结合的其他几何。

返回:  表示并集或 NULL 的新几何图形(如果发生错误)

// 创建两个多边形对象
    OGRLinearRing ring1, ring2;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    ring2.addPoint(0.5, 0.5);
    ring2.addPoint(0.5, 1.5);
    ring2.addPoint(1.5, 1.5);
    ring2.addPoint(1.5, 0.5);
    ring2.addPoint(0.5, 0.5);

    OGRPolygon polygon1, polygon2;
    polygon1.addRing(&ring1);
    polygon2.addRing(&ring2);

    // 计算两个多边形的并集
    OGRGeometry* unionGeometry = polygon1.Union(&polygon2);

UnionCascaded

Virtual OGRGeometry *UnionCascaded() const

使用级联计算联合        输入几何必须是多面

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

返回: 表示并集或 NULL 的新几何图形(如果发生错误)

    // 创建一个多边形对象
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 1);
    ring.addPoint(1, 1);
    ring.addPoint(1, 0);
    ring.addPoint(0, 0);

    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算多边形与其自身的并集
    OGRGeometry* unionGeometry = polygon.UnionCascaded();
  • Virtual OGRGeometry *UnionCascaded() const: 这个函数用于返回当前几何对象与其自身的联合(Union)。也就是说,它将当前几何对象中的所有几何组件进行联合操作,得到一个包含所有组件的新几何对象。例如,如果当前几何对象是一个多边形,且其中包含了多个不相交的环,那么该函数将返回一个新的多边形,其中包含了所有环的联合结果。

  • Virtual OGRGeometry *Union(const OGRGeometry*) const: 这个函数用于返回当前几何对象与另一个几何对象的联合(Union)。也就是说,它将当前几何对象与另一个几何对象进行联合操作,得到一个包含两个几何对象的所有组件的新几何对象。例如,如果当前几何对象是一个多边形,而传入的参数是另一个多边形,那么该函数将返回一个新的多边形,其中包含了两个多边形的联合结果

  • 总结:

  • UnionCascaded() 函数用于计算当前几何对象内部的联合结果。
  • Union(const OGRGeometry*) 函数用于计算当前几何对象与另一个几何对象的联合结果

UnaryUnion

OGRGeometry *UnaryUnion() const

返回单个几何图形的所有组件的并集        通常用于将集合转换为覆盖相同区域的最小多边形集

返回: 表示并集或 NULL 的新几何图形(如果发生错误)

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 2);
    ring2.addPoint(2, 2);
    ring2.addPoint(2, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的一元并集
    OGRGeometry* unaryUnionGeometry = polygon1.Union(&polygon2);

Difference

virtual OGRGeometry *Difference(const OGRGeometry*) const

计算差异

生成一个新几何图形,该几何图形是该几何图形的区域,并删除了第二个几何图形的区域

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 从“this”几何中删除的其他几何图形。

返回:  表示差值的新几何图形,如果差值为空或发生错误,则为 NULL

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 2);
    ring1.addPoint(2, 2);
    ring1.addPoint(2, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 3);
    ring2.addPoint(3, 3);
    ring2.addPoint(3, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的差异
    OGRGeometry* differenceGeometry = polygon1.Difference(&polygon2);

SymDifference

virtual OGRGeometry *SymDifference(const OGRGeometry*) const

计算对称差分

生成一个新的几何图形,该几何图形是此几何图形与传递到方法中的第二个几何图形的对称差值

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 其他几何形状。

返回:  表示对称差值的新几何图形,如果差值为空或发生错误,则为 NULL

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 2);
    ring1.addPoint(2, 2);
    ring1.addPoint(2, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 3);
    ring2.addPoint(3, 3);
    ring2.addPoint(3, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的对称差异
    OGRGeometry* symDifferenceGeometry = polygon1.SymDifference(&polygon2);

Centroid

virtual OGRErr Centroid(OGRPoint *poPoint) const

计算几何质心

质心位置应用于传入的 OGRPoint 对象。质心不一定在几何图形内

返回:  OGRERR_NONE成功或OGRERR_FAILURE错误文章来源地址https://www.toymoban.com/news/detail-604021.html

    // 创建一个多边形对象
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 4);
    ring.addPoint(4, 4);
    ring.addPoint(4, 0);
    ring.addPoint(0, 0);

    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 创建一个空的 OGRPoint 对象用于存储质心
    OGRPoint centroidPoint;

    // 计算多边形对象的质心
    OGRErr err = polygon.Centroid(&centroidPoint);

    if (err == OGRERR_NONE) {
        // 输出质心的坐标
        double x = centroidPoint.getX();
        double y = centroidPoint.getY();
        std::cout << "Centroid coordinates: (" << x << ", " << y << ")" << std::endl;
    } else {
        std::cout << "Error calculating centroid." << std::endl;







到了这里,关于GDAL C++ API 学习之路 (5) OGRGeometry 几何类 OGRGeometry的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • gdal创建wkt几何对象

    示例代码: 结果:

    2024年02月09日
    浏览(55)
  • Java 调用gdal API(二)——栅格裁剪

    gdal可以说是GIS数据处理比较好的工具之一,虽然也提供了Java API,但是官方文档确实太过简单,用起来确实太难受,每次都需要去参考对应的C++api,然后在对应使用。 因此小编决定从这篇文章开始,将自己以前以及今后用到的API,都记录下,以帮助更多从事java GIS服务开发者

    2024年02月16日
    浏览(36)
  • C++学习之路(C++初阶)——类和对象(上)

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : C++初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言       🛰️友友们的支持是本博主更新的动力   本博客主要为学习C++类和对象内容做准备,开头补充

    2024年02月07日
    浏览(49)
  • c++的学习之路:22、多态(1)

    本章主要是说一些多态的开头。 目录 摘要 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 2.2、虚函数 2.3、虚函数的重写 2.4、C++11 override 和 final  2.5、重载、覆盖(重写)、隐藏(重定义)的对比 三、思维导图 多态的概念:通俗来说,就是多种形态,具体点就是去

    2024年04月14日
    浏览(70)
  • 【C++ Core Guidelines解析】C++学习之路的一盏明灯

    前言: C++语言的功能非常丰富,表达能力非常强。 因为一种成功的通用编程语言拥有的功能必须比任何开发人员所需要的更多,任何一种有生命力且不断发展的语言都会不断积累用于表达程序员思想的替代用法。这会导致选择过载。那么,开发人员应该如何根据编程风格和

    2024年02月09日
    浏览(36)
  • 基于C++、GDAL、OpenCV的矢量数据骨架线提取算法

    基于C++、GDAL、OpenCV的矢量数据骨架线提取算法 CGAL已经实现了该功能,但由于CGAL依赖于Boost库,编译后过大,因此本文所采用的这套方式实现骨架线提取功能。 效果: 思路: 1、将导入shp按照要素逐一拆分成新的shp 2、将所有拆分后的shp分别转栅格,利用OpenCV提取骨架线 3、

    2024年02月12日
    浏览(70)
  • C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

    这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。 功能描述: 创建窗口和布局: 使用 QWidget 和 QVBoxLayout 创建主窗口并设置垂直布局,将按钮放置

    2024年02月04日
    浏览(65)
  • 创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

      本文介绍基于 C++ 语言 GDAL 库, 批量创建 大量栅格遥感影像文件,并将数据批量写入其中的方法。   首先,我们来明确一下本文所需实现的需求。已知我们对 大量遥感影像 进行了批量读取与数据处理操作——具体过程可以参考文章C++ GDAL提取多时相遥感影像中像素随

    2024年02月19日
    浏览(41)
  • C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组

      本文介绍基于 C++ 语言 GDAL 库, 批量读取 大量栅格遥感影像文件,并生成 各像元数值的时间序列 数组的方法。   首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多不同格式的文件,如下图所示。   其中,我们首先需要遍历这一文件

    2024年02月19日
    浏览(34)
  • 在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)

      本文介绍在 Visual Studio 软件中配置、编译 C++ 环境下 GDAL 库、 SQLite 环境与 PROJ 库的详细方法。    GDAL 库是一个非常方便的地理数据处理库,但其在 C++ 环境下的配置与编译流程较为复杂;尤其是最新的 GDAL 3 及以上版本,其在 C++ 环境中的配置更是首先需要满足许多其

    2024年02月19日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包