Создать 3D-файл формы в GDAL

Я пытаюсь создать 3D-файл формы, используя GDAL. Мой код для создания 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);

Я получаю результат ЛОЖЬ.

Я искал документацию по GDAL и во многих других местах и ​​не могу найти ни одного примера того, как построить трехмерный объект, поэтому я предполагаю, что если вы создадите верхнюю и нижнюю грани, он соединит их.

Итак, в заключение, вопрос заключается в следующем … как мне создать трехмерный блочный объект (например, куб) в GDAL?

4

Решение

Проблема в том, что вы делаете два кольца — верх и низ «коробки». Это делает не закрытую коробку (нет сторон), а скорее 2 «тарелки» сверху и снизу.

При этом, даже если вы сделаете это закрытой коробкой, содержимое все равно не будет выполнено. Это не проверка объема содержит, а проверка, чтобы увидеть, содержится ли точка в фактических поверхностях блока. Содержит против точки, определенной как (0.5, 0.5, 1.0) должен вернуть true (при условии, что OGR скомпилирован с GEOS), так как эта точка находится в пределах поверхностей «прямоугольника».

3

Другие решения

GEOS (используется в GDAL) — это движок 2D-геометрии, но он может хранить координаты из третьего измерения (отсюда и 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)

Так как два кольца в A идентичны, они «взаимно уничтожают» друг друга, а внутреннее пространство «стирается» (этот метод обычно используется для создания отверстия в многоугольнике). Этот многоугольник считается непростым, поскольку кольца пересекаются (помните, он считается двумерным).

GEOS / GDAL нельзя использовать для выполнения трехмерных предикатов, таких как «Содержит».

3

По вопросам рекламы [email protected]