Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmultilinestring.cpp 3 : : ------------------------------------------------------------------- 4 : : Date : 28 Oct 2014 5 : : Copyright : (C) 2014 by Marco Hugentobler 6 : : email : marco.hugentobler at sourcepole dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgsmultilinestring.h" 17 : : #include "qgsapplication.h" 18 : : #include "qgscurve.h" 19 : : #include "qgscircularstring.h" 20 : : #include "qgscompoundcurve.h" 21 : : #include "qgsgeometryutils.h" 22 : : #include "qgslinestring.h" 23 : : #include "qgsmulticurve.h" 24 : : 25 : : #include <nlohmann/json.hpp> 26 : : #include <QJsonObject> 27 : : 28 : 851 : QgsMultiLineString::QgsMultiLineString() 29 : 1702 : { 30 : 851 : mWkbType = QgsWkbTypes::MultiLineString; 31 : 851 : } 32 : : 33 : 0 : QgsLineString *QgsMultiLineString::lineStringN( int index ) 34 : : { 35 : 0 : return qgsgeometry_cast< QgsLineString * >( geometryN( index ) ); 36 : : } 37 : : 38 : 2 : const QgsLineString *QgsMultiLineString::lineStringN( int index ) const 39 : : { 40 : 2 : return qgsgeometry_cast< const QgsLineString * >( geometryN( index ) ); 41 : : } 42 : : 43 : 416 : QString QgsMultiLineString::geometryType() const 44 : : { 45 : 832 : return QStringLiteral( "MultiLineString" ); 46 : : } 47 : : 48 : 1 : QgsMultiLineString *QgsMultiLineString::createEmptyWithSameType() const 49 : : { 50 : 1 : auto result = std::make_unique< QgsMultiLineString >(); 51 : 1 : result->mWkbType = mWkbType; 52 : 1 : return result.release(); 53 : 1 : } 54 : : 55 : 13 : QgsMultiLineString *QgsMultiLineString::clone() const 56 : : { 57 : 13 : return new QgsMultiLineString( *this ); 58 : 0 : } 59 : : 60 : 441 : void QgsMultiLineString::clear() 61 : : { 62 : 441 : QgsMultiCurve::clear(); 63 : 441 : mWkbType = QgsWkbTypes::MultiLineString; 64 : 441 : } 65 : : 66 : 424 : bool QgsMultiLineString::fromWkt( const QString &wkt ) 67 : : { 68 : 848 : return fromCollectionWkt( wkt, QVector<QgsAbstractGeometry *>() << new QgsLineString, QStringLiteral( "LineString" ) ); 69 : 0 : } 70 : : 71 : 3 : QDomElement QgsMultiLineString::asGml2( QDomDocument &doc, int precision, const QString &ns, const AxisOrder axisOrder ) const 72 : : { 73 : 6 : QDomElement elemMultiLineString = doc.createElementNS( ns, QStringLiteral( "MultiLineString" ) ); 74 : : 75 : 3 : if ( isEmpty() ) 76 : 1 : return elemMultiLineString; 77 : : 78 : 6 : for ( const QgsAbstractGeometry *geom : mGeometries ) 79 : : { 80 : 4 : if ( const QgsLineString *lineString = qgsgeometry_cast<const QgsLineString *>( geom ) ) 81 : : { 82 : 8 : QDomElement elemLineStringMember = doc.createElementNS( ns, QStringLiteral( "lineStringMember" ) ); 83 : 4 : elemLineStringMember.appendChild( lineString->asGml2( doc, precision, ns, axisOrder ) ); 84 : 4 : elemMultiLineString.appendChild( elemLineStringMember ); 85 : 4 : } 86 : : } 87 : : 88 : 2 : return elemMultiLineString; 89 : 3 : } 90 : : 91 : 3 : QDomElement QgsMultiLineString::asGml3( QDomDocument &doc, int precision, const QString &ns, const QgsAbstractGeometry::AxisOrder axisOrder ) const 92 : : { 93 : 6 : QDomElement elemMultiCurve = doc.createElementNS( ns, QStringLiteral( "MultiCurve" ) ); 94 : : 95 : 3 : if ( isEmpty() ) 96 : 1 : return elemMultiCurve; 97 : : 98 : 6 : for ( const QgsAbstractGeometry *geom : mGeometries ) 99 : : { 100 : 4 : if ( const QgsLineString *lineString = qgsgeometry_cast<const QgsLineString *>( geom ) ) 101 : : { 102 : 8 : QDomElement elemCurveMember = doc.createElementNS( ns, QStringLiteral( "curveMember" ) ); 103 : 4 : elemCurveMember.appendChild( lineString->asGml3( doc, precision, ns, axisOrder ) ); 104 : 4 : elemMultiCurve.appendChild( elemCurveMember ); 105 : 4 : } 106 : : } 107 : : 108 : 2 : return elemMultiCurve; 109 : 3 : } 110 : : 111 : 4 : json QgsMultiLineString::asJsonObject( int precision ) const 112 : : { 113 : 4 : json coordinates( json::array( ) ); 114 : 10 : for ( const QgsAbstractGeometry *geom : mGeometries ) 115 : : { 116 : 6 : if ( qgsgeometry_cast<const QgsCurve *>( geom ) ) 117 : : { 118 : 6 : const QgsLineString *lineString = static_cast<const QgsLineString *>( geom ); 119 : 6 : QgsPointSequence pts; 120 : 6 : lineString->points( pts ); 121 : 6 : coordinates.push_back( QgsGeometryUtils::pointsToJson( pts, precision ) ); 122 : 6 : } 123 : : } 124 : 16 : return 125 : 12 : { 126 : 4 : { "type", "MultiLineString" }, 127 : 4 : { "coordinates", coordinates } 128 : : }; 129 : 4 : } 130 : : 131 : 295 : bool QgsMultiLineString::addGeometry( QgsAbstractGeometry *g ) 132 : : { 133 : 295 : if ( !dynamic_cast<QgsLineString *>( g ) ) 134 : : { 135 : 2 : delete g; 136 : 2 : return false; 137 : : } 138 : : 139 : 293 : if ( mGeometries.empty() ) 140 : : { 141 : 215 : setZMTypeFromSubGeometry( g, QgsWkbTypes::MultiLineString ); 142 : 215 : } 143 : 293 : if ( is3D() && !g->is3D() ) 144 : 4 : g->addZValue(); 145 : 289 : else if ( !is3D() && g->is3D() ) 146 : 2 : g->dropZValue(); 147 : 293 : if ( isMeasure() && !g->isMeasure() ) 148 : 4 : g->addMValue(); 149 : 289 : else if ( !isMeasure() && g->isMeasure() ) 150 : 2 : g->dropMValue(); 151 : 293 : return QgsGeometryCollection::addGeometry( g ); // clazy:exclude=skipped-base-method 152 : 295 : } 153 : : 154 : 5 : bool QgsMultiLineString::insertGeometry( QgsAbstractGeometry *g, int index ) 155 : : { 156 : 5 : if ( !g || QgsWkbTypes::flatType( g->wkbType() ) != QgsWkbTypes::LineString ) 157 : : { 158 : 4 : delete g; 159 : 4 : return false; 160 : : } 161 : : 162 : 1 : return QgsMultiCurve::insertGeometry( g, index ); // clazy:exclude=skipped-base-method 163 : 5 : } 164 : : 165 : 1 : QgsMultiCurve *QgsMultiLineString::toCurveType() const 166 : : { 167 : 1 : QgsMultiCurve *multiCurve = new QgsMultiCurve(); 168 : 1 : multiCurve->reserve( mGeometries.size() ); 169 : 3 : for ( int i = 0; i < mGeometries.size(); ++i ) 170 : : { 171 : 2 : multiCurve->addGeometry( mGeometries.at( i )->toCurveType() ); 172 : 2 : } 173 : 1 : return multiCurve; 174 : 0 : } 175 : : 176 : 7 : bool QgsMultiLineString::wktOmitChildType() const 177 : : { 178 : 7 : return true; 179 : : } 180 : :