26using namespace Qt::StringLiterals;
33 return formatAsPair( x, precision );
36 return formatXAsDegreesMinutesSeconds( x, precision, flags );
39 return formatXAsDegreesMinutes( x, precision, flags );
42 return formatXAsDegrees( x, precision, flags );
52 return formatAsPair( y, precision );
55 return formatYAsDegreesMinutesSeconds( y, precision, flags );
58 return formatYAsDegreesMinutes( y, precision, flags );
61 return formatYAsDegrees( y, precision, flags );
68 const QString formattedX =
formatX( point.
x(),
format, precision, flags );
69 const QString formattedY =
formatY( point.
y(),
format, precision, flags );
85 const QString formattedX = formatAsPair( x, precision );
86 const QString formattedY = formatAsPair( y, precision );
102 return QLocale().decimalPoint() ==
','_L1 ?
' '_L1 :
','_L1;
105QString QgsCoordinateFormatter::formatAsPair(
double val,
int precision )
107 return std::isfinite( val ) ? QLocale().toString( val,
'f', precision ) : QObject::tr(
"infinite" );
110QString QgsCoordinateFormatter::formatXAsDegreesMinutesSeconds(
double val,
int precision, FormatFlags flags )
113 double wrappedX = std::fmod( val, 360.0 );
115 if ( wrappedX > 180.0 )
117 wrappedX = wrappedX - 360.0;
119 else if ( wrappedX < -180.0 )
121 wrappedX = wrappedX + 360.0;
124 const double precisionMultiplier = std::pow( 10.0, precision );
126 int degreesX = int( std::fabs( wrappedX ) );
127 const double floatMinutesX = ( std::fabs( wrappedX ) - degreesX ) * 60.0;
128 int intMinutesX = int( floatMinutesX );
129 double secondsX = ( floatMinutesX - intMinutesX ) * 60.0;
132 if ( std::round( secondsX * precisionMultiplier ) >= 60 * precisionMultiplier )
134 secondsX = std::max( secondsX - 60, 0.0 );
136 if ( intMinutesX >= 60 )
147 hemisphere = wrappedX < 0 ? QObject::tr(
"W" ) : QObject::tr(
"E" );
153 sign = QLocale().negativeSign();
158 if ( degreesX == 0 && intMinutesX == 0 && std::round( secondsX * precisionMultiplier ) == 0 )
165 if ( degreesX == 180 && intMinutesX == 0 && std::round( secondsX * precisionMultiplier ) == 0 )
176 minutesX = QString(
"%L1" ).arg( intMinutesX, 2, 10, QChar(
'0' ) );
177 const int digits = 2 + ( precision == 0 ? 0 : 1 + precision );
178 strSecondsX = QString(
"%L1" ).arg( secondsX, digits,
'f', precision, QChar(
'0' ) );
182 minutesX = QLocale().toString( intMinutesX );
183 strSecondsX = QLocale().toString( secondsX,
'f', precision );
186 return sign + QLocale().toString( degreesX ) + QChar( 176 ) +
187 minutesX + QChar( 0x2032 ) +
188 strSecondsX + QChar( 0x2033 ) +
192QString QgsCoordinateFormatter::formatYAsDegreesMinutesSeconds(
double val,
int precision, FormatFlags flags )
195 double wrappedY = std::fmod( val, 180.0 );
197 if ( wrappedY > 90.0 )
199 wrappedY = wrappedY - 180.0;
201 else if ( wrappedY < -90.0 )
203 wrappedY = wrappedY + 180.0;
206 const double precisionMultiplier = std::pow( 10.0, precision );
208 int degreesY = int( std::fabs( wrappedY ) );
209 const double floatMinutesY = ( std::fabs( wrappedY ) - degreesY ) * 60.0;
210 int intMinutesY = int( floatMinutesY );
211 double secondsY = ( floatMinutesY - intMinutesY ) * 60.0;
214 if ( std::round( secondsY * precisionMultiplier ) >= 60 * precisionMultiplier )
216 secondsY = std::max( secondsY - 60, 0.0 );
218 if ( intMinutesY >= 60 )
229 hemisphere = wrappedY < 0 ? QObject::tr(
"S" ) : QObject::tr(
"N" );
235 sign = QLocale().negativeSign();
240 if ( degreesY == 0 && intMinutesY == 0 && std::round( secondsY * precisionMultiplier ) == 0 )
252 strMinutesY = QString(
"%L1" ).arg( intMinutesY, 2, 10, QChar(
'0' ) );
253 const int digits = 2 + ( precision == 0 ? 0 : 1 + precision );
254 strSecondsY = QString(
"%L1" ).arg( secondsY, digits,
'f', precision, QChar(
'0' ) );
258 strMinutesY = QLocale().toString( intMinutesY );
259 strSecondsY = QLocale().toString( secondsY,
'f', precision );
262 return sign + QLocale().toString( degreesY ) + QChar( 176 ) +
263 strMinutesY + QChar( 0x2032 ) +
264 strSecondsY + QChar( 0x2033 ) +
268QString QgsCoordinateFormatter::formatXAsDegreesMinutes(
double val,
int precision, FormatFlags flags )
271 double wrappedX = std::fmod( val, 360.0 );
273 if ( wrappedX > 180.0 )
275 wrappedX = wrappedX - 360.0;
277 else if ( wrappedX < -180.0 )
279 wrappedX = wrappedX + 360.0;
282 int degreesX = int( std::fabs( wrappedX ) );
283 double floatMinutesX = ( std::fabs( wrappedX ) - degreesX ) * 60.0;
285 const double precisionMultiplier = std::pow( 10.0, precision );
288 if ( std::round( floatMinutesX * precisionMultiplier ) >= 60 * precisionMultiplier )
290 floatMinutesX = std::max( floatMinutesX - 60, 0.0 );
298 hemisphere = wrappedX < 0 ? QObject::tr(
"W" ) : QObject::tr(
"E" );
304 sign = QLocale().negativeSign();
309 if ( degreesX == 0 && std::round( floatMinutesX * precisionMultiplier ) == 0 )
316 if ( degreesX == 180 && std::round( floatMinutesX * precisionMultiplier ) == 0 )
322 const int digits = 2 + ( precision == 0 ? 0 : 1 + precision );
323 const QString strMinutesX = flags.testFlag(
FlagDegreesPadMinutesSeconds ) ? QString(
"%1" ).arg( floatMinutesX, digits,
'f', precision, QChar(
'0' ) )
324 : QLocale().toString( floatMinutesX,
'f', precision );
326 return sign + QLocale().toString( degreesX ) + QChar( 176 ) +
327 strMinutesX + QChar( 0x2032 ) +
331QString QgsCoordinateFormatter::formatYAsDegreesMinutes(
double val,
int precision, FormatFlags flags )
334 double wrappedY = std::fmod( val, 180.0 );
336 if ( wrappedY > 90.0 )
338 wrappedY = wrappedY - 180.0;
340 else if ( wrappedY < -90.0 )
342 wrappedY = wrappedY + 180.0;
345 int degreesY = int( std::fabs( wrappedY ) );
346 double floatMinutesY = ( std::fabs( wrappedY ) - degreesY ) * 60.0;
348 const double precisionMultiplier = std::pow( 10.0, precision );
351 if ( std::round( floatMinutesY * precisionMultiplier ) >= 60 * precisionMultiplier )
353 floatMinutesY = std::max( floatMinutesY - 60, 0.0 );
361 hemisphere = wrappedY < 0 ? QObject::tr(
"S" ) : QObject::tr(
"N" );
367 sign = QLocale().negativeSign();
372 if ( degreesY == 0 && std::round( floatMinutesY * precisionMultiplier ) == 0 )
380 const int digits = 2 + ( precision == 0 ? 0 : 1 + precision );
381 const QString strMinutesY = flags.testFlag(
FlagDegreesPadMinutesSeconds ) ? QString(
"%1" ).arg( floatMinutesY, digits,
'f', precision, QChar(
'0' ) )
382 : QLocale().toString( floatMinutesY,
'f', precision );
384 return sign + QLocale().toString( degreesY ) + QChar( 176 ) +
385 strMinutesY + QChar( 0x2032 ) +
389QString QgsCoordinateFormatter::formatXAsDegrees(
double val,
int precision, FormatFlags flags )
392 double wrappedX = std::fmod( val, 360.0 );
394 if ( wrappedX > 180.0 )
396 wrappedX = wrappedX - 360.0;
398 else if ( wrappedX < -180.0 )
400 wrappedX = wrappedX + 360.0;
403 const double absX = std::fabs( wrappedX );
405 const double precisionMultiplier = std::pow( 10.0, precision );
411 hemisphere = wrappedX < 0 ? QObject::tr(
"W" ) : QObject::tr(
"E" );
417 sign = QLocale().negativeSign();
422 if ( std::round( absX * precisionMultiplier ) == 0 )
429 if ( std::round( absX * precisionMultiplier ) == 180 * precisionMultiplier )
435 return sign + QLocale().toString( absX,
'f', precision ) + QChar( 176 ) + hemisphere;
438QString QgsCoordinateFormatter::formatYAsDegrees(
double val,
int precision, FormatFlags flags )
441 double wrappedY = std::fmod( val, 180.0 );
443 if ( wrappedY > 90.0 )
445 wrappedY = wrappedY - 180.0;
447 else if ( wrappedY < -90.0 )
449 wrappedY = wrappedY + 180.0;
452 const double absY = std::fabs( wrappedY );
454 const double precisionMultiplier = std::pow( 10.0, precision );
460 hemisphere = wrappedY < 0 ? QObject::tr(
"S" ) : QObject::tr(
"N" );
466 sign = QLocale().negativeSign();
471 if ( std::round( absY * precisionMultiplier ) == 0 )
477 return sign + QLocale().toString( absY,
'f', precision ) + QChar( 176 ) + hemisphere;
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).
#define BUILTIN_UNREACHABLE