def testFormatXPair(self):
        """Test formatting x as pair"""

        self.assertEqual(QgsCoordinateFormatter.formatX(20, QgsCoordinateFormatter.FormatPair, 0), '20')
        self.assertEqual(QgsCoordinateFormatter.formatX(-20, QgsCoordinateFormatter.FormatPair, 0), '-20')
        self.assertEqual(QgsCoordinateFormatter.formatX(20.11111111111111111, QgsCoordinateFormatter.FormatPair, 3), '20.111')
        self.assertEqual(QgsCoordinateFormatter.formatX(20.11161111111111111, QgsCoordinateFormatter.FormatPair, 3), '20.112')
        self.assertEqual(QgsCoordinateFormatter.formatX(20, QgsCoordinateFormatter.FormatPair, 3), '20.000')
        self.assertEqual(QgsCoordinateFormatter.formatX(float('inf'), QgsCoordinateFormatter.FormatPair, 3), 'infinite')
    def testFormatXPair(self):
        """Test formatting x as pair"""

        self.assertEqual(QgsCoordinateFormatter.formatX(20, QgsCoordinateFormatter.FormatPair, 0), '20')
        self.assertEqual(QgsCoordinateFormatter.formatX(-20, QgsCoordinateFormatter.FormatPair, 0), '-20')
        self.assertEqual(QgsCoordinateFormatter.formatX(20.11111111111111111, QgsCoordinateFormatter.FormatPair, 3), '20.111')
        self.assertEqual(QgsCoordinateFormatter.formatX(20.11161111111111111, QgsCoordinateFormatter.FormatPair, 3), '20.112')
        self.assertEqual(QgsCoordinateFormatter.formatX(20, QgsCoordinateFormatter.FormatPair, 3), '20.000')
        self.assertEqual(QgsCoordinateFormatter.formatX(float('inf'), QgsCoordinateFormatter.FormatPair, 3), 'infinite')
    def formattedCoordinateElevation(self, point, elevation):
        lon = QgsCoordinateFormatter.formatX(
            point.x(), QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 3)
        lon = lon[-1:] + lon[:-1]
        lon = lon.replace('°', '° ').replace('′', '\' ').replace('″', '\"')
        lat = QgsCoordinateFormatter.formatY(
            point.y(), QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 3)
        lat = lat[-1:] + lat[:-1]
        lat = lat.replace('°', '° ').replace('′', '\' ').replace('″', '\"')

        if (elevation > 999999.99):
            elevation = 999999.99
        elevation = f'{elevation:.2f}'
        elevation = elevation.rjust(9, '0')

        return '{},{},+{}'.format(lat, lon, elevation)
Exemple #4
0
    def run(self):
        """Run method that performs all the real work"""

        # Create the dialog with elements (after translation) and keep reference
        # Only create GUI ONCE in callback, so that it will only load when the plugin is started
        if self.first_start == True:
            self.first_start = False
            self.dlg = SetLocationDialog()
            self.dlg.pushButton.clicked.connect(self.select_output_file)

            # Fetch the currently loaded layers
            layers = QgsProject.instance().layerTreeRoot().children()
            # Clear the contents of the comboBox and lineEdit from previous runs
            self.dlg.comboBox.clear()
            self.dlg.lineEdit.clear()
            self.dlg.lineEdit_2.clear()
            # Populate the comboBox with names of all the loaded layers
            self.dlg.comboBox.addItems([layer.name() for layer in layers])


        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:

            filename = self.dlg.lineEdit_2.text()
            with open(filename, 'w') as output_file:
                selectedLayerIndex = self.dlg.comboBox.currentIndex()
                selectedLayer = layers[selectedLayerIndex].layer()
                fieldnames = [field.name() for field in selectedLayer.fields()]
                # write header
                line = ','.join(name for name in fieldnames) + '\n'
                output_file.write(line)
                # wirte feature attributes
                for f in selectedLayer.getFeatures():
                    line = ','.join(str(f[name]) for name in fieldnames) + '\n'
                    output_file.write(line)

            x = float(self.dlg.lineEdit.text())
            flags = QgsCoordinateFormatter.FlagDegreesUseStringSuffix
            y = QgsCoordinateFormatter.formatX(x, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, flags)

            self.iface.messageBar().pushMessage(
                "Success", y,
                level=Qgis.Success, duration=7)
