使用GDAL创建三维Shapefile

3

我正在尝试使用GDAL创建一个3D shapefile。我的代码用于创建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 文档和其他许多地方,但找不到任何构建三维对象的示例,所以我猜想如果你创建了顶部和底部面,它们会相连。

因此,总之,问题是...如何在 GDAL 中创建一个三维块对象(如立方体)?

2个回答

3
问题在于你正在制作两个环 - “盒子”的顶部和底部。这并不会形成一个封闭的盒子(没有侧面),而是上下两个“板子”。
话虽如此,即使你将其制作为一个封闭的盒子,contains 仍然会失败。这并不进行容积包含检查,而是检查点是否包含在盒子的实际表面内。对于一个被定义为 (0.5, 0.5, 1.0) 的点来说,如果 OGR 使用 GEOS 编译,则 contains 应该返回 true,因为该点位于“盒子”的表面内。

我忘了最初加入那行代码,现在我已经将其作为问题源代码的顶部行添加了进去。我认为我的问题与我如何添加这些环有关,但我找不到可供参考的示例。 - David Hope
@DavidHope 编辑了我的回答 - 还有其他问题需要解决,但简短的回答是这永远不会起作用 ;) - Reed Copsey
不是我想听到的答案,但至少我可以停止浪费时间在这上面了 :-) - David Hope

3

GEOS(用于GDAL)是一个2D几何引擎,但可以存储来自第三维的坐标(因此在wkbPolygon25D中命名为2.5维)。因此,它可以有效地计算二维几何图形之间的二元谓词:

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)

由于A中的两个环是相同的,它们会互相“抵消”,因此内部被“擦除”(这种技术通常用于在多边形中打洞)。该多边形被认为是非简单的,因为环相交了(请记住,它被视为2D)。

GEOS/GDAL无法用于执行3D谓词,例如“Contains”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接