3

GDAL を使用して 3D シェープファイルを作成しようとしています。3D ブロックを作成するコードは次のようになります。

OGRLayer *poLayer = ds->CreateLayer("Floor", NULL, wkbPolygon25D, NULL);
OGRFeature *poFeature;

poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );

OGRLinearRing ring1, ring2;
OGRPolygon poly;

double x0=y0=z0 = 0;
double x1=y1=z1 = 1;

ring1.addPoint(x0, y0, z0);
ring1.addPoint(x1, y0, z0);
ring1.addPoint(x1, y1, z0);
ring1.addPoint(x0, y1, z0);
ring1.addPoint(x0, y0, z0);
ring1.closeRings();
ring2.addPoint(x0, y0, z1);
ring2.addPoint(x1, y0, z1);
ring2.addPoint(x1, y1, z1);
ring2.addPoint(x0, y1, z1);
ring2.addPoint(x0, y0, z1);
ring2.closeRings();

poly.addRing(&ring1);
poly.addRing(&ring2);
poFeature->SetGeometry(&poly);

poLayer->CreateFeature(poFeature);

しかし、後でファイルを開いてフィーチャ内のポイントをクエリすると、次のようになります。

OGRGeometry* pGeometry = pFeature->GetGeometryRef();
OGRSpatialReference* pSpaRef = pGeometry->getSpatialReference();

OGRPoint point(0.5, 0.5,0.5);
point.assignSpatialReference(pSpaRef);    
OGRBoolean bContains = pGeometry->Contains(&point);

FALSE の結果が返ってきます。

私はGDALのドキュメントや他の多くの場所を検索しましたが、3Dオブジェクトを構築する方法の例を見つけることができません.

要約すると、質問は...GDALで3Dブロックオブジェクト(立方体など)を作成するにはどうすればよいですか?

4

2 に答える 2

3

GEOS(GDALで使用)は2Dジオメトリエンジンですが、3次元(したがって、で指定された2.5次元)からの座標を格納できwkbPolygon25Dます。したがって、2Dジオメトリ間のバイナリ述語を効果的に評価します。

A: POLYGON((0 0, 1 0, 1 1, 0 1, 0 0), (0 0, 1 0, 1 1, 0 1, 0 0))
B: POINT(0.5 0.5)

入っている2つのリングAは同一であるため、互いに「キャンセル」され、内部が「消去」されます(この手法は通常、ポリゴンに穴を開けるために使用されます)。リングが交差するため、このポリゴンは単純ではないと見なされます(2Dと見なされることを忘れないでください)。

GEOS / GDALを使用して、「含む」などの3D述語を実行することはできません。

于 2013-02-27T22:42:22.020 に答える
3

問題は、「箱」の上部と下部の 2 つのリングを作成していることです。これは閉じた箱 (側面がない) ではなく、上部と下部に 2 つの「プレート」を作成します。

そうは言っても、これを閉じたボックスにしても、contains は失敗します。これは、体積含有チェックを行うのではなく、ポイントがボックスの実際のサーフェス内に含まれているかどうかを確認するためのチェックです。(0.5, 0.5, 1.0)そのポイントが「ボックス」の表面内にあるため、(OGR が GEOS でコンパイルされている場合) true を返す必要があると定義されたポイントに対して含まれます。

于 2013-02-27T21:23:43.353 に答える