Exemple #5
0
    def testFormatXDegrees(self):
        """Test formatting x as decimal degrees"""

        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"80.00°E")

        # check precision
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDecimalDegrees, 4),
            u"80.0000°E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80.12345678, QgsCoordinateFormatter.FormatDecimalDegrees, 4),
            u"80.1235°E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80.12345678, QgsCoordinateFormatter.FormatDecimalDegrees, 0),
            u"80°E")

        # check if longitudes > 180 or <-180 wrap around
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                370, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"10.00°E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -370, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"10.00°W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                181, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"179.00°W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -181, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"179.00°E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                359, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"1.00°W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -359, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"1.00°E")

        # should be no directional suffixes for 0 degree coordinates
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"0.00°")
        # should also be no directional suffix for 0 degree coordinates within specified precision
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"0.00°")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"0.00°")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 5),
            u"0.00001°W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 5),
            u"0.00001°E")

        # should be no directional suffixes for 180 degree longitudes
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                180, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"180.00°")

        # should also be no directional suffix for 180 degree longitudes within specified precision
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                180.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"180.00°")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                179.999999, QgsCoordinateFormatter.FormatDecimalDegrees, 2),
            u"180.00°")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                180.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 6),
            u"179.999999°W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                179.999999, QgsCoordinateFormatter.FormatDecimalDegrees, 6),
            u"179.999999°E")

        # test without direction suffix
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDecimalDegrees, 2,
                QgsCoordinateFormatter.FormatFlags()), u"80.00°")
        # test 0 longitude
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0, QgsCoordinateFormatter.FormatDecimalDegrees, 2,
                QgsCoordinateFormatter.FormatFlags()), u"0.00°")
        # test near zero longitude
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 2,
                QgsCoordinateFormatter.FormatFlags()), u"0.00°")
        # should be no "-" prefix for near-zero longitude when rounding to 2 decimal places
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 2,
                QgsCoordinateFormatter.FormatFlags()), u"0.00°")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 6,
                QgsCoordinateFormatter.FormatFlags()), u"0.000001°")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 6,
                QgsCoordinateFormatter.FormatFlags()), u"-0.000001°")
