GDAL C++ API 学习之路 (2) 几何工厂类 OGRGeometryFactory

forceToPolygon

static OGRGeometry *forceToPolygon(OGRGeometry*)

转换为多边形

参数:

poGeom - 输入几何 - 所有权传递给方法。

返回: 新几何图形

// 创建一个点几何对象
    OGRPoint* point = new OGRPoint(10.0, 20.0);

    // 使用 forceToPolygon 方法将点转换为多边形
    OGRGeometry* polygon = OGRGeometryFactory::forceToPolygon(point);

    // 检查是否成功转换为多边形
    if (polygon != nullptr && polygon->getGeometryType() == wkbPolygon) {
        // 执行其他操作...
        // ...

forceToLineString

static OGRGeometry *forceToLineStringOGRGeometry*, bool bOnlyInOrder true)

转换为线字符串

参数:

  • poGeom - 输入几何 - 所有权传递给方法。

  • bOnlyInOrder -- 标志,如果设置为 FALSE,则指示如果线串中的点顺序能够匹配另一个线串的末端,则点的顺序可能会颠倒。如果设置为 TRUE,则一个线串的开头必须与另一个线串的结尾匹配

返回:新几何图形

// 创建一个多边形几何对象
    OGRPolygon polygon;
    OGRLinearRing ring;
    ring.addPoint(0, 1);
    ring.addPoint(1, 1);
    ring.addPoint(1, 0);
    ring.addPoint(0, 0);
    polygon.addRing(&ring);
//这段代码创建了一个 OGRPolygon 对象 polygon 和一个 OGRLinearRing 对象 ring。然后,通过调用 addPoint() 方法向 ring 添加一系列顶点坐标,定义了一个闭合的线性环。

//接下来,通过调用 addRing() 方法将 ring 添加到 polygon 中,形成一个多边形的几何形状。最后,polygon 对象表示了一个由四个顶点组成的矩形

// 将多边形几何对象强制转换为线几何对象
OGRGeometry* lineString = OGRGeometryFactory::forceToLineString(&polygon);

forceToMultiPolygon

static OGRGeometry *forceToMultiPolygon(OGRGeometry*)

转换为多多边形

返回:新几何图形

// 创建一个多边形对象
OGRPolygon* polygon = new OGRPolygon();
OGRLinearRing* ring = new OGRLinearRing();
ring->addPoint(0, 0);
ring->addPoint(0, 1);
ring->addPoint(1, 1);
ring->addPoint(1, 0);
ring->addPoint(0, 0);
polygon->addRingDirectly(ring);

// 将多边形对象转换为多多边形对象
OGRGeometry* multiPolygon = forceToMultiPolygon(polygon);

forceToMultiPoint

static OGRGeometry *forceToMultiPoint(OGRGeometry*)

转换为多点

返回:新几何图形

// 创建一个点对象
OGRPoint* point = new OGRPoint(10, 20);

// 将点对象转换为多点对象
OGRGeometry* multiPoint = forceToMultiPoint(point);

forceToMultiLineString

static OGRGeometry *forceToMultiLineString(OGRGeometry*)

转换为多线字符串

返回:新几何图形

OGRLineString* lineString = new OGRLineString();
lineString->addPoint(0, 0);
lineString->addPoint(1, 1);
lineString->addPoint(2, 2);

// 将线串对象转换为多线串对象
OGRGeometry* multiLineString = forceToMultiLineString(lineString);

forceTo

static OGRGeometry *forceToOGRGeometry *poGeom, OGRwkbGeometryType eTargetType, const char *const *papszOptions = nullptr)

转换为其他几何类型

参数:

  • poGeom - 输入几何 - 所有权传递给方法。

  • eTargetType -- 目标输出几何类型。

  • papszOptions -- 选项作为以 null 结尾的字符串列表或 NULL。

返回:  新几何图形

// 创建一个几何对象
OGRPoint* point = new OGRPoint(10, 20);

// 将几何对象转换为指定类型的几何对象
OGRGeometry* convertedGeom = forceTo(point, wkbPolygon);

removeLowerDimensionSubGeoms

static OGRGeometry *removeLowerDimensionSubGeomsconst OGRGeometry *poGeom)

从几何集合中删除不具有集合最大拓扑维数的子几何

从给定的几何对象中移除低维度的子几何对象。在几何对象的层次结构中,低维度的子几何对象指的是维度比父级几何对象低的子对象

例如,如果几何对象是一个多几何对象,包含点、线和面,那么点和线就是低维度的子几何对象,面是高维度的子几何对象。使用 removeLowerDimensionSubGeoms 函数可以移除点和线,只保留面

参数:

poGeom -- 输入几何

返回: 新的几何图形

