Exemplo n.º 1
0
    def testDms(self):
        # dms module tests
        self.test('parseDMS', parseDMS(  '0.0°'), '0.0')
        self.test('parseDMS', parseDMS(    '0°'), '0.0')
        self.test('parseDMS', parseDMS('''000°00'00"'''),   '0.0')
        self.test('parseDMS', parseDMS('''000°00'00.0"'''), '0.0')
        self.test('parseDMS', parseDMS('''000° 00'00"'''),    '0.0')
        self.test('parseDMS', parseDMS('''000°00 ' 00.0"'''), '0.0')

        x = parse3llh('000° 00′ 05.31″W, 51° 28′ 40.12″ N')
        x = ', '.join('%.6f' % a for a in x)  # XXX fStr
        self.test('parse3llh', x, '51.477811, -0.001475, 0.000000')

        for a, x in (((),            '''45°45'45.36"'''),
                     ((F_D, None),     '45.7626°'),
                     ((F_DM, None),    "45°45.756'"),
                     ((F_DMS, None), '''45°45'45.36"'''),
                     ((F_D, 6),     '45.7626°'),
                     ((F_DM, -4),   "45°45.7560'"),
                     ((F_DMS, 2), '''45°45'45.36"''')):
            self.test('toDMS', toDMS(45.76260, *a), x)

        for a, x in (((1,),   'N'),
                     ((0,),   'N'),
                     ((-1,),  'N'),
                     ((359,), 'N'),
                     ((24,),   'NNE'),
                     ((24, 1), 'N'),
                     ((24, 2), 'NE'),
                     ((24, 3), 'NNE'),
                     ((226,),   'SW'),
                     ((226, 1), 'W'),
                     ((226, 2), 'SW'),
                     ((226, 3), 'SW'),
                     ((237,),   'WSW'),
                     ((237, 1), 'W'),
                     ((237, 2), 'SW'),
                     ((237, 3), 'WSW')):
            self.test('compassPoint', compassPoint(*a), x)
