Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsalgorithmsplitlineantimeridian.cpp 3 : : ------------------------------------- 4 : : begin : January 2019 5 : : copyright : (C) 2019 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : 8 : : ***************************************************************************/ 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsalgorithmsplitlineantimeridian.h" 19 : : #include "qgscurve.h" 20 : : #include "qgslinestring.h" 21 : : #include "qgscircularstring.h" 22 : : #include "qgscompoundcurve.h" 23 : : #include "qgsgeometrycollection.h" 24 : : 25 : : ///@cond PRIVATE 26 : : 27 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::name() const 28 : : { 29 : 0 : return QStringLiteral( "antimeridiansplit" ); 30 : : } 31 : : 32 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::displayName() const 33 : : { 34 : 0 : return QObject::tr( "Geodesic line split at antimeridian" ); 35 : : } 36 : : 37 : 0 : QStringList QgsSplitGeometryAtAntimeridianAlgorithm::tags() const 38 : : { 39 : 0 : return QObject::tr( "break,cut,dateline,180,-180,longitude,geographic,ellipsoid" ).split( ',' ); 40 : 0 : } 41 : : 42 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::group() const 43 : : { 44 : 0 : return QObject::tr( "Vector geometry" ); 45 : : } 46 : : 47 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::groupId() const 48 : : { 49 : 0 : return QStringLiteral( "vectorgeometry" ); 50 : : } 51 : : 52 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::shortDescription() const 53 : : { 54 : 0 : return QObject::tr( "Splits lines into multiple geodesic segments when the line crosses the antimeridian (±180 degrees longitude)." ); 55 : : } 56 : : 57 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::shortHelpString() const 58 : : { 59 : 0 : return QObject::tr( "This algorithm splits a line into multiple geodesic segments, whenever the line crosses the antimeridian (±180 degrees longitude).\n\n" 60 : : "Splitting at the antimeridian helps the visual display of the lines in some projections. The returned " 61 : : "geometry will always be a multi-part geometry.\n\n" 62 : : "Whenever line segments in the input geometry cross the antimeridian, they will be " 63 : : "split into two segments, with the latitude of the breakpoint being determined using a geodesic " 64 : : "line connecting the points either side of this segment. The current project ellipsoid setting will " 65 : : "be used when calculating this breakpoint.\n\n" 66 : : "If the input geometry contains M or Z values, these will be linearly interpolated for the new vertices " 67 : : "created at the antimeridian." ); 68 : : } 69 : : 70 : 0 : QList<int> QgsSplitGeometryAtAntimeridianAlgorithm::inputLayerTypes() const 71 : : { 72 : 0 : return QList<int>() << QgsProcessing::TypeVectorLine; 73 : 0 : } 74 : : 75 : 0 : QgsProcessing::SourceType QgsSplitGeometryAtAntimeridianAlgorithm::outputLayerType() const 76 : : { 77 : 0 : return QgsProcessing::TypeVectorLine; 78 : : } 79 : : 80 : 0 : QgsSplitGeometryAtAntimeridianAlgorithm *QgsSplitGeometryAtAntimeridianAlgorithm::createInstance() const 81 : : { 82 : 0 : return new QgsSplitGeometryAtAntimeridianAlgorithm(); 83 : 0 : } 84 : : 85 : 0 : QString QgsSplitGeometryAtAntimeridianAlgorithm::outputName() const 86 : : { 87 : 0 : return QObject::tr( "Split" ); 88 : : } 89 : : 90 : 0 : QgsWkbTypes::Type QgsSplitGeometryAtAntimeridianAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const 91 : : { 92 : 0 : return QgsWkbTypes::multiType( inputWkbType ); 93 : : } 94 : : 95 : 0 : QgsCoordinateReferenceSystem QgsSplitGeometryAtAntimeridianAlgorithm::outputCrs( const QgsCoordinateReferenceSystem &inputCrs ) const 96 : : { 97 : 0 : mDa.setSourceCrs( inputCrs, mTransformContext ); 98 : 0 : return inputCrs; 99 : : } 100 : : 101 : 0 : bool QgsSplitGeometryAtAntimeridianAlgorithm::prepareAlgorithm( const QVariantMap &, QgsProcessingContext &context, QgsProcessingFeedback * ) 102 : : { 103 : 0 : mDa.setEllipsoid( context.ellipsoid() ); 104 : 0 : mTransformContext = context.transformContext(); 105 : 0 : return true; 106 : 0 : } 107 : : 108 : 0 : QgsFeatureList QgsSplitGeometryAtAntimeridianAlgorithm::processFeature( const QgsFeature &f, QgsProcessingContext &, QgsProcessingFeedback * ) 109 : : { 110 : 0 : if ( !f.hasGeometry() ) 111 : : { 112 : 0 : return QgsFeatureList() << f; 113 : : } 114 : : else 115 : : { 116 : 0 : QgsFeature feat = f; 117 : 0 : feat.setGeometry( mDa.splitGeometryAtAntimeridian( f.geometry() ) ); 118 : 0 : return QgsFeatureList() << feat; 119 : 0 : } 120 : 0 : } 121 : : 122 : : 123 : : ///@endcond 124 : : 125 : : 126 : :