@@ -307,12 +307,100 @@ std::unique_ptr< QgsLineString > ogrGeometryToQgsLineString( OGRGeometryH geom )
307
307
return qgis::make_unique< QgsLineString>( x, y, z, m, wkbType == QgsWkbTypes::LineString25D );
308
308
}
309
309
310
+ QgsWkbTypes::Type QgsOgrUtils::ogrGeometryTypeToQgsWkbType ( OGRwkbGeometryType ogrGeomType )
311
+ {
312
+ switch ( ogrGeomType )
313
+ {
314
+ case wkbUnknown: return QgsWkbTypes::Type::Unknown;
315
+ case wkbPoint: return QgsWkbTypes::Type::Point;
316
+ case wkbLineString: return QgsWkbTypes::Type::LineString;
317
+ case wkbPolygon: return QgsWkbTypes::Type::Polygon;
318
+ case wkbMultiPoint: return QgsWkbTypes::Type::MultiPoint;
319
+ case wkbMultiLineString: return QgsWkbTypes::Type::MultiLineString;
320
+ case wkbMultiPolygon: return QgsWkbTypes::Type::MultiPolygon;
321
+ case wkbGeometryCollection: return QgsWkbTypes::Type::GeometryCollection;
322
+ case wkbCircularString: return QgsWkbTypes::Type::CircularString;
323
+ case wkbCompoundCurve: return QgsWkbTypes::Type::CompoundCurve;
324
+ case wkbCurvePolygon: return QgsWkbTypes::Type::CurvePolygon;
325
+ case wkbMultiCurve: return QgsWkbTypes::Type::MultiCurve;
326
+ case wkbMultiSurface: return QgsWkbTypes::Type::MultiSurface;
327
+ case wkbCurve: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
328
+ case wkbSurface: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
329
+ case wkbPolyhedralSurface: return QgsWkbTypes::Type::Unknown; // no actual matching
330
+ case wkbTIN: return QgsWkbTypes::Type::Unknown; // no actual matching
331
+ case wkbTriangle: return QgsWkbTypes::Type::Triangle;
332
+
333
+ case wkbNone: return QgsWkbTypes::Type::NoGeometry;
334
+ case wkbLinearRing: return QgsWkbTypes::Type::LineString; // approximate match
335
+
336
+ case wkbCircularStringZ: return QgsWkbTypes::Type::CircularStringZ;
337
+ case wkbCompoundCurveZ: return QgsWkbTypes::Type::CompoundCurveZ;
338
+ case wkbCurvePolygonZ: return QgsWkbTypes::Type::CurvePolygonZ;
339
+ case wkbMultiCurveZ: return QgsWkbTypes::Type::MultiCurveZ;
340
+ case wkbMultiSurfaceZ: return QgsWkbTypes::Type::MultiSurfaceZ;
341
+ case wkbCurveZ: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
342
+ case wkbSurfaceZ: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
343
+ case wkbPolyhedralSurfaceZ: return QgsWkbTypes::Type::Unknown; // no actual matching
344
+ case wkbTINZ: return QgsWkbTypes::Type::Unknown; // no actual matching
345
+ case wkbTriangleZ: return QgsWkbTypes::Type::TriangleZ;
346
+
347
+ case wkbPointM: return QgsWkbTypes::Type::PointM;
348
+ case wkbLineStringM: return QgsWkbTypes::Type::LineStringM;
349
+ case wkbPolygonM: return QgsWkbTypes::Type::PolygonM;
350
+ case wkbMultiPointM: return QgsWkbTypes::Type::MultiPointM;
351
+ case wkbMultiLineStringM: return QgsWkbTypes::Type::MultiLineStringM;
352
+ case wkbMultiPolygonM: return QgsWkbTypes::Type::MultiPolygonM;
353
+ case wkbGeometryCollectionM: return QgsWkbTypes::Type::GeometryCollectionM;
354
+ case wkbCircularStringM: return QgsWkbTypes::Type::CircularStringM;
355
+ case wkbCompoundCurveM: return QgsWkbTypes::Type::CompoundCurveM;
356
+ case wkbCurvePolygonM: return QgsWkbTypes::Type::CurvePolygonM;
357
+ case wkbMultiCurveM: return QgsWkbTypes::Type::MultiCurveM;
358
+ case wkbMultiSurfaceM: return QgsWkbTypes::Type::MultiSurfaceM;
359
+ case wkbCurveM: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
360
+ case wkbSurfaceM: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
361
+ case wkbPolyhedralSurfaceM: return QgsWkbTypes::Type::Unknown; // no actual matching
362
+ case wkbTINM: return QgsWkbTypes::Type::Unknown; // no actual matching
363
+ case wkbTriangleM: return QgsWkbTypes::Type::TriangleM;
364
+
365
+ case wkbPointZM: return QgsWkbTypes::Type::PointZM;
366
+ case wkbLineStringZM: return QgsWkbTypes::Type::LineStringZM;
367
+ case wkbPolygonZM: return QgsWkbTypes::Type::PolygonZM;
368
+ case wkbMultiPointZM: return QgsWkbTypes::Type::MultiPointZM;
369
+ case wkbMultiLineStringZM: return QgsWkbTypes::Type::MultiLineStringZM;
370
+ case wkbMultiPolygonZM: return QgsWkbTypes::Type::MultiPolygonZM;
371
+ case wkbGeometryCollectionZM: return QgsWkbTypes::Type::GeometryCollectionZM;
372
+ case wkbCircularStringZM: return QgsWkbTypes::Type::CircularStringZM;
373
+ case wkbCompoundCurveZM: return QgsWkbTypes::Type::CompoundCurveZM;
374
+ case wkbCurvePolygonZM: return QgsWkbTypes::Type::CurvePolygonZM;
375
+ case wkbMultiCurveZM: return QgsWkbTypes::Type::MultiCurveZM;
376
+ case wkbMultiSurfaceZM: return QgsWkbTypes::Type::MultiSurfaceZM;
377
+ case wkbCurveZM: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
378
+ case wkbSurfaceZM: return QgsWkbTypes::Type::Unknown; // not an actual concrete type
379
+ case wkbPolyhedralSurfaceZM: return QgsWkbTypes::Type::Unknown; // no actual matching
380
+ case wkbTINZM: return QgsWkbTypes::Type::Unknown; // no actual matching
381
+ case wkbTriangleZM: return QgsWkbTypes::Type::TriangleZM;
382
+
383
+ case wkbPoint25D: return QgsWkbTypes::Type::PointZ;
384
+ case wkbLineString25D: return QgsWkbTypes::Type::LineStringZ;
385
+ case wkbPolygon25D: return QgsWkbTypes::Type::PolygonZ;
386
+ case wkbMultiPoint25D: return QgsWkbTypes::Type::MultiPointZ;
387
+ case wkbMultiLineString25D: return QgsWkbTypes::Type::MultiLineStringZ;
388
+ case wkbMultiPolygon25D: return QgsWkbTypes::Type::MultiPolygonZ;
389
+ case wkbGeometryCollection25D: return QgsWkbTypes::Type::GeometryCollectionZ;
390
+ }
391
+
392
+ // should not reach that point normally
393
+ return QgsWkbTypes::Type::Unknown;
394
+ }
395
+
310
396
QgsGeometry QgsOgrUtils::ogrGeometryToQgsGeometry ( OGRGeometryH geom )
311
397
{
312
398
if ( !geom )
313
399
return QgsGeometry ();
314
400
315
- QgsWkbTypes::Type wkbType = static_cast <QgsWkbTypes::Type>( OGR_G_GetGeometryType ( geom ) );
401
+ const auto ogrGeomType = OGR_G_GetGeometryType ( geom );
402
+ QgsWkbTypes::Type wkbType = ogrGeometryTypeToQgsWkbType ( ogrGeomType );
403
+
316
404
// optimised case for some geometry classes, avoiding wkb conversion on OGR/QGIS sides
317
405
// TODO - extend to other classes!
318
406
switch ( QgsWkbTypes::flatType ( wkbType ) )
@@ -334,6 +422,19 @@ QgsGeometry QgsOgrUtils::ogrGeometryToQgsGeometry( OGRGeometryH geom )
334
422
335
423
// Fallback to inefficient WKB conversions
336
424
425
+ if ( wkbFlatten ( wkbType ) == wkbGeometryCollection )
426
+ {
427
+ // Shapefile MultiPatch can be reported as GeometryCollectionZ of TINZ
428
+ if ( OGR_G_GetGeometryCount ( geom ) >= 1 &&
429
+ wkbFlatten ( OGR_G_GetGeometryType ( OGR_G_GetGeometryRef ( geom, 0 ) ) ) == wkbTIN )
430
+ {
431
+ auto newGeom = OGR_G_ForceToMultiPolygon ( OGR_G_Clone ( geom ) );
432
+ auto ret = ogrGeometryToQgsGeometry ( newGeom );
433
+ OGR_G_DestroyGeometry ( newGeom );
434
+ return ret;
435
+ }
436
+ }
437
+
337
438
// get the wkb representation
338
439
int memorySize = OGR_G_WkbSize ( geom );
339
440
unsigned char *wkb = new unsigned char [memorySize];
0 commit comments