Exemplo n.º 2
0
    def testEcef(self, Ecef):

        self.test(Ecef.__name__, '...', '...', nl=1)

        Karney = Ecef is EcefKarney
        Sudano = Ecef is EcefSudano

        g = Ecef(Datums.WGS84, name='Test')
        self.test('name', g.name, 'Test')

        t = g.toStr2()
        self.test('toStr', t, g.classname, known=True)

        t = Ecef(g.a, g.f, name=g.name)  # coverage
        self.test('a, f', t, t.classname, known=True)

        self.testCopy(g)

        # <https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1Geocentric.html>
        t = g.forward(27.99, 86.93, 8820)  # Mt Everest
        self.test('forward', fstr(t[3:6], prec=2), '27.99, 86.93, 8820.0')
        self.test('forward', fstr(t[0:3], prec=1),
                  '302271.4, 5635928.4, 2979666.1')
        self.test('name', t.name, 'Test')

        t = g.reverse(302271.4, 5635928.4, 2979666.1)
        self.test('reverse', fstr(t[0:3], prec=1),
                  '302271.4, 5635928.4, 2979666.1')
        self.test('reverse',
                  fstr(t[3:6], prec=2),
                  '27.99, 86.93, 8820.01',
                  known=Sudano and _known(t, 27.99, 8820))
        self.test('case', t.C, 2 if Karney else (5 if Sudano else 1))
        self.test('iteration', t.iteration, t.iteration)
        self.test('name', t.name, 'Test')

        # <https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1Geocentric.html>
        t = g.reverse(302e3, 5636e3, 2980e3)
        self.test('reverse', fstr(t[0:3], prec=1),
                  '302000.0, 5636000.0, 2980000.0')
        self.test('reverse',
                  fstr(t[3:6], prec=2),
                  '27.99, 86.93, 9027.03',
                  known=Sudano and _known(t, 27.99, 9027))
        self.test('case', t.C, 2 if Karney else (5 if Sudano else 1))
        self.test('iteration', t.iteration, t.iteration)

        t = g.forward(27.99, 86.93, 8820.0)
        self.test('forward', fstr(t[3:6], prec=2), '27.99, 86.93, 8820.0')
        self.test('forward', fstr(t[0:3], prec=2),
                  '302271.43, 5635928.37, 2979666.13')

        # <https://GeographicLib.SourceForge.io/html/CartConvert.1.html>
        t = g.forward(33.3, 44.4, 6000)
        self.test('forward', fstr(t[3:6], prec=2), '33.3, 44.4, 6000.0')
        self.test('forward', fstr(t[0:3], prec=2),
                  '3816209.6, 3737108.55, 3485109.57')

        t = g.reverse(3816209.6, 3737108.55, 3485109.57)
        self.test('reverse', fstr(t[0:3], prec=2),
                  '3816209.6, 3737108.55, 3485109.57')
        self.test('reverse',
                  fstr(t[3:6], prec=3),
                  '33.3, 44.4, 5999.996',
                  known=Sudano and _known(t, 33.3, 5999))
        self.test('case', t.C, 2 if Karney else (5 if Sudano else 1))
        self.test('iteration', t.iteration, t.iteration)

        # <https://GeographicLib.SourceForge.io/html/CartConvert.1.html>
        t = g.reverse(30000, 30000, 0)
        self.test('reverse', fstr(t[0:3], prec=1), '30000.0, 30000.0, 0.0')
        self.test('reverse',
                  fstr(t[3:6], prec=3),
                  '6.483, 45.0, -6335709.726',
                  known=not Karney)
        self.test('case', t.C, 3 if Karney else (0 if Sudano else 1))
        self.test('iteration', t.iteration, t.iteration)

        t = g.forward(6.483, 45.0, -6335709.726)
        self.test('forward', fstr(t[3:6], prec=3), '6.483, 45.0, -6335709.726')
        self.test('forward',
                  fstr(t[0:3], prec=1),
                  '30000.0, 30000.0, -0.0',
                  known=True)

        # Rey-Jer You <https://www.ResearchGate.net/publication/240359424>
        for i, (x, y, z, h) in enumerate(
            ((-2259148.993, 3912960.837, 4488055.516,
              1e3), (-2259502.546, 3913573.210, 4488762.622,
                     2e3), (-2259856.100, 3914185.582, 4489469.729, 3e3),
             (-2260209.653, 3914797.955, 4490176.836,
              4e3), (-2262330.973, 3918472.189, 4494419.477,
                     1e4), (-2265866.507, 3924595.914, 4501490.544, 2e4),
             (-2294150.778, 3973585.709, 4558059.087,
              1e5), (-2541638.152, 4402246.414, 5053033.834,
                     8e5), (-2612348.830, 4524720.901, 5194455.190, 1e6))):
            i = '-%d' % (i + 1, )
            r = '45.0, 120.0, %.1f' % (h, )  # Zero and First order columns
            t = g.reverse(x, y, z)
            k = Sudano and _known(t, 45, h)
            self.test('reverse' + i, fstr(t[3:6], prec=3), r, known=k)
            f = g.forward(t.lat, t.lon, t.height)
            self.test('forward' + i,
                      fstr(f[0:3], prec=1),
                      fstr((x, y, z), prec=1),
                      known=k)
            self.test('xyzh' + i,
                      fstr(f.xyzh, prec=1),
                      fstr((x, y, z, h), prec=1),
                      known=k)
            f = f.phi, f.lam
            t = radians(t.lat), radians(t.lon)
            self.test('philam' + i, fstr(f, prec=4), fstr(t, prec=4))

        # <https://www.researchgate.net/publication/3709199_An_exact_conversion_from_an_Earth-centered_coordinate_system_to_latitude_longitude_and_altitude>
        t = g.reverse(4588301.55696757, 0, 4558059.086984613)
        self.test('sudano',
                  fstr(t[3:6], prec=3),
                  '45.0, 0.0, 100000.0',
                  known=Sudano)

        # <https://www.OrdnanceSurvey.co.UK/documents/resources/guide-coordinate-systems-great-britain.pdf> pp 47
        g = Ecef(Ellipsoids.GRS80, name='OS-UK')
        self.test('name', g.name, 'OS-UK')

        t = g.forward(
            parse3llh('''53°36′43.1653"N, 001°39′51.9920"W, 299.800'''))
        self.test('forward', fstr(t[3:6], prec=8),
                  '53.61199036, -1.66444222, 299.8')
        self.test('forward', fstr(t[0:3], prec=2),
                  '3790644.9, -110149.21, 5111482.97')

        t = g.reverse(3790644.9, -110149.21, 5111482.97)
        self.test('reverse', fstr(t[0:3], prec=2),
                  '3790644.9, -110149.21, 5111482.97')
        self.test('reverse',
                  fstr(t[3:5], prec=8),
                  '53.61199036, -1.66444223',
                  known=Sudano)
        self.test('reverse.lat',
                  latDMS(t.lat, prec=4),
                  '53°36′43.1653″N',
                  known=Sudano)
        self.test('reverse.lon', lonDMS(t.lon, prec=4), '001°39′51.992″W')
        self.test('reverse.height',
                  fstr(t.height, prec=-3),
                  '299.800',
                  known=Sudano)
        self.test('case', t.C, 2 if Karney else (6 if Sudano else 1))
        self.test('iteration', t.iteration, t.iteration)

        # coverage
        self.test(EcefError.__name__,
                  g.reverse(0, 0, 0),
                  '(0.0, 0.0, ...)',
                  known=True)
        try:
            self.test(EcefError.__name__, g.forward(None, None, None),
                      EcefError.__name__)
        except Exception as x:
            self.test(EcefError.__name__,
                      str(x).split(':')[0],
                      'lat (None), lon (None) ...',
                      known=True)
        try:
            self.test(Ecef.__name__, Ecef(None), EcefError.__name__)
        except Exception as x:
            self.test(Ecef.__name__, str(x), Ecef.__name__, known=True)
