记一次geos内存申请释放的崩溃查错

原先的错误代码:

const GeometryFactory *pGeomFactory = GeometryFactory::getDefaultInstance();
const CoordinateSequenceFactory *pCoordFactory = CoordinateArraySequenceFactory::instance();

// 构造
typedef map<int,Geometry*> Polygons;
Polygons plygns;
for (int iVal=0; iVal<nEntities; ++iVal)
{
    SHPObject *pObj = SHPReadObject(hShp, iVal);

    LinearRing *pRingExt = NULL;
    <span style="color:#ff0000;">vector<Geometry*> vecRingInt;</span>
    for (int iPart=0; iPart<pObj->nParts; ++iPart)
    {
        int iBeg = pObj->panPartStart[iPart];
        int iEnd = iPart==pObj->nParts-1 ? pObj->nVertices:pObj->panPartStart[iPart+1];
        int iSize = iEnd-iBeg;

        CoordinateSequence* pCs = pCoordFactory->create(iSize,2);
        for (int iCoord=0; iCoord<iSize; ++iCoord)
            pCs->setAt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GEOS(Geometry Engine - Open Source,几何引擎开源库)是一个用于处理地理空间数据的C++库,提供了许多的几何分析函数,包括缓冲区分析。 要利用GEOS求一条线的缓冲区的外框线,可以按照以下步骤进行: 1. 定义线要素 首先需要定义一条线的要素,可以使用GEOS提供的GEOSGeom_createLineString函数创建一个线要素。 ```c GEOSCoordSequence* coords = GEOSCoordSeq_create(2, 2); GEOSCoordSeq_setX(coords, 0, 0.0); GEOSCoordSeq_setY(coords, 0, 0.0); GEOSCoordSeq_setX(coords, 1, 1.0); GEOSCoordSeq_setY(coords, 1, 1.0); GEOSGeometry* line = GEOSGeom_createLineString(coords); ``` 2. 计算缓冲区 使用GEOS提供的GEOSBuffer函数计算线的缓冲区,并指定缓冲区的半径和缓冲区的段数。 ```c double bufferDistance = 0.1; int bufferSegments = 16; GEOSGeometry* buffer = GEOSBuffer(line, bufferDistance, bufferSegments); ``` 3. 获取缓冲区的外框线 缓冲区的外框线是指缓冲区的边界线,可以使用GEOS提供的GEOSGeom_getExteriorRing函数获取缓冲区的外框线。 ```c GEOSGeometry* exterior = GEOSGeom_getExteriorRing(buffer); ``` 4. 输出外框线的坐标 最后可以使用GEOS提供的GEOSGeom_getCoordSeq函数获取外框线的坐标序列,并输出坐标。 ```c const GEOSCoordSequence* exteriorCoords = GEOSGeom_getCoordSeq(exterior); unsigned int exteriorSize = 0; GEOSCoordSeq_getSize(exteriorCoords, &exteriorSize); for (unsigned int i = 0; i < exteriorSize; i++) { double x, y; GEOSCoordSeq_getX(exteriorCoords, i, &x); GEOSCoordSeq_getY(exteriorCoords, i, &y); printf("(%f, %f)\n", x, y); } ``` 完整代码示例: ```c #include <geos_c.h> #include <stdio.h> int main() { // 创建线要素 GEOSCoordSequence* coords = GEOSCoordSeq_create(2, 2); GEOSCoordSeq_setX(coords, 0, 0.0); GEOSCoordSeq_setY(coords, 0, 0.0); GEOSCoordSeq_setX(coords, 1, 1.0); GEOSCoordSeq_setY(coords, 1, 1.0); GEOSGeometry* line = GEOSGeom_createLineString(coords); // 计算缓冲区 double bufferDistance = 0.1; int bufferSegments = 16; GEOSGeometry* buffer = GEOSBuffer(line, bufferDistance, bufferSegments); // 获取缓冲区的外框线 GEOSGeometry* exterior = GEOSGeom_getExteriorRing(buffer); // 输出外框线的坐标 const GEOSCoordSequence* exteriorCoords = GEOSGeom_getCoordSeq(exterior); unsigned int exteriorSize = 0; GEOSCoordSeq_getSize(exteriorCoords, &exteriorSize); for (unsigned int i = 0; i < exteriorSize; i++) { double x, y; GEOSCoordSeq_getX(exteriorCoords, i, &x); GEOSCoordSeq_getY(exteriorCoords, i, &y); printf("(%f, %f)\n", x, y); } // 释放内存 GEOSGeom_destroy(line); GEOSGeom_destroy(buffer); GEOSGeom_destroy(exterior); GEOSCoordSeq_destroy(coords); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值