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
相关产品推荐
相关产品推荐