Exemplo n.º 3
0
    def testDms(self):  # MCCABE 14
        for t in ('0.0°', '0°', '''000°00'00"''', '''000°00'00.0"''',
                  '''000° 00'00"''', '''000°00 ' 00.0"''',
                  '''000° 00' 00.0'''):
            self.test("parseDMS('%s')" % (t, ), parseDMS(t), '0.0')
        t = '000°-00′-00.0"'
        self.test("parseDMS('%s')" % (t, ), parseDMS(t, sep='-'), '0.0')

        _X = ''
        for t, X, x in ((1, '1.0', _X), (12, '12.0', _X), (123, '123.0', _X),
                        (1234, '12.567', '1234.0'), (12345, '123.75',
                                                     '12345.0'),
                        (123456, '12.582', '123456.0'), (1234567, '123.769',
                                                         '1234567.0'),
                        (12345678, '1234.955', '12345678.0'), (.1, 0.1, _X),
                        (1.2, 1.2, _X), (12.3, 12.3, _X), (123.4, 123.4, _X),
                        (1234.5, 12.575, 1234.5), (12345.6, 123.76, 12345.6),
                        (123456.7, 12.582, 123456.7), ('1N', '1.0', _X),
                        ('12S', '-12.0', _X), ('012.3W', '-12.3', _X),
                        ('123E', '123.0', _X), ('1234N', '12.567', '1234.0'),
                        ('12345E', '123.75',
                         '12345.0'), ('1234.5S', '-12.575',
                                      '-1234.5'), ('12345.6E', '123.76',
                                                   '12345.6'),
                        ('123456.7S', '-12.582',
                         '-123456.7'), ('1234567.8W', '-123.769',
                                        '-1234567.8'), ('12345678E',
                                                        '12345678.0', _X)):
            self.test('parseDDDMMSS(%r)' % (t, ), fstr(parseDDDMMSS(t),
                                                       prec=3), X)
            self.test('parseDMS(%r)' % (t, ), fstr(parseDMS(t), prec=3), x
                      or X)

        t = 345.0
        self.test('parseDDDMMSS(%r, NS)' % (t, ),
                  fstr(parseDDDMMSS(t, suffix='NS'), prec=3), '3.75')
        self.test('parseDDDMMSS(%r, EW)' % (t, ),
                  fstr(parseDDDMMSS(t, suffix='EW'), prec=3), '345.0')
        t = 5430.0
        self.test('parseDDDMMSS(%r, NS)' % (t, ),
                  fstr(parseDDDMMSS(t, suffix='NS'), prec=3), '54.5')
        self.test('parseDDDMMSS(%r, EW)' % (t, ),
                  fstr(parseDDDMMSS(t, suffix='EW'), prec=3), '54.5')

        for t, x in (('12E', '12.0'), ('012.3S', '-12.3'), ('123N', '123.0'),
                     ('1234E', '1234.0'), ('12345N', '12345.0'), ('1234.5W',
                                                                  '-1234.5'),
                     ('123456E', '123456.0'), ('1234567S', '-1234567.0')):
            try:
                self.test('parseDDDMMSS(%r)' % (t, ), parseDDDMMSS(t),
                          ParseError.__name__)
            except ParseError as X:
                self.test('parseDDDMMSS(%r)' % (t, ), repr(X), repr(X))
            self.test('parseDMS(%r)' % (t, ), fstr(parseDMS(t), prec=5), x)

        r = rangerrors(True)
        try:
            self.test('parseDMS', parseDMS(181, clip=180), RangeError.__name__)
        except RangeError as x:
            self.test('parseDMS', str(x), str(x))
        rangerrors(False)
        try:
            self.test('parseDMS', parseDMS(-91, clip=90), RangeError.__name__)
        except RangeError as x:
            self.test('parseDMS', str(x), str(x))
        rangerrors(r)

        x = parse3llh('000° 00′ 05.31″W, 51° 28′ 40.12″ N')
        self.test('parse3llh', fstr(x, prec=6), '51.477811, -0.001475, 0.0')

        t = 'toDMS(%s)' % ('', )
        self.test(t, toDMS(45.99999, F_DM, prec=1), '46°00.0′')  # not 45°60.0′
        self.test(t, toDMS(45.99999, F_DM, prec=2), '46°00.0′')
        self.test(t, toDMS(45.9999, F_DM, prec=2), '45°59.99′')
        self.test(t, toDMS(45.99999, F_DM, prec=3), '45°59.999′')
        self.test(t, toDMS(45.99999, F_DMS, prec=1), '46°00′00.0″')
        self.test(t, toDMS(45.99999, F_DMS, prec=2), '45°59′59.96″')
        self.test(t, toDMS(45.99999, F_DMS, prec=3), '45°59′59.964″')

        self.test(t, toDMS(45.76260), '45°45′45.36″')

        for F, p, x in ((F_D, None, '45.7626°'), (F_DM, None, "45°45.756'"),
                        (F_DMS, None, '''45°45'45.36"'''),
                        (F_DEG, None, '45.7626'), (F_MIN, None, '4545.756'),
                        (F_SEC, None, '454545.36'), (F_RAD, None, '0.79871'),
                        (F_D, 6, '45.7626°'), (F_DM, -4, "45°45.7560'"),
                        (F_DMS, 2, '''45°45'45.36"'''), (F_DEG, -6,
                                                         '45.762600'),
                        (F_MIN, -5, '4545.75600'), (F_SEC, -3, '454545.360'),
                        (F_RAD, -6, '0.798708'), (F_D_, 6, '45.7626°'),
                        (F_DM_, -4, "45°45.7560'"), (F_DMS_, 2,
                                                     '''45°45'45.36"'''),
                        (F_DEG_, -6, '45.762600'), (F_MIN_, -5, '4545.75600'),
                        (F_SEC_, -3, '454545.360'), (F_RAD_, -6, '0.798708')):
            t = 'toDMS(%s)' % (F, )
            self.test(t, toDMS(45.76260, F, prec=p), x)
            self.test(t, toDMS(-45.76260, F, prec=p), '-' + x)

        for F, p, x in ((F_D__, 6, '45.7626°'), (F_DM__, -4, "45°45.7560'"),
                        (F_DMS__, 2, '''45°45'45.36"'''),
                        (F_DEG__, -6, '45.762600'), (F_MIN__, -5,
                                                     '4545.75600'),
                        (F_SEC__, -3, '454545.360'), (F_RAD__, -6,
                                                      '0.798708')):
            t = 'toDMS(%s)' % (F, )
            self.test(t, toDMS(45.76260, F, prec=p), '+' + x)
            self.test(t, toDMS(-45.76260, F, prec=p), '-' + x)

        # <https://GitHub.com/chrisveness/geodesy/blob/master/test/dms-tests.js>
        for a, x in (
            ((1, ), 'N'),
            ((0, ), 'N'),
            ((-1, ), 'N'),
            ((359, ), 'N'),
            ((24, ), 'NNE'),
            ((24, 1), 'N'),
            ((24, 2), 'NE'),
            ((24, 3), 'NNE'),
            ((226, ), 'SW'),
            ((226, 1), 'W'),
            ((226, 2), 'SW'),
            ((226, 3), 'SW'),
            ((237, ), 'WSW'),
            ((237, 1), 'W'),
            ((237, 2), 'SW'),
            ((237, 3), 'WSW'),
                # Martin Schultz
            ((11.25, ), 'NNE'),
            ((11.249, ), 'N'),
            ((-11.25, ), 'N'),
            ((348.749, ), 'NNW'),
            ((45, 1), 'E'),
            ((44.99, 1), 'N'),
            ((45, 2), 'NE'),
            ((44.99, 2), 'NE'),
            ((45, 3), 'NE'),
            ((44.99, 3), 'NE'),
            ((45, 4), 'NE'),
            ((44.99, 4), 'NE'),  # XXX
            ((22.5, 1), 'N'),
            ((22.49, 1), 'N'),
            ((22.5, 2), 'NE'),
            ((22.49, 2), 'N'),
            ((22.5, 3), 'NNE'),
            ((22.49, 3), 'NNE'),
            ((22.5, 4), 'NNE'),
            ((22.49, 4), 'NNE'),  # XXX
            ((11.25, 1), 'N'),
            ((11.249, 1), 'N'),
            ((11.25, 2), 'N'),
            ((11.249, 2), 'N'),
            ((11.25, 3), 'NNE'),
            ((11.249, 3), 'N'),
            ((11.25, 4), 'NbE'),
            ((11.249, 4), 'NbE'),  # XXX
                # examples
            ((24, 1), 'N'),
            ((24, 2), 'NE'),
            ((24, 3), 'NNE'),
            ((24, ), 'NNE'),
            ((18, 3), 'NNE'),
            ((11, 4), 'NbE'),
            ((30, 4), 'NEbN')):
            self.test('compassPoint%s' % (a, ), compassPoint(*a), x)

        for a, x in enumerate(
            ('NbE', 'NEbN', 'NEbE', 'EbN', 'EbS', 'SEbE', 'SEbS', 'SbE', 'SbW',
             'SWbS', 'SWbW', 'WbS', 'WbN', 'NWbW', 'NWbN', 'NbW')):
            a = 11.25 + a * 22.5
            self.test('compassPoint(%s)' % (a, ), compassPoint(a, 4), x)

        t = degDMS(1.0101, prec=5, s_D='', pos='+')  # coverage
        self.test('_DEG', t, '+1.0101')
        t = degDMS(0.0101, prec=5, s_S='', pos='+')
        self.test('_MIN', t, "+0.606'")
        t = degDMS(0.0101, prec=5, s_M='', pos='+')
        self.test('_SEC', t, '+36.36"')
