GEOS データの取り出し

要素から直接点データを取り出すことはできなくて、一度点群データを取り出す必要があります。
ポリゴンのような複合要素の場合はその前に構成要素を特定して取り出しておく必要があります。 また、
GEOSIntersection()
関数の演算結果でできるポリゴンは複数ある可能性があります。
この場合はGeometryCollectionになっているので、取り出し方が異なります。
あらかじめ図形の数を調べて場合分けをして取り出します。

	UINT nPoints, nPolys;
	int i, j;
	const GEOSGeometry *pPolyR, *pSubPoly;
	const GEOSGeometry *pShell;
	const GEOSCoordSequence *pSeq;
	struct __point3d
	{
		double dX;
		double dY;
		double dZ;
	} sP;

	nPolys = GEOSGetNumGeometries( pPolyR );
	
	if ( nPolys == 1 )
	{
		//外側ラインの取得
		pShell = GEOSGetExteriorRing( pPolyR );
		//ラインから点群を取得
		pSeq = GEOSGeom_getCoordSeq( pShell );

		//点群から点数を取得
		GEOSCoordSeq_getSize( pSeq, &nPoints );

		//XYZを取得
		for ( i = 0; i < nPoints; i++ )
		{
			GEOSCoordSeq_getX( pSeq, i, &sP.dX );
			GEOSCoordSeq_getY( pSeq, i, &sP.dY );
			GEOSCoordSeq_getZ( pSeq, i, &sP.dZ );
		}
	}
	else
	{
		for j = 0; j < nPolys; j++ )
		{
			//この関数はCollectionしか受け付けない
			pSubPoly = GEOSGetGeometryN( pPolyR, j );
			pShell = GEOSGetExteriorRing( pSubPoly );
			pSeq = GEOSGeom_getCoordSeq( pShell );
			GEOSCoordSeq_getSize( pSeq, &nPoints );
			for ( i = 0; i < nPoints; i++ )
			{
				GEOSCoordSeq_getX( pSeq, i, &sP.dX );
				GEOSCoordSeq_getY( pSeq, i, &sP.dY );
				GEOSCoordSeq_getZ( pSeq, i, &sP.dZ );
			}
		}
	{
アーカイブ