在GDAL中创建3D shapefile

时间:2013-02-27 21:19:20

标签: c++ shapefile gdal

我正在尝试使用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文档和许多其他地方,但找不到如何构建3D对象的任何示例,所以我想如果你创建了它将连接它们的顶面和底面。

因此,总而言之,问题是......如何在GDAL中创建3D块对象(如立方体)?

2 个答案:

答案 0 :(得分:3)

问题在于你制作了两个戒指 - “盒子”的顶部和底部。这不是一个封闭的盒子(没有侧面),而是顶部和底部的2个“板”。

话虽如此,即使你确实把它变成一个封闭的盒子,包含仍然会失败。这不会进行体积包含检查,而是检查该点是否包含在框的实际表面中。包含定义为(0.5, 0.5, 1.0)的点应该返回true(假设OGR是使用GEOS编译的),因为该点位于“框”的表面内。

答案 1 :(得分:3)

GEOS(在GDAL中使用)是一个2D几何引擎,但可以存储第三维的坐标(因此在wkbPolygon25D中命名的2.5维)。因此,它有效地评估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)

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

GEOS / GDAL不能用于执行3D谓词,例如“包含”。