Exemplo n.º 4
0
    def testDms(self):
        # dms module tests
        self.test('parseDMS', parseDMS('0.0°'), '0.0')
        self.test('parseDMS', parseDMS('0°'), '0.0')
        self.test('parseDMS', parseDMS('''000°00'00"'''), '0.0')
        self.test('parseDMS', parseDMS('''000°00'00.0"'''), '0.0')
        self.test('parseDMS', parseDMS('''000° 00'00"'''), '0.0')
        self.test('parseDMS', parseDMS('''000°00 ' 00.0"'''), '0.0')

        r = rangerrors(True)
        try:
            self.test('parseDMS', parseDMS(181, clip=180), 'ValueError')
        except ValueError as x:
            self.test('parseDMS', str(x), '181.0 beyond 180 degrees')
        rangerrors(False)
        try:
            self.test('parseDMS', parseDMS(-91, clip=90), -90)
        except ValueError as x:
            self.test('parseDMS', str(x), '-90')
        rangerrors(r)

        x = parse3llh('000° 00′ 05.31″W, 51° 28′ 40.12″ N')
        x = ', '.join('%.6f' % a for a in x)  # XXX fStr
        self.test('parse3llh', x, '51.477811, -0.001475, 0.000000')

        for a, x in (((), '''45°45'45.36"'''), ((F_D, None), '45.7626°'),
                     ((F_DM, None), "45°45.756'"), ((F_DMS, None),
                                                    '''45°45'45.36"'''),
                     ((F_DEG, None), '45.7626'), ((F_MIN, None), '4545.756'),
                     ((F_SEC, None), '454545.36'), ((F_RAD, None), '0.79871'),
                     ((F_D, 6), '45.7626°'), ((F_DM, -4), "45°45.7560'"),
                     ((F_DMS, 2), '''45°45'45.36"'''),
                     ((F_DEG, -6), '45.762600'), ((F_MIN, -5), '4545.75600'),
                     ((F_SEC, -3), '454545.360'), ((F_RAD, -6), '0.798708')):
            t = 'toDMS(%s)' % (a[:1] or '')
            self.test(t, toDMS(45.76260, *a), x)

        self.test('compassAngle0', compassAngle(0, 0, 0, 0), 0.0)
        self.test('compassAngle1', compassAngle(0, 0, 10, 10), 45.0)
        self.test('compassAngle2', compassAngle(0, 0, 0, 10), 90.0)
        self.test('compassAngle3', compassAngle(0, 0, -1, 0), 180.0)
        self.test('compassAngle4', compassAngle(0, 0, -1, -1), 225.0)
        self.test('compassAngle5', compassAngle(0, 0, 0, -1), 270.0)
        self.test('compassAngle6', compassAngle(0, 0, 1, -1), 315.0)
        self.test('compassAngle7',
                  compassAngle(0, 0, 99, -1),
                  359.4,
                  fmt='%.1f')

        for a, x in (((1, ), 'N'), ((0, ), 'N'), ((-1, ), 'N'), ((359, ), 'N'),
                     ((24, ), 'NNE'), ((24, 1), 'N'), ((24, 2), 'NE'),
                     ((24, 3), 'NNE'), ((226, ), 'SW'), ((226, 1), 'W'),
                     ((226, 2), 'SW'), ((226, 3), 'SW'), ((237, ), 'WSW'),
                     ((237, 1), 'W'), ((237, 2), 'SW'), ((237, 3), 'WSW')):
            self.test('compassPoint', compassPoint(*a), x)

        for a, x in enumerate(
            ('NbE', 'NEbN', 'NEbE', 'EbN', 'EbS', 'SEbE', 'SEbS', 'SbE', 'SbW',
             'SWbS', 'SWbW', 'WbS', 'WbN', 'NWbW', 'NWbN', 'NbW')):
            a = 11.25 + a * 22.5
            self.test('compassPoint', compassPoint(a, 4), x)

        a = compassAngle(_LHR.lat, _LHR.lon, _FRA.lat, _FRA.lon)
        self.test('compassAngle', a, 100.016848, fmt='%.6f')
        b = _LHR.initialBearingTo(_FRA)
        self.test('initialBearingTo', b, 102.432182, fmt='%.6f')
        d = equirectangular(_LHR.lat, _LHR.lon, _FRA.lat, _FRA.lon)
        self.test('equirectangular', m2km(d), 592.185, fmt='%.3f')
        d = _LHR.distanceTo(_FRA)
        self.test('distanceTo', m2km(d), 591.831, fmt='%.3f')