// 创建一个多几何对象,包含点、线和面
OGRMultiGeometry* multiGeom = new OGRMultiGeometry();
multiGeom->addGeometry(new OGRPoint(0, 0));
multiGeom->addGeometry(new OGRLineString({{1, 1}, {2, 2}}));
multiGeom->addGeometry(new OGRPolygon());

// 移除低维度的子几何对象
OGRGeometry* resultGeom = removeLowerDimensionSubGeoms(multiGeom);

organizePolygons

static OGRGeometry *organizePolygons(OGRGeometry **papoPolygons, int nPolygonCount, int *pbResultValidGeometry, const char **papszOptions = nullptr)

根据几何组织面

参数:

  • papoPolygons - 几何指针数组 - 都应该是OGRPolygons或OGRCurvePolygons。传递几何图形的所有权,但不传递数组本身的所有权。

  • nPolygonCount -- papoPolygons 中的项目数

  • pbIsValidGeometry -- 如果检测到无效结果,则值可能设置为 FALSE。有效性检查因使用的方法而异,并且仅限于将内环链接到外环所需的检查,因此 TRUE 的结果并不意味着 OGRGeometry::IsValid() 返回 TRUE。

  • papszOptions -- 用于传递选项的字符串列表

返回: 单个生成的几何图形(OGRPolygonOGRCurvePolygon,OGRMultiPolygonOGRMultiSurfaceOGRGeometryCollection)。 在 nPolygonCount 为 0 的情况下返回 POLYGON EMPTY

意义:

organizePolygons 函数的作用是对一组多边形进行组织,将重叠的多边形进行合并,并将非重叠的多边形保持不变。

多边形组织的目的是消除重叠的部分,以便更方便地进行空间分析和处理。通过将重叠的多边形合并为一个更大的多边形,可以简化空间操作和查询,减少重复计算,并提高处理效率。

// 假设有两个多边形对象
OGRPolygon polygon1;
OGRPolygon polygon2;

// 将两个多边形对象存储在数组中
OGRGeometry* polygons[] = { &polygon1, &polygon2 };

// 定义变量来存储结果的有效性
int resultValidGeometry;

// 调用 organizePolygons 函数进行多边形的组织
OGRGeometry* organizedGeometry = OGRGeometryFactory::organizePolygons(polygons, 2, &resultValidGeometry);

haveGEOS

static bool haveGEOS()

测试是否启用了 GEOS        如果 OGR 中内置了 GEOS 支持,则此静态方法返回 TRUE,否则返回 FALSE

返回: 如果可用,则为 TRUE,否则为 FALSE

bool hasGEOS = OGRGeometry::haveGEOS();
    
    if (hasGEOS) {
        // GEOS 已安装
        // 执行相关操作
    } else {
        // GEOS 未安装
        // 执行其他操作
    }

transformWithOptions

static OGRGeometry *transformWithOptionsconst OGRGeometry *poSrcGeom, OGRCoordinateTransformation *poCT, char **papszOptions, const TransformWithOptionsCache &cache = TransformWithOptionsCache ())

变换几何图形

参数:

  • poSrcGeom -- 源几何

  • poCT -- 坐标转换对象,或 NULL。

  • papszOptions -- 选项。包括 WRAPDATELINE=YES 和 DATELINEOFFSET=。

  • 缓存 -- 缓存。如果在调用之间持续存在,可能会提高性能

返回:(新)转换的几何图形

// 创建源几何对象
    OGRPoint srcPoint(10.0, 20.0);
    
    // 创建坐标转换对象
    OGRSpatialReference* srcSRS = new OGRSpatialReference();
    OGRSpatialReference* tgtSRS = new OGRSpatialReference();
    OGRCoordinateTransformation* transform = OGRCreateCoordinateTransformation(srcSRS, tgtSRS);
    
    // 定义转换选项
    char* options[] = { "OPTION1=VALUE1", "OPTION2=VALUE2", nullptr };
    
    // 进行几何转换
    OGRGeometry* transformedGeom = OGRGeometry::transformWithOptions(&srcPoint, transform, options);

approximateArcAngles

static OGRGeometry *approximateArcAngles(double dfX, double dfY, double dfZ, double dfPrimaryRadius, double dfSecondaryAxis,double dfRotation, double dfStartAngle, 

double dfEndAngle, double dfMaxAngleStepSizeDegrees, const bool bUseMaxGap = false)

