31#include <QRegularExpression>
40 const bool automatic = project->
readBoolEntry( QStringLiteral(
"PositionPrecision" ), QStringLiteral(
"/Automatic" ) );
59 dp =
static_cast<int>( std::ceil( -1.0 * std::log10( mapUnitsPerPixel ) ) );
76 dp = project->
readNumEntry( QStringLiteral(
"PositionPrecision" ), QStringLiteral(
"/DecimalPlaces" ) );
93 const bool automatic = prj->
readBoolEntry( QStringLiteral(
"PositionPrecision" ), QStringLiteral(
"/Automatic" ) );
96 return prj->
readNumEntry( QStringLiteral(
"PositionPrecision" ), QStringLiteral(
"/DecimalPlaces" ), 6 );
99 return calculateCoordinatePrecision(
crs );
105 if ( unit == Qgis::DistanceUnit::Degrees )
122 formatCoordinatePartsForProject( project, point, destCrs,
precision, formattedX, formattedY );
124 if ( formattedX.isEmpty() || formattedY.isEmpty() )
171 if ( destCrs !=
crs )
176 p = ct.transform( point );
187 format->setNumberDecimalPlaces(
precision );
191 x = format->formatDouble( p.
x(), context );
193 y = format->formatDouble( p.
y(), context );
198 x = QgsCoordinateFormatter::formatAsPair( p.
x(),
precision );
199 y = QgsCoordinateFormatter::formatAsPair( p.
y(),
precision );
207 return QStringLiteral(
"%1 : %2" ).arg( QgsCoordinateUtils::formatCoordinateForProject( project, p1, destCrs,
precision ),
208 QgsCoordinateUtils::formatCoordinateForProject( project, p2, destCrs,
precision ) );
211double QgsCoordinateUtils::degreeToDecimal(
const QString &
string,
bool *ok,
bool *isEasting )
213 const QString negative( QStringLiteral(
"swSW" ) );
214 const QString easting( QStringLiteral(
"eEwW" ) );
216 bool okValue =
false;
227 const QLocale locale;
228 QRegularExpression degreeWithSuffix( QStringLiteral(
"^\\s*([-]?\\d{1,3}(?:[\\.\\%1]\\d+)?)\\s*([NSEWnsew])\\s*$" )
229 .arg( locale.decimalPoint() ) );
230 QRegularExpressionMatch match = degreeWithSuffix.match(
string );
231 if ( match.hasMatch() )
233 const QString suffix = match.captured( 2 );
234 value = std::abs( match.captured( 1 ).toDouble( ok ) );
237 value = std::abs( locale.toDouble( match.captured( 1 ), ok ) );
241 value *= ( negative.contains( suffix ) ? -1 : 1 );
244 *isEasting = easting.contains( suffix );
251double QgsCoordinateUtils::dmsToDecimal(
const QString &
string,
bool *ok,
bool *isEasting )
253 const QString negative( QStringLiteral(
"swSW-" ) );
254 const QString easting( QStringLiteral(
"eEwW" ) );
256 bool okValue =
false;
267 const QLocale locale;
268 const QRegularExpression dms( QStringLiteral(
"^\\s*(?:([-+nsew])\\s*)?(\\d{1,3})(?:[^0-9.]+([0-5]?\\d))?[^0-9.]+([0-5]?\\d(?:[\\.\\%1]\\d+)?)[^0-9.,]*?([-+nsew])?\\s*$" )
269 .arg( locale.decimalPoint() ), QRegularExpression::CaseInsensitiveOption );
270 const QRegularExpressionMatch match = dms.match(
string.trimmed() );
271 if ( match.hasMatch() )
273 const QString dms1 = match.captured( 2 );
274 const QString dms2 = match.captured( 3 );
275 const QString dms3 = match.captured( 4 );
277 double v = dms3.toDouble( ok );
280 v = locale.toDouble( dms3, ok );
285 if ( !dms2.isEmpty() )
287 v = dms2.toInt( ok ) + v / 60.0;
291 v = dms1.toInt( ok ) + v / 60.0;
295 const QString sign1 = match.captured( 1 );
296 const QString sign2 = match.captured( 5 );
298 if ( sign1.isEmpty() )
300 value = !sign2.isEmpty() && negative.contains( sign2 ) ? -v : v;
303 *isEasting = easting.contains( sign2 );
306 else if ( sign2.isEmpty() )
308 value = !sign1.isEmpty() && negative.contains( sign1 ) ? -v : v;
311 *isEasting = easting.contains( sign2 );
@ MapGeographic
Map Geographic CRS equivalent (stays unchanged if the map CRS is geographic)
DistanceUnit
Units of distance.
CoordinateOrder
Order of coordinates.
@ XY
Easting/Northing (or Longitude/Latitude for geographic CRS)
@ Default
Respect the default axis ordering for the CRS, as defined in the CRS's parameters.
@ YX
Northing/Easting (or Latitude/Longitude for geographic CRS)
static Qgis::CoordinateOrder defaultCoordinateOrderForCrs(const QgsCoordinateReferenceSystem &crs)
Returns the default coordinate order to use for the specified crs.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Q_GADGET Qgis::DistanceUnit mapUnits
Custom exception class for Coordinate Reference System related exceptions.
A context for numeric formats.
void setInterpretation(Interpretation interpretation)
Sets the interpretation of the numbers being converted.
@ Latitude
Latitude values.
@ Longitude
Longitude values.
A class to represent a 2D point.
const QgsGeographicCoordinateNumericFormat * geographicCoordinateFormat() const
Returns the project's geographic coordinate format, which controls how geographic coordinates associa...
QgsCoordinateReferenceSystem coordinateCustomCrs
Qgis::CoordinateOrder coordinateAxisOrder
Qgis::CoordinateDisplayType coordinateType
QgsCoordinateReferenceSystem coordinateCrs
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
int readNumEntry(const QString &scope, const QString &key, int def=0, bool *ok=nullptr) const
Reads an integer from the specified scope and key.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsProjectDisplaySettings * displaySettings
bool readBoolEntry(const QString &scope, const QString &key, bool def=false, bool *ok=nullptr) const
Reads a boolean from the specified scope and key.
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
#define BUILTIN_UNREACHABLE
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
const QgsCoordinateReferenceSystem & crs