Exemplo n.º 5
0
    def testDms(self):
        # dms module tests
        self.test('parseDMS', parseDMS(  '0.0°'), '0.0')
        self.test('parseDMS', parseDMS(    '0°'), '0.0')
        self.test('parseDMS', parseDMS('''000°00'00"'''),   '0.0')
        self.test('parseDMS', parseDMS('''000°00'00.0"'''), '0.0')
        self.test('parseDMS', parseDMS('''000° 00'00"'''),    '0.0')
        self.test('parseDMS', parseDMS('''000°00 ' 00.0"'''), '0.0')

        r = rangerrors(True)
        try:
            self.test('parseDMS', parseDMS(181, clip=180), 'ValueError')
        except ValueError as x:
            self.test('parseDMS', str(x), '181.0 beyond 180 degrees')
        rangerrors(False)
        try:
            self.test('parseDMS', parseDMS(-91, clip=90), -90)
        except ValueError as x:
            self.test('parseDMS', str(x), '-90')
        rangerrors(r)

        x = parse3llh('000° 00′ 05.31″W, 51° 28′ 40.12″ N')
        x = ', '.join('%.6f' % a for a in x)  # XXX fStr
        self.test('parse3llh', x, '51.477811, -0.001475, 0.000000')

        for a, x in (((),            '''45°45'45.36"'''),
                     ((F_D,   None),   '45.7626°'),
                     ((F_DM,  None),   "45°45.756'"),
                     ((F_DMS, None), '''45°45'45.36"'''),
                     ((F_DEG, None),   '45.7626'),
                     ((F_MIN, None),   '4545.756'),
                     ((F_SEC, None),   '454545.36'),
                     ((F_RAD, None),   '0.79871'),
                     ((F_D,    6),   '45.7626°'),
                     ((F_DM,  -4),   "45°45.7560'"),
                     ((F_DMS,  2), '''45°45'45.36"'''),
                     ((F_DEG, -6),   '45.762600'),
                     ((F_MIN, -5),   '4545.75600'),
                     ((F_SEC, -3),   '454545.360'),
                     ((F_RAD, -6),   '0.798708')):
            t = 'toDMS(%s)' % (a[:1] or '')
            self.test(t, toDMS(45.76260, *a), x)

        # <https://GitHub.com/chrisveness/geodesy/blob/master/test/dms-tests.js>
        for a, x in (((1,),   'N'),
                     ((0,),   'N'),
                     ((-1,),  'N'),
                     ((359,), 'N'),
                     ((24,),   'NNE'),
                     ((24, 1), 'N'),
                     ((24, 2), 'NE'),
                     ((24, 3), 'NNE'),
                     ((226,),   'SW'),
                     ((226, 1), 'W'),
                     ((226, 2), 'SW'),
                     ((226, 3), 'SW'),
                     ((237,),   'WSW'),
                     ((237, 1), 'W'),
                     ((237, 2), 'SW'),
                     ((237, 3), 'WSW'),
                     # Martin Schultz
                     ((11.25,), 'NNE'),
                     ((11.249,), 'N'),
                     ((-11.25,), 'N'),
                     ((348.749,), 'NNW'),
                     ((45, 1), 'E'),
                     ((44.99, 1), 'N'),
                     ((45, 2), 'NE'),
                     ((44.99, 2), 'NE'),
                     ((45, 3), 'NE'),
                     ((44.99, 3), 'NE'),
                     ((45, 4), 'NE'),
                     ((44.99, 4), 'NE'),  # XXX
                     ((22.5, 1), 'N'),
                     ((22.49, 1), 'N'),
                     ((22.5, 2), 'NE'),
                     ((22.49, 2), 'N'),
                     ((22.5, 3), 'NNE'),
                     ((22.49, 3), 'NNE'),
                     ((22.5, 4), 'NNE'),
                     ((22.49, 4), 'NNE'),  # XXX
                     ((11.25, 1), 'N'),
                     ((11.249, 1), 'N'),
                     ((11.25, 2), 'N'),
                     ((11.249, 2), 'N'),
                     ((11.25, 3), 'NNE'),
                     ((11.249, 3), 'N'),
                     ((11.25, 4), 'NbE'),
                     ((11.249, 4), 'NbE'),  # XXX
                     # examples
                     ((24, 1), 'N'),
                     ((24, 2), 'NE'),
                     ((24, 3), 'NNE'),
                     ((24,),   'NNE'),
                     ((18, 3), 'NNE'),
                     ((11, 4), 'NbE'),
                     ((30, 4), 'NEbN')):
            self.test('compassPoint%s' % (a,), compassPoint(*a), x)

        for a, x in enumerate(('NbE', 'NEbN', 'NEbE', 'EbN',
                               'EbS', 'SEbE', 'SEbS', 'SbE',
                               'SbW', 'SWbS', 'SWbW', 'WbS',
                               'WbN', 'NWbW', 'NWbN', 'NbW')):
            a = 11.25 + a * 22.5
            self.test('compassPoint(%s)' % (a,), compassPoint(a, 4), x)
