Branch data Line data Source code
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 : 0 : QLinkedList<const GEOSGeometry *> *pal::Util::unmulti( const GEOSGeometry *the_geom ) 41 : : { 42 : 0 : QLinkedList<const GEOSGeometry *> *queue = new QLinkedList<const GEOSGeometry *>; 43 : 0 : QLinkedList<const GEOSGeometry *> *final_queue = new QLinkedList<const GEOSGeometry *>; 44 : : 45 : 0 : const GEOSGeometry *geom = nullptr; 46 : : 47 : 0 : queue->append( the_geom ); 48 : : int nGeom; 49 : : int i; 50 : : 51 : 0 : GEOSContextHandle_t geosctxt = QgsGeos::getGEOSHandler(); 52 : : 53 : 0 : while ( !queue->isEmpty() ) 54 : : { 55 : 0 : geom = queue->takeFirst(); 56 : 0 : int type = GEOSGeomTypeId_r( geosctxt, geom ); 57 : 0 : switch ( type ) 58 : : { 59 : : case GEOS_MULTIPOINT: 60 : : case GEOS_MULTILINESTRING: 61 : : case GEOS_MULTIPOLYGON: 62 : : case GEOS_GEOMETRYCOLLECTION: 63 : 0 : nGeom = GEOSGetNumGeometries_r( geosctxt, geom ); 64 : 0 : for ( i = 0; i < nGeom; i++ ) 65 : : { 66 : 0 : queue->append( GEOSGetGeometryN_r( geosctxt, geom, i ) ); 67 : 0 : } 68 : 0 : break; 69 : : case GEOS_POINT: 70 : : case GEOS_LINESTRING: 71 : : case GEOS_POLYGON: 72 : 0 : final_queue->append( geom ); 73 : 0 : break; 74 : : default: 75 : 0 : QgsDebugMsg( QStringLiteral( "unexpected geometry type:%1" ).arg( type ) ); 76 : 0 : delete final_queue; 77 : 0 : delete queue; 78 : 0 : return nullptr; 79 : : } 80 : : } 81 : 0 : delete queue; 82 : : 83 : 0 : return final_queue; 84 : 0 : } 85 : : 86 : : 87 : :