2013-02-27 3 views
3

Я пытаюсь создать трехмерный шейп-файл с использованием GDAL. Мой код для создания 3D-блок выглядит следующим образом:Создайте трехмерный шейп в GDAL

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-объект, поэтому я предполагаю, что если вы создали верхнюю и нижнюю грани, которые бы соединяли их.

Итак, в общем, вопрос в том, как ... как создать объект 3D-блока (например, куб) в GDAL?

ответ

2

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

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

+0

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

+0

@DavidHope Отредактировал мой ответ - есть и другие проблемы в игре, но короткий ответ: это никогда не сработает;) –

+0

Не совсем ответ, который я хотел услышать, но по крайней мере я могу перестать тратить свое время на это: -) –

2

GEOS (используется в GDAL) является двумерным геометрическим движком, но может хранить координаты из третьего измерения (следовательно, 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 идентичны, они «ОТМЕНА» друг друга, а внутренняя часть «стирается» (этот метод обычно используется, чтобы поместить отверстие в многоугольнике). Этот многоугольник считается непростым, так как кольца пересекаются (помните, что это рассматривается как 2D).

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

Смежные вопросы