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

该文描述了一个将几何图形转换为2D的过程,通过flattenTo2D方法消除Z和M坐标。文章还展示了如何将几何对象导出为GML、KML和GeoJSON格式,并介绍了与GEOS库交互的方法。此外,讨论了检测和获取曲线及线性几何的功能,以及设置几何为3D和包含M坐标的能力。
摘要由CSDN通过智能技术生成

flattenTo2D

virtual void flattenTo2D() = 0

将几何图形转换为严格的 2D        从某种意义上说,这会将所有 Z 坐标转换为 0.0

class MyPoint : public OGRPoint {
public:
    void flattenTo2D() override {
        // 将几何图形的坐标点转换为二维坐标,去除 Z 和 M 坐标信息
        if (getCoordinateDimension() > 2) {
            setZ(0);
        }
        if (getCoordinateDimension() > 3) {
            setM(0);
        }
    }
};

int main() {
    // 创建一个自定义的派生类对象
    MyPoint point;
    point.setX(1);
    point.setY(2);
    point.setZ(3);
    point.setM(4);

    // 打印原始坐标信息
    std::cout << "原始坐标信息:" << std::endl;
    std::cout << "X: " << point.getX() << std::endl;
    std::cout << "Y: " << point.getY() << std::endl;
    std::cout << "Z: " << point.getZ() << std::endl;
    std::cout << "M: " << point.getM() << std::endl;

    // 执行 flattenTo2D 函数,将几何图形转换为二维坐标
    point.flattenTo2D();

    // 打印转换后的坐标信息
    std::cout << "转换后的坐标信息:" << std::endl;
    std::cout << "X: " << point.getX() << std::endl;
    std::cout << "Y: " << point.getY() << std::endl;
    std::cout << "Z: " << point.getZ() << std::endl;
    std::cout << "M: " << point.getM() << std::endl;

    return 0;
}

exportToGML

virtual char *exportToGML(const char *const *papszOptions = nullptr) const

将几何图形转换为 GML 格式        当不再需要时,应使用 CPLFree() 释放返回的字符串

参数:

papszOptions -- 以 NULL 结尾的选项列表。

返回: GML 片段或 NULL 以防出现错误

// 创建一个点对象
    OGRPoint point(1, 2);

    // 导出为 GML 格式
    char* gmlString = point.exportToGML();

    // 打印导出的 GML 字符串
    std::cout << "导出的 GML 字符串:" << std::endl;
    std::cout << gmlString << std::endl;

    // 释放内存
    CPLFree(gmlString);

exportToKML

Virtual char *exportToKML() const        

将几何转换为 KML 格式        当不再需要时,应使用 CPLFree() 释放返回的字符串

返回: KML 片段或空(如果出现错误)

// 创建一个点对象
OGRPoint point(1, 2);

// 导出为 KML 格式
char* kmlString = point.exportToKML();

// 打印导出的 KML 字符串
std::cout << "导出的 KML 字符串:" << std::endl;
std::cout << kmlString << std::endl;

exportToJson

Virtual char *exportToJson() const

将几何图形转换为 GeoJSON 格式        当不再需要时,应使用 CPLFree() 释放返回的字符串

返回: GeoJSON 片段或 NULL 以防出错

// 创建一个线段对象
OGRLineString lineString;
lineString.addPoint(0, 0);
lineString.addPoint(1, 1);
lineString.addPoint(2, 2);

// 导出为 JSON 格式
char* jsonString = lineString.exportToJson();

// 打印导出的 JSON 字符串
std::cout << "导出的 JSON 字符串:" << std::endl;
std::cout << jsonString << std::endl;

exportToGEOS

virtual GEOSGeom exportToGEOS(GEOSContextHandle_t hGEOSCtxt) const

返回与几何图形对应的 GEOSGeom 对象

参数:

hGEOSCtxt -- GEOS 上下文

返回: 与几何图形对应的 GEOSGeom 对象

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

// 导出为 GEOS 几何对象
GEOSContextHandle_t geosContext = OGRGeometry::createGEOSContext();
GEOSGeom geosGeom = point.exportToGEOS(geosContext);

// 打印导出的 GEOS 几何对象
char* wkt = GEOSGeomToWKT(geosGeom);
std::cout << "导出的 GEOS 几何对象:" << wkt << std::endl;

// 释放内存
CPLFree(wkt);
GEOSGeom_destroy(geosGeom);
OGRGeometry::freeGEOSContext(geosContext);

hasCurveGeometry

virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const

如果此几何图形是或具有曲线几何图形,则返回此几何图形

参数:

bLookForNonLinear -- 将其设置为 TRUE 以检查几何图形是否为 CIRCULARSTRING 或包含 CIRCULARSTRING。

返回: 如果此几何图形是或具有曲线几何图形,则为 TRUE

    // 创建一个线字符串对象
    OGRLineString lineString;
    lineString.addPoint(0, 0);
    lineString.addPoint(1, 1);
    lineString.addPoint(2, 0);

    // 检查是否存在曲线几何
    OGRBoolean hasCurve = lineString.hasCurveGeometry();

    // 输出结果
    if (hasCurve)
        std::cout << "线字符串包含曲线几何" << std::endl;
    else
        std::cout << "线字符串不包含曲线几何" << std::endl;

getCurveGeometry

virtual OGRGeometry *getCurveGeometry(const char *const *papszOptions = NULLPTR) const

返回此几何图形的曲线版本        如果几何图形没有曲线部分,则返回的几何图形将是它的克隆

相反的方法是OGRGeometry::getLinearGeometry()。

参数:

papszOptions -- 选项作为以 null 结尾的字符串列表。暂时未使用。必须设置为 NULL。

返回: 新的几何图形

// 创建一个多边形几何对象
    OGRPolygon polygon;
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 1);
    ring.addPoint(1, 1);
    ring.addPoint(1, 0);
    ring.addPoint(0, 0);
    polygon.addRing(&ring);

    // 获取曲线几何对象
    OGRGeometry* curveGeometry = polygon.getCurveGeometry();

getLinearGeometry

virtual OGRGeometry *getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, const char *const *papszOptions = nullptr) const

返回此几何图形的非曲线版本,可能是近似值        相反的方法是OGRGeometry::getCurveGeometry()。

参数:

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

  • papszOptions -- 选项作为以 null 结尾的字符串列表。请参阅 OGRGeometryFactory::curveToLineString() 了解有效选项。

返回:  新的几何图形

// 创建一个曲线几何对象
    OGRLineString curve;
    curve.addPoint(0, 0);
    curve.addPoint(1, 1);
    curve.addPoint(2, 0);

    // 获取线性几何对象
    OGRGeometry* linearGeometry = curve.getLinearGeometry();

closeRings

virtual void closeRings()

强制封闭环        如果此几何或任何包含的几何具有未闭合的多边形环,则将通过在末尾添加起点来闭合它们

// 创建一个多边形几何对象
    OGRPolygon polygon;
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 1);
    ring.addPoint(1, 1);
    ring.addPoint(1, 0);
    polygon.addRing(&ring);

    // 封闭多边形的环
    polygon.closeRings();

    // 打印多边形的环状态
    printf("Is ring closed: %d\n", ring.isClosed());

set3D

virtual void set3D(OGRBoolean bIs3D)

添加或删除 Z 坐标维度。

此方法添加或删除显式 Z 坐标尺寸,移除几何的 Z 坐标尺寸将移除所有现有的 Z 值。将 Z 维度添加到几何集合、复合曲线、多边形等。会影响子几何形状。

参数:

bIs3D -- 几何图形是否应具有 Z 维,即 TRUE 或 FALSE

// 创建一个三维点
    OGRPoint point(1.0, 2.0, 3.0);
    
    // 输出点的坐标
    printf("Before setting 3D: (%.2f, %.2f, %.2f)\n", point.getX(), point.getY(), point.getZ());
    
    // 将点设置为三维
    point.set3D(TRUE);
    
    // 输出点的坐标
    printf("After setting 3D: (%.2f, %.2f, %.2f)\n", point.getX(), point.getY(), point.getZ());

setMeasured

virtual void setMeasuredOGRBoolean bIsMeasured)

添加或删除 M 坐标维度

此方法添加或删除显式 M 坐标维度。移除几何图形的 M 坐标尺寸将移除任何现有的 M 值。将 M 维添加到几何集合、复合曲线、多边形等。会影响子几何形状

参数:

bIsMeasured -- 几何图形是否应具有 M 维,即 TRUE 或 FALSE

 // 创建一个带有 X、Y 和 M 坐标的点
    OGRPoint point(1.0, 2.0, 0.0);
    
    // 输出点的坐标和 M 值
    printf("Before setting measured: (%.2f, %.2f), M = %.2f\n", point.getX(), point.getY(), point.getM());
    
    // 将点设置为带有 M 坐标
    point.setMeasured(TRUE);
    point.setM(3.0);
    
    // 输出点的坐标和 M 值
    printf("After setting measured: (%.2f, %.2f), M = %.2f\n", point.getX(), point.getY(), point.getM());

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

场主不吃鍋巴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值