描弧到线串         根据中心点、半径、起始角度和结束角度(所有角度(以度为单位)将圆弧描边到线串

参数:

  • dfCenterX -- Center X

  • dfCenter Y -- 中心 Y

  • dfZ -- 中心 Z

  • dfPrimaryRadius -- 椭圆的 X 半径。

  • dfSecondaryRadius -- 椭圆的 Y 半径。

  • dfRotation -- 椭圆顺时针旋转。

  • dfStartAngle -- 与弧上第一个点的角度(X 正的顺时针方向)

  • dfEndAngle -- 与弧上最后一个点的角度(X 正顺时针方向)

  • dfMaxAngleStepSizeDegrees -- 沿弧的最大步长(以度为单位),使用默认设置为零。

  • buseMaxGap -- 可选:是否遵守OGR_ARC_MAX_GAP。

返回:  表示圆弧近似的OGRLineString几何体。

double dfX = 0.0;
double dfY = 0.0;
double dfZ = 0.0;
double dfPrimaryRadius = 10.0;
double dfSecondaryAxis = 5.0;
double dfRotation = 0.0;
double dfStartAngle = 0.0;
double dfEndAngle = 90.0;
double dfMaxAngleStepSizeDegrees = 5.0;
bool bUseMaxGap = false;

OGRGeometry* poGeom = OGRGeometryFactory::approximateArcAngles(dfX, dfY, dfZ, dfPrimaryRadius, dfSecondaryAxis, dfRotation, dfStartAngle, dfEndAngle, dfMaxAngleStepSizeDegrees, bUseMaxGap);

GetCurveParameters

static int GetCurveParameters(double x0, double y0, double x1, double y1, double x2, double y2, double &R, double &cx, double &cy, double &alpha0, double &alpha1, double &alpha2)

返回圆弧的参数        角度以弧度返回,具有三角约定(逆时针)

参数:

  • x0 -- 第一个点的 x

  • y0 -- 第一个点的 y

  • x1 -- x 为中间点

  • y1 -- y 的中间点

  • x2 -- x 最终点

  • y2 -- 最终点的 y

  • R -- 半径(输出)

  • cx -- 弧心的 x(输出)

  • cy -- 弧心的 y(输出)

  • alpha0 -- 中心和第一点之间的角度,以弧度为单位(输出)

  • alpha1 -- 中心点和中间点之间的角度,以弧度为单位(输出)

  • alpha2 -- 中心点和终点之间的角度,以弧度为单位(输出)

返回:  如果点未对齐并定义圆弧,则为 TRUE

double x0 = 0.0;
double y0 = 0.0;
double x1 = 1.0;
double y1 = 1.0;
double x2 = 2.0;
double y2 = 0.0;
double R, cx, cy, alpha0, alpha1, alpha2;

int result = OGRGeometryFactory::GetCurveParameters(x0, y0, x1, y1, x2, y2, R, cx, cy, alpha0, alpha1, alpha2);

curveToLineString

static OGRLineString *curveToLineString(double x0, double y0, double z0, double x1, double y1, double z1, double x2, double y2, double z2, int bHasZ, 

double dfMaxAngleStepSizeDegrees, const char *const *papszOptions = nullptr)

将圆弧圆转换为近似线串        圆弧由第一点、中间点和最后点定义

参数:

  • x0 -- 第一个点的 x

  • y0 -- 第一个点的 y

  • z0 -- 第一点的 z

  • x1 -- x 为中间点

  • y1 -- y 的中间点

  • Z1 -- 中间点的Z

  • x2 -- x 最终点

  • y2 -- 最终点的 y

  • Z2 -- 终点的 z

  • bHasZ -- 如果必须考虑 z 则为 TRUE

  • dfMaxAngleStepSizeDegrees -- 沿弧的最大步长(以度为单位),使用默认设置为零。

  • papszOptions -- 选项作为以 null 结尾的字符串列表或 NULL。识别的选项:

  • ADD_INTERMEDIATE_POINT=隐身/是/否(默认为隐身)。确定是否以及如何在线串中输出中间点。如果设置为 STEALTH,则不会添加显式中间点,但其属性以低有效中间点编码,OGRGeometryFactory::curveFromLineString() 可以解码它们。这是在 OGR 中往返的最佳折衷方案,也是使用 PostGIS ST_LineToCurve() 时获得更好的结果。如果设置为 YES,则中间点将显式添加到线串中。如果设置为 NO,则不显式添加中间点。

返回: 转换后的几何图形(调用方的所有权)

double x0 = 0.0, y0 = 0.0, z0 = 0.0;
    double x1 = 1.0, y1 = 1.0, z1 = 0.0;
    double x2 = 2.0, y2 = 0.0, z2 = 0.0;
    int bHasZ = 0;
    double dfMaxAngleStepSizeDegrees = 1.0;

    OGRLineString* lineString = OGRGeometryFactory::curveToLineString(x0, y0, z0, x1, y1, z1, x2, y2, z2, bHasZ, dfMaxAngleStepSizeDegrees);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

场主不吃鍋巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值