Exemplo n.º 6
0
    def testEcef(self, Ecef):

        self.test(Ecef.__name__, '...', '...', nl=1)

        Karney = Ecef is EcefKarney

        g = Ecef(Datums.WGS84, name='Test')
        self.test('name', g.name, 'Test')

        t = g.toStr2()
        self.test('toStr', t, g.classname, known=True)

        # <https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1Geocentric.html>
        t = g.forward(27.99, 86.93, 8820)  # Mt Everest
        self.test('forward', fStr(t[3:6], prec=2), '27.99, 86.93, 8820.0')
        self.test('forward', fStr(t[0:3], prec=1),
                  '302271.4, 5635928.4, 2979666.1')
        self.test('name', t.name, 'Test')

        t = g.reverse(302271.4, 5635928.4, 2979666.1)
        self.test('reverse', fStr(t[0:3], prec=1),
                  '302271.4, 5635928.4, 2979666.1')
        self.test('reverse', fStr(t[3:6], prec=2), '27.99, 86.93, 8820.01')
        self.test('case', t.C, 2 if Karney else 1)
        self.test('name', t.name, 'Test')

        # <https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1Geocentric.html>
        t = g.reverse(302e3, 5636e3, 2980e3)
        self.test('reverse', fStr(t[0:3], prec=1),
                  '302000.0, 5636000.0, 2980000.0')
        self.test('reverse', fStr(t[3:6], prec=2),
                  '27.99, 86.93, 9027.03')  # 8820.0
        self.test('case', t.C, 2 if Karney else 1)

        t = g.forward(27.99, 86.93, 8820.0)
        self.test('forward', fStr(t[3:6], prec=2), '27.99, 86.93, 8820.0')
        self.test('forward', fStr(t[0:3], prec=2),
                  '302271.43, 5635928.37, 2979666.13')

        # <https://GeographicLib.SourceForge.io/html/CartConvert.1.html>
        t = g.forward(33.3, 44.4, 6000)
        self.test('forward', fStr(t[3:6], prec=2), '33.3, 44.4, 6000.0')
        self.test('forward', fStr(t[0:3], prec=2),
                  '3816209.6, 3737108.55, 3485109.57')

        t = g.reverse(3816209.6, 3737108.55, 3485109.57)
        self.test('reverse', fStr(t[0:3], prec=2),
                  '3816209.6, 3737108.55, 3485109.57')
        self.test('reverse', fStr(t[3:6], prec=3),
                  '33.3, 44.4, 5999.996')  # 6000.0
        self.test('case', t.C, 2 if Karney else 1)

        # <https://GeographicLib.SourceForge.io/html/CartConvert.1.html>
        t = g.reverse(30000, 30000, 0)
        self.test('reverse', fStr(t[0:3], prec=1), '30000.0, 30000.0, 0.0')
        self.test('reverse',
                  fStr(t[3:6], prec=3),
                  '6.483, 45.0, -6335709.726',
                  known=not Karney)
        self.test('case', t.C, 3 if Karney else 1)

        t = g.forward(6.483, 45.0, -6335709.726)
        self.test('forward', fStr(t[3:6], prec=3), '6.483, 45.0, -6335709.726')
        self.test('forward',
                  fStr(t[0:3], prec=1),
                  '30000.0, 30000.0, -0.0',
                  known=True)

        # Rey-Jer You <https://www.ResearchGate.net/publication/240359424>
        for i, (x, y, z, h) in enumerate(
            ((-2259148.993, 3912960.837, 4488055.516,
              1e3), (-2259502.546, 3913573.210, 4488762.622,
                     2e3), (-2259856.100, 3914185.582, 4489469.729, 3e3),
             (-2260209.653, 3914797.955, 4490176.836,
              4e3), (-2262330.973, 3918472.189, 4494419.477,
                     1e4), (-2265866.507, 3924595.914, 4501490.544, 2e4),
             (-2294150.778, 3973585.709, 4558059.087,
              1e5), (-2541638.152, 4402246.414, 5053033.834,
                     8e5), (-2612348.830, 4524720.901, 5194455.190, 1e6))):
            i = '-%d' % (i + 1, )
            r = '45.0, 120.0, %.1f' % (h, )  # Zero and First order columns
            t = g.reverse(x, y, z)
            self.test('reverse' + i, fStr(t[3:6], prec=3), r)
            t = g.forward(t.lat, t.lon, t.height)
            self.test('forward' + i, fStr(t[0:3], prec=1),
                      fStr((x, y, z), prec=1))

        # <https://www.OrdnanceSurvey.co.UK/documents/resources/guide-coordinate-systems-great-britain.pdf> pp 47
        g = Ecef(Ellipsoids.GRS80, name='OS-UK')
        self.test('name', g.name, 'OS-UK')

        t = g.forward(
            parse3llh('''53°36′43.1653"N, 001°39′51.9920"W, 299.800'''))
        self.test('forward', fStr(t[3:6], prec=8),
                  '53.61199036, -1.66444222, 299.8')
        self.test('forward', fStr(t[0:3], prec=2),
                  '3790644.9, -110149.21, 5111482.97')

        t = g.reverse(3790644.9, -110149.21, 5111482.97)
        self.test('reverse', fStr(t[0:3], prec=2),
                  '3790644.9, -110149.21, 5111482.97')
        self.test('reverse', fStr(t[3:5], prec=8), '53.61199036, -1.66444223')
        self.test('reverse.lat', latDMS(t.lat, prec=4), '53°36′43.1653″N')
        self.test('reverse.lon', lonDMS(t.lon, prec=4), '001°39′51.992″W')
        self.test('reverse.height', fStr(t.height, prec=-3), '299.800')
        self.test('case', t.C, 2 if Karney else 1)