Exemple #6
0
    def testFormatXDegreesMinutes(self):
        """Test formatting x as DM"""

        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"80°0.00′E")

        # check precision
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDegreesMinutes, 4),
            u"80°0.0000′E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80.12345678, QgsCoordinateFormatter.FormatDegreesMinutes, 4),
            u"80°7.4074′E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80.12345678, QgsCoordinateFormatter.FormatDegreesMinutes, 0),
            u"80°7′E")

        # check if longitudes > 180 or <-180 wrap around
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                370, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"10°0.00′E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -370, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"10°0.00′W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                181, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"179°0.00′W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -181, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"179°0.00′E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                359, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"1°0.00′W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -359, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"1°0.00′E")

        # should be no directional suffixes for 0 degree coordinates
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0, QgsCoordinateFormatter.FormatDegreesMinutes, 2), u"0°0.00′")
        # should also be no directional suffix for 0 degree coordinates within specified precision
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"0°0.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"0°0.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5),
            u"0°0.00006′W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5),
            u"0°0.00006′E")

        # test rounding does not create minutes >= 60
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                99.999999, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"100°0.00′E")

        # should be no directional suffixes for 180 degree longitudes
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                180, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"180°0.00′")

        # should also be no directional suffix for 180 degree longitudes within specified precision
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                180.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"180°0.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                179.999999, QgsCoordinateFormatter.FormatDegreesMinutes, 2),
            u"180°0.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                180.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5),
            u"179°59.99994′W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                179.999999, QgsCoordinateFormatter.FormatDegreesMinutes, 5),
            u"179°59.99994′E")

        # test without direction suffix
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                QgsCoordinateFormatter.FormatFlags()), u"80°0.00′")
        # test 0 longitude
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                QgsCoordinateFormatter.FormatFlags()), u"0°0.00′")
        # test near zero longitude
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                QgsCoordinateFormatter.FormatFlags()), u"0°0.00′")
        # should be no "-" prefix for near-zero longitude when rounding to 2 decimal places
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                QgsCoordinateFormatter.FormatFlags()), u"0°0.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5,
                QgsCoordinateFormatter.FormatFlags()), u"0°0.00006′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5,
                QgsCoordinateFormatter.FormatFlags()), u"-0°0.00006′")

        # test with padding
        padding_and_suffix = QgsCoordinateFormatter.FormatFlags(
            QgsCoordinateFormatter.FlagDegreesPadMinutesSeconds
            | QgsCoordinateFormatter.FlagDegreesUseStringSuffix)
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                80, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                padding_and_suffix), u"80°00.00′E")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                padding_and_suffix), u"0°00.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                padding_and_suffix), u"0°00.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 2,
                padding_and_suffix), u"0°00.00′")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                -0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5,
                padding_and_suffix), u"0°00.00006′W")
        self.assertEqual(
            QgsCoordinateFormatter.formatX(
                0.000001, QgsCoordinateFormatter.FormatDegreesMinutes, 5,
                padding_and_suffix), u"0°00.00006′E")
    def testFormatXFormatDegreesMinutesSeconds(self):
        """Test formatting x as DMS"""

        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"80°0′0.00″E")

        # check precision
        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 4), u"80°0′0.0000″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(80.12345678, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 4), u"80°7′24.4444″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(80.12345678, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 0), u"80°7′24″E")

        # check if longitudes > 180 or <-180 wrap around
        self.assertEqual(QgsCoordinateFormatter.formatX(370, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"10°0′0.00″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(-370, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"10°0′0.00″W")
        self.assertEqual(QgsCoordinateFormatter.formatX(181, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"179°0′0.00″W")
        self.assertEqual(QgsCoordinateFormatter.formatX(-181, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"179°0′0.00″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(359, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"1°0′0.00″W")
        self.assertEqual(QgsCoordinateFormatter.formatX(-359, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"1°0′0.00″E")

        # should be no directional suffixes for 0 degree coordinates
        self.assertEqual(QgsCoordinateFormatter.formatX(0, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"0°0′0.00″")
        # should also be no directional suffix for 0 degree coordinates within specified precision
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"0°0′0.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5), u"0°0′0.00360″W")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"0°0′0.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5), u"0°0′0.00360″E")

        # should be no directional suffixes for 180 degree longitudes
        self.assertEqual(QgsCoordinateFormatter.formatX(180, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"180°0′0.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(179.999999, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"180°0′0.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(179.999999, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5), u"179°59′59.99640″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(180.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"180°0′0.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(180.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5), u"179°59′59.99640″W")

        # test rounding does not create seconds >= 60
        self.assertEqual(QgsCoordinateFormatter.formatX(99.999999, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"100°0′0.00″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(89.999999, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2), u"90°0′0.00″E")

        # test without direction suffix
        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, QgsCoordinateFormatter.FormatFlags()), u"80°0′0.00″")

        # test 0 longitude
        self.assertEqual(QgsCoordinateFormatter.formatX(0, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, QgsCoordinateFormatter.FormatFlags()), u"0°0′0.00″")
        # test near zero longitude
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, QgsCoordinateFormatter.FormatFlags()), u"0°0′0.00″")
        # should be no "-" prefix for near-zero longitude when rounding to 2 decimal places
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, QgsCoordinateFormatter.FormatFlags()), u"0°0′0.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5, QgsCoordinateFormatter.FormatFlags()), u"0°0′0.00360″")
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5, QgsCoordinateFormatter.FormatFlags()), u"-0°0′0.00360″")

        # test with padding
        padding_and_suffix = QgsCoordinateFormatter.FormatFlags(QgsCoordinateFormatter.FlagDegreesPadMinutesSeconds | QgsCoordinateFormatter.FlagDegreesUseStringSuffix)
        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, padding_and_suffix), u"80°00′00.00″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(85.44, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, padding_and_suffix), u"85°26′24.00″E")
        self.assertEqual(QgsCoordinateFormatter.formatX(0, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, padding_and_suffix), u"0°00′00.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, padding_and_suffix), u"0°00′00.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, padding_and_suffix), u"0°00′00.00″")
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5, padding_and_suffix), u"0°00′00.00360″W")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 5, padding_and_suffix), u"0°00′00.00360″E")
    def testFormatXDegrees(self):
        """Test formatting x as decimal degrees"""

        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"80.00°E")

        # check precision
        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDecimalDegrees, 4), u"80.0000°E")
        self.assertEqual(QgsCoordinateFormatter.formatX(80.12345678, QgsCoordinateFormatter.FormatDecimalDegrees, 4), u"80.1235°E")
        self.assertEqual(QgsCoordinateFormatter.formatX(80.12345678, QgsCoordinateFormatter.FormatDecimalDegrees, 0), u"80°E")

        # check if longitudes > 180 or <-180 wrap around
        self.assertEqual(QgsCoordinateFormatter.formatX(370, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"10.00°E")
        self.assertEqual(QgsCoordinateFormatter.formatX(-370, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"10.00°W")
        self.assertEqual(QgsCoordinateFormatter.formatX(181, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"179.00°W")
        self.assertEqual(QgsCoordinateFormatter.formatX(-181, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"179.00°E")
        self.assertEqual(QgsCoordinateFormatter.formatX(359, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"1.00°W")
        self.assertEqual(QgsCoordinateFormatter.formatX(-359, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"1.00°E")

        # should be no directional suffixes for 0 degree coordinates
        self.assertEqual(QgsCoordinateFormatter.formatX(0, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"0.00°")
        # should also be no directional suffix for 0 degree coordinates within specified precision
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"0.00°")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"0.00°")
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 5), u"0.00001°W")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.00001, QgsCoordinateFormatter.FormatDecimalDegrees, 5), u"0.00001°E")

        # should be no directional suffixes for 180 degree longitudes
        self.assertEqual(QgsCoordinateFormatter.formatX(180, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"180.00°")

        # should also be no directional suffix for 180 degree longitudes within specified precision
        self.assertEqual(QgsCoordinateFormatter.formatX(180.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"180.00°")
        self.assertEqual(QgsCoordinateFormatter.formatX(179.999999, QgsCoordinateFormatter.FormatDecimalDegrees, 2), u"180.00°")
        self.assertEqual(QgsCoordinateFormatter.formatX(180.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 6), u"179.999999°W")
        self.assertEqual(QgsCoordinateFormatter.formatX(179.999999, QgsCoordinateFormatter.FormatDecimalDegrees, 6), u"179.999999°E")

        # test without direction suffix
        self.assertEqual(QgsCoordinateFormatter.formatX(80, QgsCoordinateFormatter.FormatDecimalDegrees, 2, QgsCoordinateFormatter.FormatFlags()), u"80.00°")
        # test 0 longitude
        self.assertEqual(QgsCoordinateFormatter.formatX(0, QgsCoordinateFormatter.FormatDecimalDegrees, 2, QgsCoordinateFormatter.FormatFlags()), u"0.00°")
        # test near zero longitude
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 2, QgsCoordinateFormatter.FormatFlags()), u"0.00°")
        # should be no "-" prefix for near-zero longitude when rounding to 2 decimal places
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 2, QgsCoordinateFormatter.FormatFlags()), u"0.00°")
        self.assertEqual(QgsCoordinateFormatter.formatX(0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 6, QgsCoordinateFormatter.FormatFlags()), u"0.000001°")
        self.assertEqual(QgsCoordinateFormatter.formatX(-0.000001, QgsCoordinateFormatter.FormatDecimalDegrees, 6, QgsCoordinateFormatter.FormatFlags()), u"-0.000001°")