1

三角形分割されたポイントがあり、選択した三角形を使用してポリゴンを作成したいと考えています。私は地理座標系を使用しているので、当然、ベクトル処理を実行するために OGR を選択します。

OGRLayer を (OGRPolygon として) 定義した後、以前に選択した三角形ごとに (OGRLinearRing を介して) OGRPolygon を作成し、それらを 1 つのポリゴンにマージすることを試みます。

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 ) );
}

その結果、クラッシュまたは空のポリゴンが発生します...

4

1 に答える 1

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 を使用しているかどうか、またはブーストまたは他のライブラリを使用しているかどうかはわかりませんが、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
    }
}
于 2012-10-22T17:16:55.177 に答える