mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-19 00:04:52 -04:00
149 lines
4.9 KiB
C++
149 lines
4.9 KiB
C++
/***************************************************************************
|
|
qgsalgorithmaddixyfields.cpp
|
|
-----------------------------------
|
|
begin : March 2019
|
|
copyright : (C) 2019 by Nyall Dawson
|
|
email : nyall dot dawson at gmail dot com
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "qgsalgorithmaddxyfields.h"
|
|
#include "qgsfeaturerequest.h"
|
|
|
|
///@cond PRIVATE
|
|
|
|
QString QgsAddXYFieldsAlgorithm::name() const
|
|
{
|
|
return QStringLiteral( "addxyfields" );
|
|
}
|
|
|
|
QString QgsAddXYFieldsAlgorithm::displayName() const
|
|
{
|
|
return QObject::tr( "Add X/Y fields to layer" );
|
|
}
|
|
|
|
QString QgsAddXYFieldsAlgorithm::shortHelpString() const
|
|
{
|
|
return QObject::tr( "Adds X and Y (or latitude/longitude) fields to a point layer. The X/Y fields can be calculated in a different CRS to the layer (e.g. creating latitude/longitude fields for a layer in a project CRS)." );
|
|
}
|
|
|
|
QString QgsAddXYFieldsAlgorithm::shortDescription() const
|
|
{
|
|
return QObject::tr( "Adds X and Y (or latitude/longitude) fields to a point layer." );
|
|
}
|
|
|
|
QStringList QgsAddXYFieldsAlgorithm::tags() const
|
|
{
|
|
return QObject::tr( "add,create,latitude,longitude,columns,attributes" ).split( ',' );
|
|
}
|
|
|
|
QString QgsAddXYFieldsAlgorithm::group() const
|
|
{
|
|
return QObject::tr( "Vector table" );
|
|
}
|
|
|
|
QString QgsAddXYFieldsAlgorithm::groupId() const
|
|
{
|
|
return QStringLiteral( "vectortable" );
|
|
}
|
|
|
|
QString QgsAddXYFieldsAlgorithm::outputName() const
|
|
{
|
|
return QObject::tr( "Added fields" );
|
|
}
|
|
|
|
QList<int> QgsAddXYFieldsAlgorithm::inputLayerTypes() const
|
|
{
|
|
return QList<int>() << QgsProcessing::TypeVectorPoint;
|
|
}
|
|
|
|
QgsAddXYFieldsAlgorithm *QgsAddXYFieldsAlgorithm::createInstance() const
|
|
{
|
|
return new QgsAddXYFieldsAlgorithm();
|
|
}
|
|
|
|
QgsProcessingFeatureSource::Flag QgsAddXYFieldsAlgorithm::sourceFlags() const
|
|
{
|
|
return QgsProcessingFeatureSource::FlagSkipGeometryValidityChecks;
|
|
}
|
|
|
|
void QgsAddXYFieldsAlgorithm::initParameters( const QVariantMap & )
|
|
{
|
|
addParameter( new QgsProcessingParameterCrs( QStringLiteral( "CRS" ), QObject::tr( "Coordinate system" ), QStringLiteral( "EPSG:4326" ) ) );
|
|
addParameter( new QgsProcessingParameterString( QStringLiteral( "PREFIX" ), QObject::tr( "Field prefix" ), QVariant(), false, true ) );
|
|
}
|
|
|
|
QgsFields QgsAddXYFieldsAlgorithm::outputFields( const QgsFields &inputFields ) const
|
|
{
|
|
const QString xFieldName = mPrefix + 'x';
|
|
const QString yFieldName = mPrefix + 'y';
|
|
|
|
QgsFields outFields = inputFields;
|
|
outFields.append( QgsField( xFieldName, QVariant::Double, QString(), 20, 10 ) );
|
|
outFields.append( QgsField( yFieldName, QVariant::Double, QString(), 20, 10 ) );
|
|
return outFields;
|
|
}
|
|
|
|
QgsCoordinateReferenceSystem QgsAddXYFieldsAlgorithm::outputCrs( const QgsCoordinateReferenceSystem &inputCrs ) const
|
|
{
|
|
mSourceCrs = inputCrs;
|
|
return inputCrs;
|
|
}
|
|
|
|
bool QgsAddXYFieldsAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * )
|
|
{
|
|
mPrefix = parameterAsString( parameters, QStringLiteral( "PREFIX" ), context );
|
|
mCrs = parameterAsCrs( parameters, QStringLiteral( "CRS" ), context );
|
|
return true;
|
|
}
|
|
|
|
QgsFeatureList QgsAddXYFieldsAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
|
|
{
|
|
if ( mTransformNeedsInitialization )
|
|
{
|
|
mTransform = QgsCoordinateTransform( mSourceCrs, mCrs, context.transformContext() );
|
|
mTransformNeedsInitialization = false;
|
|
}
|
|
|
|
QVariant x;
|
|
QVariant y;
|
|
if ( feature.hasGeometry() )
|
|
{
|
|
if ( feature.geometry().isMultipart() )
|
|
throw QgsProcessingException( QObject::tr( "Multipoint features are not supported - please convert to single point features first." ) );
|
|
|
|
const QgsPointXY point = feature.geometry().asPoint();
|
|
try
|
|
{
|
|
const QgsPointXY transformed = mTransform.transform( point );
|
|
x = transformed.x();
|
|
y = transformed.y();
|
|
}
|
|
catch ( QgsCsException & )
|
|
{
|
|
feedback->reportError( QObject::tr( "Could not transform point to destination CRS" ) );
|
|
}
|
|
}
|
|
QgsFeature f = feature;
|
|
QgsAttributes attributes = f.attributes();
|
|
attributes << x << y;
|
|
f.setAttributes( attributes );
|
|
return QgsFeatureList() << f;
|
|
}
|
|
|
|
bool QgsAddXYFieldsAlgorithm::supportInPlaceEdit( const QgsMapLayer *layer ) const
|
|
{
|
|
Q_UNUSED( layer )
|
|
return false;
|
|
}
|
|
|
|
///@endcond
|