OGR API:多边形联合

时间:2012-10-22 13:37:30

标签: union polygon ogr

我有三角点,我想用选定的三角形来制作多边形。 当我使用地理协调时,我自然选择OGR来执行矢量处理。

因此,在定义了我的OGRLayer(作为OGRPolygon)后,我为之前选择的每个三角形创建了一个OGRPolygon(通过OGRLinearRing),并将它们合并为一个多边形:

OGRPolygon ogrmerged;
for(int i=0; i<triangles.size(); i++){
    OGRLinearRing ogrring;
    ogrring.addPoint( triangles[i].a.x, triangles[i].a.y );
    ogrring.addPoint( triangles[i].b.x, triangles[i].b.y );
    ogrring.addPoint( triangles[i].c.x, triangles[i].c.y );
    ogrring.closeRings();
    OGRPolygon ogrtriangle;
    ogrtriangle.addRing( &ogrring );
    ogrmerged = *( (OGRPolygon*) ogrmerged.Union( &ogrtriangle ) );
}

结果是崩溃或空多边形......

1 个答案:

答案 0 :(得分:1)

由于Union返回一个新分配的对象,您需要确保清除旧对象。

OGRPolygon* pOgrMerged = new OGRPolygon();
for(int i=0; i<triangles.size(); i++){
    OGRLinearRing ogrring;
    ogrring.addPoint( triangles[i].a.x, triangles[i].a.y );
    ogrring.addPoint( triangles[i].b.x, triangles[i].b.y );
    ogrring.addPoint( triangles[i].c.x, triangles[i].c.y );
    ogrring.closeRings();
    OGRPolygon ogrtriangle;
    ogrtriangle.addRing( &ogrring );
    OGRPolygon* pTemp = static_cast<OGRPolygon*>(pOgrMerged->Union(&ogrtriangle));
    if (pTemp != NULL) // If you are using C++11 you could check for nullptr)
    {
        delete pOgrMerged;
        pOgrMerged = pTemp;
    }
    else
    {
        // Handle the case where the merge resulted in an error. It may be because
        // the polygons didn't overlap or something like that, check the docs for OGR
    }
}

// Do what you need to do with pOgrMerged and then return it or delete it (do not
// delete it if you are going to return it
delete pOgrMerged;

我知道这段代码使用的是原始指针。我不知道你是否正在使用C ++ 11 OR boost或其他库,但是如果你必须使用auto_ptr,我建议使用unique_ptr / shared_ptr或者包装原始指针。这样你就不会泄漏物体了。

使用unique_ptr的相同代码:

std::uniqe_ptr<OGRPolygon> pOgrMerged(new OGRPolygon());
for(int i=0; i<triangles.size(); i++){
    OGRLinearRing ogrring;
    ogrring.addPoint( triangles[i].a.x, triangles[i].a.y );
    ogrring.addPoint( triangles[i].b.x, triangles[i].b.y );
    ogrring.addPoint( triangles[i].c.x, triangles[i].c.y );
    ogrring.closeRings();
    OGRPolygon ogrtriangle;
    ogrtriangle.addRing( &ogrring );
    OGRPolygon* pTemp = static_cast<OGRPolygon*>(pOgrMerged->Union(&ogrtriangle));
    if (pTemp != NULL) // If you are using C++11 you could check for nullptr)
    {
        pOgrMerged.reset(pTemp);
    }
    else
    {
        // Handle the case where the merge resulted in an error. It may be because
        // the polygons didn't overlap or something like that, check the docs for OGR
    }
}