【问题标题】:Create a 3D shapefile in GDAL在 GDAL 中创建 3D shapefile
【发布时间】:2013-02-27 21:19:20
【问题描述】:

我正在尝试使用 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 块对象(如立方体)?

【问题讨论】:

    标签: c++ shapefile gdal


    【解决方案1】:

    问题是你要制作两个环——一个“盒子”的顶部和底部。这不是一个封闭的盒子(没有边),而是顶部和底部的 2 个“板”。

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

    【讨论】:

    • 我是,我最初忽略了包含该行,我已将其添加为问题中源代码的第一行。我认为我的问题与我添加戒指的方式有关,但我找不到可以使用的示例。
    • @DavidHope 编辑了我的答案 - 还有其他问题在起作用,但简短的回答是这永远不会起作用;)
    • 不是我想听到的真正答案,但至少我可以停止在上面浪费时间:-)
    【解决方案2】:

    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 中的两个环是相同的,它们相互“抵消”,内部被“擦除”(这种技术通常用于在多边形中放置一个洞)。这个多边形被认为是不简单的,因为环相交(记住,它被认为是二维的)。

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

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 2022-11-05
      相关资源
      最近更新 更多