You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GEOS C++:如何在geos::geom::CoordinateSequence中删除坐标?

在libgeos 3.13中实现CoordinateSequence删除指定坐标

在libgeos 3.13版本中,CoordinateArraySequence被整合进CoordinateSequence体系,原有的deleteAt功能可以通过以下两种方式实现:

方法1:直接调用erase修改原序列(针对可变实现)

如果使用的是可变类型的CoordinateSequence(比如默认的DefaultCoordinateSequence),可以直接调用erase方法删除指定位置的坐标:

#include <geos/geom/CoordinateSequence.h>
#include <geos/geom/DefaultCoordinateSequence.h>

// 创建并初始化坐标序列
auto seq = geos::geom::DefaultCoordinateSequence::create();
seq->add(geos::geom::Coordinate(0, 0));
seq->add(geos::geom::Coordinate(1, 1));
seq->add(geos::geom::Coordinate(2, 2));

// 删除索引为1的坐标(即(1,1))
if (seq->size() > 1) {
    seq->erase(seq->begin() + 1);
}

方法2:生成新序列实现删除(通用兼容方式)

如果需要兼容不可变的CoordinateSequence实现,或者需要保留原序列数据,可以通过截取子序列拼接的方式生成新序列:

#include <geos/geom/CoordinateSequence.h>
#include <geos/geom/CoordinateSequenceFactory.h>

// 获取全局坐标序列工厂
const auto& factory = geos::geom::CoordinateSequenceFactory::instance();

// 假设已有目标CoordinateSequence指针cs
std::size_t pos = 1; // 要删除的位置
if (cs->size() <= pos) {
    // 处理位置越界的情况
    return;
}

// 截取删除位置前后的子序列
auto part1 = cs->createSubsequence(0, pos);
auto part2 = cs->createSubsequence(pos + 1, cs->size() - pos - 1);

// 拼接子序列得到删除后的新序列
auto newSeq = factory->create(*part1, *part2);

// 后续使用newSeq即可,原序列cs保持不变

注意事项

  • erase方法会直接修改原序列,适合不需要保留原数据的场景;
  • createSubsequence方式生成新序列,原序列不受影响,兼容性更强;
  • 操作前必须检查目标位置pos是否在合法范围内(0 <= pos < 序列长度),避免越界错误。

内容的提问来源于stack exchange,提问作者Graphman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:39:51