ポリゴンを作成
ポリゴンの作成は面倒です。
まずGEOSCoordSequence
に座標値を詰め込んで、
そのあと外形線を作成し、さらにその外形線データからポリゴンを作成するという手順を踏みます。
これだけ面倒な理由は、穴あきポリゴン対策です。
以下のサンプルは単純型のポリゴン作成例で、典型的な作成手順になるかと思います。
vector<POINT> vVertice; GEOSCoordSequence *pCoord; GEOSGeometry *pShell; GEOSGeometry *pPoly; // 座標シーケンスを作成 pCoord = GEOSCoordSeq_create( vVertice.size(), 2 ); // 座標シーケンスにデータを詰め込み for ( i = 0; i < vVertice.size(); i++ ) { GEOSCoordSeq_setX( pCoord, i, vVertice[i].x ); GEOSCoordSeq_setY( pCoord, i, vVertice[i].y ); } // 最後に、始点を詰め込む GEOSCoordSeq_setX( pCoord, i, vVertice[0].x ); GEOSCoordSeq_setY( pCoord, i, vVertice[0].y ); // 外形線データを作成 pShell = GEOSGeom_createLinearRing( pCoord ); // ポリゴンを作成 pPoly = GEOSGeom_createPolygon( pShell, NULL, 0 ); //使い終わったら GEOSGeom_destroy( pPoly );
穴あきポリゴンを作る場合は、穴の外形線データをGEOSGeom_createPolygon()
の2番目の引数に指定し、3番目の引数に穴の数を指定します。
穴が2つ以上ある場合は、おそらくGEOSGeometryCollection
型にするのかな?
データを破棄するときは中間要素は破棄しなくていいらしいです。
複数の連続線分からポリゴン作成
複数の要素から図形を作成したりする操作です。
GEOSGeometry **pColl; GEOSGeometry *pPoly1 GEOSCoordSequence **pCoords; LONG i, j; /* 4つの連続線分から作成する場合 */ pColl = new GEOSGeometry*[4]; pCoords = new GEOSCoordSeq[4]; for ( i = 0; i < 4; i++ ) { /* pCoords配列へデータを詰め込み */ pColl[i] = GEOSGeom_createLineString( pCoords[i] ); } /* ポリゴン作成 */ pPoly1 = GEOSPolygonize( pColl, 4 );
GEOSPolygonize()
関数は連続線分の配列からポリゴンを作成します。
それぞれの連続線分は終点で接している必要があります。この条件に当てはまらない場合はポリゴンは作成されません。
上のpPoly1
はGEOSGeometryCollection *
型です。
というのは、GEOSPolygonize()
関数はポリゴン化が可能な連続線分の組を全てポリゴンにするため、
複数のポリゴンが作成される可能性があるためです。従って、個別の図形を取り出すには
GEOSGeometryCollection *
型からGEOSGetGeometryN()
関数で取り出す必要があります。
if ( nGeom = GEOSGetNumGeometries( pPoly1 ) )
pRes = (GEOSGeometry *)GEOSGetGeometryN( pPoly1, 0 );