Exemplo n.º 7
0
    def testDms(self):
        # dms module tests
        for i, t in enumerate(
            ('0.0°', '0°', '''000°00'00"''', '''000°00'00.0"''',
             '''000° 00'00"''', '''000°00 ' 00.0"''', '''000° 00' 00.0''')):
            self.test('parseDMS' + str(i + 1), parseDMS(t), '0.0')
        self.test('parseDMS' + str(i + 2), parseDMS('000°-00′-00.0"', sep='-'),
                  '0.0')

        r = rangerrors(True)
        try:
            self.test('parseDMS', parseDMS(181, clip=180), 'ValueError')
        except ValueError as x:
            self.test('parseDMS', str(x), '181.0 beyond 180 degrees')
        rangerrors(False)
        try:
            self.test('parseDMS', parseDMS(-91, clip=90), -90)
        except ValueError as x:
            self.test('parseDMS', str(x), '-90')
        rangerrors(r)

        x = parse3llh('000° 00′ 05.31″W, 51° 28′ 40.12″ N')
        self.test('parse3llh', fStr(x, prec=6), '51.477811, -0.001475, 0.0')

        for a, x in (((), '''45°45'45.36"'''), ((F_D, None), '45.7626°'),
                     ((F_DM, None), "45°45.756'"), ((F_DMS, None),
                                                    '''45°45'45.36"'''),
                     ((F_DEG, None), '45.7626'), ((F_MIN, None), '4545.756'),
                     ((F_SEC, None), '454545.36'), ((F_RAD, None), '0.79871'),
                     ((F_D, 6), '45.7626°'), ((F_DM, -4), "45°45.7560'"),
                     ((F_DMS, 2), '''45°45'45.36"'''),
                     ((F_DEG, -6), '45.762600'), ((F_MIN, -5), '4545.75600'),
                     ((F_SEC, -3), '454545.360'), ((F_RAD, -6), '0.798708')):
            t = 'toDMS(%s)' % (a[:1] or '')
            self.test(t, toDMS(45.76260, *a), x)

        for a, x in (((F_D_, 6), '45.7626°'), ((F_DM_, -4), "45°45.7560'"),
                     ((F_DMS_, 2), '''45°45'45.36"'''),
                     ((F_DEG_, -6), '45.762600'), ((F_MIN_, -5), '4545.75600'),
                     ((F_SEC_, -3), '454545.360'), ((F_RAD_, -6), '0.798708')):
            t = 'toDMS(%s)' % (a[:1] or '')
            self.test(t, toDMS(45.76260, *a), x)
            self.test(t, toDMS(-45.76260, *a), '-' + x)

        for a, x in (((F_D__, 6), '45.7626°'), ((F_DM__, -4), "45°45.7560'"),
                     ((F_DMS__, 2), '''45°45'45.36"'''),
                     ((F_DEG__, -6), '45.762600'), ((F_MIN__, -5),
                                                    '4545.75600'),
                     ((F_SEC__, -3), '454545.360'), ((F_RAD__, -6),
                                                     '0.798708')):
            t = 'toDMS(%s)' % (a[:1] or '')
            self.test(t, toDMS(45.76260, *a), '+' + x)
            self.test(t, toDMS(-45.76260, *a), '-' + x)

        # <https://GitHub.com/chrisveness/geodesy/blob/master/test/dms-tests.js>
        for a, x in (
            ((1, ), 'N'),
            ((0, ), 'N'),
            ((-1, ), 'N'),
            ((359, ), 'N'),
            ((24, ), 'NNE'),
            ((24, 1), 'N'),
            ((24, 2), 'NE'),
            ((24, 3), 'NNE'),
            ((226, ), 'SW'),
            ((226, 1), 'W'),
            ((226, 2), 'SW'),
            ((226, 3), 'SW'),
            ((237, ), 'WSW'),
            ((237, 1), 'W'),
            ((237, 2), 'SW'),
            ((237, 3), 'WSW'),
                # Martin Schultz
            ((11.25, ), 'NNE'),
            ((11.249, ), 'N'),
            ((-11.25, ), 'N'),
            ((348.749, ), 'NNW'),
            ((45, 1), 'E'),
            ((44.99, 1), 'N'),
            ((45, 2), 'NE'),
            ((44.99, 2), 'NE'),
            ((45, 3), 'NE'),
            ((44.99, 3), 'NE'),
            ((45, 4), 'NE'),
            ((44.99, 4), 'NE'),  # XXX
            ((22.5, 1), 'N'),
            ((22.49, 1), 'N'),
            ((22.5, 2), 'NE'),
            ((22.49, 2), 'N'),
            ((22.5, 3), 'NNE'),
            ((22.49, 3), 'NNE'),
            ((22.5, 4), 'NNE'),
            ((22.49, 4), 'NNE'),  # XXX
            ((11.25, 1), 'N'),
            ((11.249, 1), 'N'),
            ((11.25, 2), 'N'),
            ((11.249, 2), 'N'),
            ((11.25, 3), 'NNE'),
            ((11.249, 3), 'N'),
            ((11.25, 4), 'NbE'),
            ((11.249, 4), 'NbE'),  # XXX
                # examples
            ((24, 1), 'N'),
            ((24, 2), 'NE'),
            ((24, 3), 'NNE'),
            ((24, ), 'NNE'),
            ((18, 3), 'NNE'),
            ((11, 4), 'NbE'),
            ((30, 4), 'NEbN')):
            self.test('compassPoint%s' % (a, ), compassPoint(*a), x)

        for a, x in enumerate(
            ('NbE', 'NEbN', 'NEbE', 'EbN', 'EbS', 'SEbE', 'SEbS', 'SbE', 'SbW',
             'SWbS', 'SWbW', 'WbS', 'WbN', 'NWbW', 'NWbN', 'NbW')):
            a = 11.25 + a * 22.5
            self.test('compassPoint(%s)' % (a, ), compassPoint(a, 4), x)

        t = degDMS(1.0101, prec=5, s_D='', pos='+')  # coverage
        self.test('_DEG', t, '+1.0101')
        t = degDMS(0.0101, prec=5, s_S='', pos='+')
        self.test('_MIN', t, "+0.606'")
        t = degDMS(0.0101, prec=5, s_M='', pos='+')
        self.test('_SEC', t, '+36.36"')