QGIS API Documentation  3.20.0-Odense (decaadbb31)
util.cpp
Go to the documentation of this file.
1 /*
2  * libpal - Automated Placement of Labels Library
3  *
4  * Copyright (C) 2008 Maxence Laurent, MIS-TIC, HEIG-VD
5  * University of Applied Sciences, Western Switzerland
6  * http://www.hes-so.ch
7  *
8  * Contact:
9  * maxence.laurent <at> heig-vd <dot> ch
10  * or
11  * eric.taillard <at> heig-vd <dot> ch
12  *
13  * This file is part of libpal.
14  *
15  * libpal is free software: you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation, either version 3 of the License, or
18  * (at your option) any later version.
19  *
20  * libpal is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with libpal. If not, see <http://www.gnu.org/licenses/>.
27  *
28  */
29 
30 #include "layer.h"
31 #include "internalexception.h"
32 #include "util.h"
33 #include "labelposition.h"
34 #include "feature.h"
35 #include "geomfunction.h"
36 
37 #include "qgslogger.h"
38 #include <cfloat>
39 
40 QLinkedList<const GEOSGeometry *> *pal::Util::unmulti( const GEOSGeometry *the_geom )
41 {
42  QLinkedList<const GEOSGeometry *> *queue = new QLinkedList<const GEOSGeometry *>;
43  QLinkedList<const GEOSGeometry *> *final_queue = new QLinkedList<const GEOSGeometry *>;
44 
45  const GEOSGeometry *geom = nullptr;
46 
47  queue->append( the_geom );
48  int nGeom;
49  int i;
50 
51  GEOSContextHandle_t geosctxt = QgsGeos::getGEOSHandler();
52 
53  while ( !queue->isEmpty() )
54  {
55  geom = queue->takeFirst();
56  int type = GEOSGeomTypeId_r( geosctxt, geom );
57  switch ( type )
58  {
59  case GEOS_MULTIPOINT:
60  case GEOS_MULTILINESTRING:
61  case GEOS_MULTIPOLYGON:
62  case GEOS_GEOMETRYCOLLECTION:
63  nGeom = GEOSGetNumGeometries_r( geosctxt, geom );
64  for ( i = 0; i < nGeom; i++ )
65  {
66  queue->append( GEOSGetGeometryN_r( geosctxt, geom, i ) );
67  }
68  break;
69  case GEOS_POINT:
70  case GEOS_LINESTRING:
71  case GEOS_POLYGON:
72  final_queue->append( geom );
73  break;
74  default:
75  QgsDebugMsg( QStringLiteral( "unexpected geometry type:%1" ).arg( type ) );
76  delete final_queue;
77  delete queue;
78  return nullptr;
79  }
80  }
81  delete queue;
82 
83  return final_queue;
84 }
85 
86 
87 
static GEOSContextHandle_t getGEOSHandler()
Definition: qgsgeos.cpp:3166
static QLinkedList< const GEOSGeometry * > * unmulti(const GEOSGeometry *the_geom)
Definition: util.cpp:40
#define QgsDebugMsg(str)
Definition: qgslogger.h:38