c++ - 在 GDAL 中创建 3D shapefile

标签 c++ shapefile gdal

我正在尝试使用 GDAL 创建 3D shapefile。我创建 3D block 的代码如下所示:

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 block 对象(如立方体)?

最佳答案

问题是您要制作两个环 - “盒子”的顶部和底部。这不会形成一个封闭的盒子(没有侧面),而是在顶部和底部形成 2 个“盘子”。

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

关于c++ - 在 GDAL 中创建 3D shapefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122616/

相关文章:

c++ - 重用 boost::bind 调用的返回值的正确方法是什么?

d3.js - 从形状转换为 topojson 的问题

python - gdal-python 中的 ReadAsArray 与 C-GDAL 中的 GDALRasterIO 相同吗?

c++ - 为什么这些字符串不会在 C++ 中连接?

c++ - 创建对象后创建 shared_ptr

c++ - 代码块 - wx/setup : no such file or directory

python - 将 Shapefile 读入 Dataframe

python - 使用 Python 将 Geojson 转为 shapefile

python - Python中的下采样数组

python - 使用带有 Python 的 GDAL 裁剪光栅文件