Example #1
0
    def test_llh2xyz(self):

        # Test of single point
        x, y, z = llh2xyz(hp2dec(-37.482667598), hp2dec(144.581644114),
                          39.6514)
        self.assertAlmostEqual(x, -4131654.2815, 3)
        self.assertAlmostEqual(y, 2896107.9738, 3)
        self.assertAlmostEqual(z, -3888601.3067, 3)

        # Test DMSAngle input
        x, y, z = llh2xyz(DMSAngle(-37, 48, 26.67598),
                          DMSAngle(144, 58, 16.44114), 39.6514)
        self.assertAlmostEqual(x, -4131654.2815, 3)
        self.assertAlmostEqual(y, 2896107.9738, 3)
        self.assertAlmostEqual(z, -3888601.3067, 3)

        # Test DDMAngle input
        x, y, z = llh2xyz(DDMAngle(-37, 48.4445996), DDMAngle(144, 58.274019),
                          39.6514)
        self.assertAlmostEqual(x, -4131654.2815, 3)
        self.assertAlmostEqual(y, 2896107.9738, 3)
        self.assertAlmostEqual(z, -3888601.3067, 3)

        # Tests comparing results from DynAdjust Adjusted Coordinate File
        # including 109 Points Across Australia
        abs_path = os.path.abspath(os.path.dirname(__file__))

        testdata = read_dnacoord(
            os.path.join(abs_path, 'resources/natadjust_rvs_example.dat'))
        for coord in testdata:
            coord.converthptodd()
            xcomp, ycomp, zcomp = llh2xyz(coord.lat, coord.long, coord.ell_ht)
            assert (abs(coord.x - xcomp) < 2e-4)
            assert (abs(coord.y - ycomp) < 2e-4)
            assert (abs(coord.z - zcomp) < 2e-4)
Example #2
0
 def changeface(self):
     # Change Horizontal Angle
     if 0 <= self.hz_obs.degree < 180:
         hz_switch = self.hz_obs + DMSAngle(180)
     elif 180 <= self.hz_obs.degree < 360:
         hz_switch = self.hz_obs - DMSAngle(180)
     else:
         raise ValueError('Horizontal Angle out of range (0 to 360 degrees)')
     # Change Vertical Angle
     if 0 <= self.va_obs.degree < 360:
         va_switch = DMSAngle(360) - self.va_obs
     else:
         raise ValueError('Vertical Angle out of range (0 to 360 degrees)')
     # Change Face Label
     newface = None
     if self.face == 'FL':
         newface = 'FR'
     elif self.face == 'FR':
         newface = 'FL'
     return Observation(self.from_id,
                        self.to_id,
                        self.inst_height,
                        self.target_height,
                        newface,
                        self.rounds,
                        hz_switch,
                        self.hz_stdev,
                        va_switch,
                        self.va_stdev,
                        self.sd_obs,
                        self.sd_stdev,
                        self.hz_dist,
                        self.vert_dist)
Example #3
0
    def test_vincdir(self):
        # Flinders Peak
        lat1 = hp2dec(-37.57037203)
        lon1 = hp2dec(144.25295244)
        lat1_DMS = DMSAngle(-37, 57, 3.7203)
        lon1_DMS = DMSAngle(144, 25, 29.5244)

        # To Buninyong
        azimuth1to2 = hp2dec(306.520537)
        azimuth1to2_DMS = DMSAngle(306, 52, 5.37)
        ell_dist = 54972.271

        # Test Decimal Degrees Input
        lat2, lon2, azimuth2to1 = vincdir(lat1, lon1, azimuth1to2, ell_dist)
        self.assertEqual(round(dec2hp(lat2), 8), -37.39101561)
        self.assertEqual(round(dec2hp(lon2), 8), 143.55353839)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        # Test DMSAngle Input
        lat2, long2, azimuth2to1 = vincdir(lat1_DMS, lon1_DMS, azimuth1to2_DMS,
                                           ell_dist)
        self.assertEqual(round(dec2hp(lat2), 8), -37.39101561)
        self.assertEqual(round(dec2hp(long2), 8), 143.55353839)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        # Test DDMAngle Input
        lat2, long2, azimuth2to1 = vincdir(lat1_DMS.ddm(), lon1_DMS.ddm(),
                                           azimuth1to2_DMS.ddm(), ell_dist)
        self.assertEqual(round(dec2hp(lat2), 8), -37.39101561)
        self.assertEqual(round(dec2hp(long2), 8), 143.55353839)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)
Example #4
0
 def test_radiations(self):
     test1 = radiations(500, 500,
                        DMSAngle(290, 13).dec(), 44.620,
                        DMSAngle(2, 18, 35).dec(), 1.002515)
     self.assertAlmostEqual(test1[0], 458.681, 3)
     self.assertAlmostEqual(test1[1], 517.137, 3)
     test2 = radiations(500, 500, DMSAngle(290, 13).dec(), 44.620)
     self.assertAlmostEqual(test2[0], 458.129, 3)
     self.assertAlmostEqual(test2[1], 515.419, 3)
     test3 = radiations(564.747, 546.148,
                        DMSAngle(41, 7).dec(), 27.720,
                        DMSAngle(2, 18, 35).dec(), 1.002515)
     self.assertAlmostEqual(test3[0], 583.850, 3)
     self.assertAlmostEqual(test3[1], 566.331, 3)
Example #5
0
    def test_vincdir_utm(self):
        # Flinders Peak (UTM 55)
        zone1 = 55
        east1 = 273741.2966
        north1 = 5796489.7769
        # Grid Dimensions to Point 2 (Buninyong)
        grid_dist = 54992.279
        grid1to2 = hp2dec(305.17017259)
        grid1to2_DMS = DMSAngle(305, 17, 1.7259)

        # Test Decimal Degrees Input
        (zone2, east2, north2, grid2to1,
         lsf) = vincdir_utm(zone1, east1, north1, grid1to2, grid_dist)
        self.assertEqual(zone2, zone1)
        self.assertAlmostEqual(east2, 228854.0513, 3)
        self.assertAlmostEqual(north2, 5828259.0384, 3)
        self.assertAlmostEqual(dec2hp(grid2to1), 125.17418518, 7)
        self.assertAlmostEqual(lsf, 1.00036397, 8)

        # Test DMSAngle Input
        (zone2, east2, north2, grid2to1,
         lsf) = vincdir_utm(zone1, east1, north1, grid1to2_DMS, grid_dist)
        self.assertEqual(zone2, zone1)
        self.assertAlmostEqual(east2, 228854.0513, 3)
        self.assertAlmostEqual(north2, 5828259.0384, 3)
        self.assertAlmostEqual(dec2hp(grid2to1), 125.17418518, 7)
        self.assertAlmostEqual(lsf, 1.00036397, 8)
Example #6
0
    def test_geo2grid(self):
        abs_path = os.path.abspath(os.path.dirname(__file__))

        # Test various coordinates in Australia
        testdata = read_dnacoord(
            os.path.join(abs_path, 'resources/natadjust_rvs_example.dat'))
        for coord in testdata:
            coord.converthptodd()
            hem, zonecomp, eastcomp, northcomp, psf, grid_conv = geo2grid(
                coord.lat, coord.long)
            self.assertEqual(zonecomp, coord.zone)
            self.assertLess(abs(eastcomp - coord.easting), 4e-4)
            self.assertLess((northcomp - coord.northing), 4e-4)

        # Test North and South Hemisphere Output
        north_ex = (DMSAngle(34, 57,
                             00.79653).dec(), DMSAngle(117, 48,
                                                       36.68783).dec())
        south_ex = (DMSAngle(-34, 57,
                             00.79653).dec(), DMSAngle(117, 48,
                                                       36.68783).dec())
        north_grid = geo2grid(north_ex[0], north_ex[1])
        south_grid = geo2grid(south_ex[0], south_ex[1])
        self.assertEqual(north_grid[0], 'North')
        self.assertEqual(south_grid[0], 'South')
        self.assertEqual(north_grid[1], south_grid[1])  # Zone
        self.assertEqual(north_grid[2], south_grid[2])  # Easting
        self.assertEqual(north_grid[3], 10000000 - south_grid[3])  # Northing
        self.assertEqual(north_grid[4], south_grid[4])  # PSF
        self.assertEqual(north_grid[5], -south_grid[5])  # Grid Convergence

        # Test Input Validation
        with self.assertRaises(ValueError):
            geo2grid(0, 45, -1)
        with self.assertRaises(ValueError):
            geo2grid(0, 45, 61)
        with self.assertRaises(ValueError):
            geo2grid(-81, 45, 0)
        with self.assertRaises(ValueError):
            geo2grid(85, 45, 0)
        with self.assertRaises(ValueError):
            geo2grid(0, -181, 0)
        with self.assertRaises(ValueError):
            geo2grid(0, 181, 0)
Example #7
0
 def __init__(self, from_id, to_id, inst_height=0.0, target_height=0.0,
              face='FL', rounds=0.5,
              hz_obs=DMSAngle(0, 0, 0), hz_stdev=DMSAngle(0, 0, 0),
              va_obs=DMSAngle(0, 0, 0), va_stdev=DMSAngle(0, 0, 0),
              sd_obs=0.0, sd_stdev=0.0,
              hz_dist=0.0, vert_dist=0.0):
     self.from_id = from_id
     self.to_id = to_id
     self.inst_height = inst_height
     self.target_height = target_height
     self.face = face
     self.rounds = rounds
     self.hz_obs = hz_obs
     self.hz_stdev = hz_stdev
     self.va_obs = va_obs
     self.va_stdev = va_stdev
     self.sd_obs = sd_obs
     self.sd_stdev = sd_stdev
     self.hz_dist = hz_dist
     self.vert_dist = vert_dist
Example #8
0
 def parse_vert(gsi_line):
     dms = readgsiword16(gsi_line, '22.324') / 100000
     degmin, seconds = divmod(abs(dms) * 1000, 10)
     degrees, minutes = divmod(degmin, 100)
     if 0 < degrees <= 180:
         face = 'FL'
     elif 180 < degrees <= 360:
         face = 'FR'
     else:
         face = 'FL'
     return face, DMSAngle(degrees, minutes, seconds * 10)
Example #9
0
    def test_vincdir_utm(self):
        # Flinders Peak (UTM)
        zone1 = 55
        east1 = 273741.2966
        north1 = 5796489.7769
        # To Buninyong
        azimuth1to2 = hp2dec(306.520537)
        azimuth1to2_DMS = DMSAngle(306, 52, 5.37)

        ell_dist = 54972.271

        # Test Decimal Degrees Input
        (hemisphere2, zone2, east2,
         north2, azimuth2to1) = vincdir_utm(zone1, east1, north1,
                                            azimuth1to2, ell_dist)
        self.assertEqual(hemisphere2, 'South')
        self.assertEqual(zone2, 54)
        self.assertEqual(round(east2, 4), 758173.7968)
        self.assertEqual(round(north2, 4), 5828674.3395)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        # Test DMSAngle Input
        (hemisphere2, zone2, east2,
         north2, azimuth2to1) = vincdir_utm(zone1, east1, north1,
                                            azimuth1to2_DMS, ell_dist)
        self.assertEqual(hemisphere2, 'South')
        self.assertEqual(zone2, 54)
        self.assertEqual(round(east2, 4), 758173.7968)
        self.assertEqual(round(north2, 4), 5828674.3395)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        # Test DDMAngle Input
        (hemisphere2, zone2, east2,
         north2, azimuth2to1) = vincdir_utm(zone1, east1, north1,
                                            azimuth1to2_DMS.ddm(), ell_dist)
        self.assertEqual(hemisphere2, 'South')
        self.assertEqual(zone2, 54)
        self.assertEqual(round(east2, 4), 758173.7968)
        self.assertEqual(round(north2, 4), 5828674.3395)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)
Example #10
0
    def test_geo2grid(self):
        # Single Point Test
        hem, zone, east, north, psf, grid_conv = geo2grid(
            hp2dec(-37.482667598), hp2dec(144.581644114))
        self.assertEqual(hem, 'South')
        self.assertEqual(zone, 55)
        self.assertAlmostEqual(east, 321405.5592, 3)
        self.assertAlmostEqual(north, 5813614.1613, 3)
        self.assertAlmostEqual(psf, 0.99999287, 8)
        self.assertAlmostEqual(grid_conv, -1.2439811331, 9)

        # Test DMSAngle Input
        (hem, zone, east, north, psf,
         grid_conv) = geo2grid(DMSAngle(-37, 48, 26.67598),
                               DMSAngle(144, 58, 16.44114))
        self.assertEqual(hem, 'South')
        self.assertEqual(zone, 55)
        self.assertAlmostEqual(east, 321405.5592, 3)
        self.assertAlmostEqual(north, 5813614.1613, 3)
        self.assertAlmostEqual(psf, 0.99999287, 8)
        self.assertAlmostEqual(grid_conv, -1.2439811331, 9)

        # Test DDMAngle Input
        (hem, zone, east, north, psf,
         grid_conv) = geo2grid(DDMAngle(-37, 48.4445997),
                               DDMAngle(144, 58.274019))
        self.assertEqual(hem, 'South')
        self.assertEqual(zone, 55)
        self.assertAlmostEqual(east, 321405.5592, 3)
        self.assertAlmostEqual(north, 5813614.1613, 3)
        self.assertAlmostEqual(psf, 0.99999287, 8)
        self.assertAlmostEqual(grid_conv, -1.2439811331, 9)

        abs_path = os.path.abspath(os.path.dirname(__file__))

        # Test various coordinates in Australia
        testdata = read_dnacoord(
            os.path.join(abs_path, 'resources/natadjust_rvs_example.dat'))
        for coord in testdata:
            coord.converthptodd()
            hem, zonecomp, eastcomp, northcomp, psf, grid_conv = geo2grid(
                coord.lat, coord.long)
            self.assertEqual(zonecomp, coord.zone)
            self.assertLess(abs(eastcomp - coord.easting), 4e-4)
            self.assertLess((northcomp - coord.northing), 4e-4)

        # Test North and South Hemisphere Output
        north_ex = (DMSAngle(34, 57,
                             00.79653).dec(), DMSAngle(117, 48,
                                                       36.68783).dec())
        south_ex = (DMSAngle(-34, 57,
                             00.79653).dec(), DMSAngle(117, 48,
                                                       36.68783).dec())
        north_grid = geo2grid(north_ex[0], north_ex[1])
        south_grid = geo2grid(south_ex[0], south_ex[1])
        self.assertEqual(north_grid[0], 'North')
        self.assertEqual(south_grid[0], 'South')
        self.assertEqual(north_grid[1], south_grid[1])  # Zone
        self.assertEqual(north_grid[2], south_grid[2])  # Easting
        self.assertEqual(north_grid[3], 10000000 - south_grid[3])  # Northing
        self.assertEqual(north_grid[4], south_grid[4])  # PSF
        self.assertEqual(north_grid[5], -south_grid[5])  # Grid Convergence

        # Test Input Validation
        with self.assertRaises(ValueError):
            geo2grid(0, 45, -1)
        with self.assertRaises(ValueError):
            geo2grid(0, 45, 61)
        with self.assertRaises(ValueError):
            geo2grid(-81, 45, 0)
        with self.assertRaises(ValueError):
            geo2grid(85, 45, 0)
        with self.assertRaises(ValueError):
            geo2grid(0, -181, 0)
        with self.assertRaises(ValueError):
            geo2grid(0, 181, 0)
Example #11
0
 def parse_hz(gsi_line):
     dms = readgsiword16(gsi_line, '21.324') / 100000
     degmin, second = divmod(abs(dms) * 1000, 10)
     degree, minute = divmod(degmin, 100)
     return DMSAngle(degree, minute, second * 10)
Example #12
0
    def test_DMSAngle(self):
        # Test DMSAngle Methods
        self.assertEqual(dec_ex, dms_ex.dec())
        self.assertEqual(hp_ex, dms_ex.hp())
        self.assertEqual(hp_ex3, dms_ex3.hp())
        self.assertEqual(ddm_ex, dms_ex.ddm())
        self.assertEqual(-ddm_ex, -dms_ex.ddm())
        self.assertEqual(ddm_ex3, dms_ex3.ddm())

        # Test DMSAngle Sign Conventions
        self.assertEqual(
            -dec_ex,
            DMSAngle(-dms_ex.degree, dms_ex.minute, dms_ex.second).dec())
        self.assertEqual(
            dec_ex,
            DMSAngle(dms_ex.degree, -dms_ex.minute, -dms_ex.second).dec())
        self.assertAlmostEqual(
            -dec_ex4,
            DMSAngle(0, -dms_ex4.minute, dms_ex4.second).dec(), 9)
        self.assertAlmostEqual(
            dec_ex4,
            DMSAngle(0, dms_ex4.minute, dms_ex4.second).dec(), 9)
        self.assertEqual(-dec_ex5, DMSAngle(0, 0, -dms_ex5.second).dec())
        self.assertEqual(dec_ex5, DMSAngle(0, 0, dms_ex5.second).dec())
        self.assertEqual(-dms_ex3, DMSAngle(12, 34, -30))
        self.assertEqual(dms_ex.sign, 1)
        self.assertEqual(-dms_ex.sign, -1)
        self.assertEqual(dms_ex4.sign, 1)
        self.assertEqual(-dms_ex4.sign, -1)
        self.assertEqual(dms_ex5.sign, 1)
        self.assertEqual(-dms_ex5.sign, -1)
        self.assertEqual(DMSAngle(-1, 2, 3).sign, -1)
        self.assertEqual(DMSAngle(1, -2, 3).sign, 1)
        self.assertEqual(DMSAngle(1, 2, -3).sign, 1)
        self.assertEqual(DMSAngle(0, -1, 2).sign, -1)
        self.assertEqual(DMSAngle(0, 0, -3).sign, -1)
        self.assertEqual(DMSAngle(-0, 1, 2).sign, 1)
        self.assertEqual(DMSAngle(-0.0, 1, 2).sign, -1)
        self.assertEqual(repr(dms_ex), '{DMSAngle: +123d 44m 55.5s}')
        self.assertEqual(repr(dms_ex3), '{DMSAngle: -12d 34m 30s}')

        # Test DMSAngle Overloads
        self.assertEqual(dec_ex + dec_ex2, (dms_ex + dms_ex2).dec())
        self.assertEqual(dec_ex2 + dec_ex, (dms_ex2 + dms_ex).dec())
        self.assertEqual(dec_ex - dec_ex2, (dms_ex - dms_ex2).dec())
        self.assertEqual(dec_ex2 - dec_ex, (dms_ex2 - dms_ex).dec())
        self.assertEqual(dec_ex * 5, (dms_ex * 5).dec())
        self.assertEqual(5 * dec_ex, (5 * dms_ex).dec())
        self.assertEqual(dec_ex / 3, (dms_ex / 3).dec())
        self.assertEqual(abs(-dms_ex), dms_ex)
        self.assertEqual(-dms_ex2, dms_ex3)
        self.assertEqual(dms_ex2, abs(dms_ex3))
        self.assertEqual(dms_ex, ddm_ex)
        self.assertTrue(dms_ex == dms_ex)
        self.assertFalse(dms_ex == dms_ex2)
        self.assertTrue(dms_ex != dms_ex2)
        self.assertFalse(dms_ex != dms_ex)
        self.assertTrue(dms_ex > dms_ex2)
        self.assertFalse(dms_ex2 > dms_ex)
        self.assertTrue(dms_ex2 < dms_ex)
        self.assertFalse(dms_ex < dms_ex2)
        with self.assertRaises(TypeError):
            dms_ex * 'a'
        with self.assertRaises(TypeError):
            'a' * dms_ex
        with self.assertRaises(TypeError):
            dms_ex / 'a'
        with self.assertRaises(TypeError):
            dms_ex + 'a'
        with self.assertRaises(TypeError):
            'a' + dms_ex
        with self.assertRaises(TypeError):
            dms_ex - 'a'
        with self.assertRaises(TypeError):
            'a' - dms_ex

        # Test Class Interoperability
        self.assertEqual(DMSAngle(1, 2, 3) + DDMAngle(2, 3), DMSAngle(3, 5, 3))
        self.assertEqual(
            DMSAngle(3, 2, 0) - DDMAngle(2, 2.5), DMSAngle(0, 59, 30))
        self.assertEqual(DDMAngle(2, 3) + DMSAngle(1, 2, 3), DDMAngle(3, 5.05))
        self.assertEqual(
            DDMAngle(3, 2) - DMSAngle(2, 2, 30), DDMAngle(0, 59.5))
Example #13
0
def gsi2class(gsi_list):
    """
    Takes a list where first entry is station record and
    all remaining records are observations and creates
    a InstSetup Object with Observation Objects included.
    :param gsi_list:
    :return:
    """
    def readgsiword16(linestring, word_id):
        try:
            wordstart = str.find(linestring, word_id)
            if wordstart == -1:
                raise ValueError
        except ValueError:
            print('ValueError: GSI record type ' + word_id + ' not found\n'
                  'Line Data: ' + linestring)
            return None
        word_val = linestring[(wordstart + 7):(wordstart + 23)]
        word_val = word_val.lstrip('0')
        if word_val == '':
            return 0
        else:
            return int(word_val)

    def parse_ptid(gsi_line):
        ptid = gsi_line[8:24]
        ptid = ptid.lstrip('0')
        return ptid

    def parse_easting(gsi_line):
        return (readgsiword16(gsi_line, '84..')) / 10000

    def parse_northing(gsi_line):
        return (readgsiword16(gsi_line, '85..')) / 10000

    def parse_elev(gsi_line):
        return (readgsiword16(gsi_line, '86..')) / 10000

    def parse_hz(gsi_line):
        dms = readgsiword16(gsi_line, '21.324') / 100000
        degmin, second = divmod(abs(dms) * 1000, 10)
        degree, minute = divmod(degmin, 100)
        return DMSAngle(degree, minute, second * 10)

    def parse_slope(gsi_line):
        return (readgsiword16(gsi_line, '31..')) / 10000

    def parse_dist(gsi_line):
        return (readgsiword16(gsi_line, '32..')) / 10000

    def parse_tgtht(gsi_line):
        return (readgsiword16(gsi_line, '87..')) / 10000

    def parse_instht(gsi_line):
        return (readgsiword16(gsi_line, '88..')) / 10000

    def parse_vert(gsi_line):
        dms = readgsiword16(gsi_line, '22.324') / 100000
        degmin, seconds = divmod(abs(dms) * 1000, 10)
        degrees, minutes = divmod(degmin, 100)
        if 0 < degrees <= 180:
            face = 'FL'
        elif 180 < degrees <= 360:
            face = 'FR'
        else:
            face = 'FL'
        return face, DMSAngle(degrees, minutes, seconds * 10)

    gsi_project = []
    for record in gsi_list:
        from_stn = parse_ptid(record[0])
        obs_list = []
        for line in record:
            if '31..' in line:
                to_stn = parse_ptid(line)
                hz = parse_hz(line)
                hz_stdev = DMSAngle(0)
                face, vert = parse_vert(line)
                va_stdev = DMSAngle(0)
                rounds = 0.5
                slope = parse_slope(line)
                sd_stdev = 0.0
                tgtht = parse_tgtht(line)
                instht = parse_instht(line)
                obs = Observation(from_stn, to_stn, instht, tgtht, face,
                                  rounds, hz, hz_stdev, vert, va_stdev, slope,
                                  sd_stdev)
                obs_list.append(obs)
        if '84..' in record[0]:
            pt_id = parse_ptid(record[0])
            easting = parse_easting(record[0])
            northing = parse_northing(record[0])
            elev = parse_elev(record[0])
            coord = Coordinate(pt_id, 'utm', 'gda94', 'gda94', '2018.1',
                               easting, northing, elev)
            setup = InstSetup(pt_id, coord)
            for i in range(0, len(obs_list)):
                setup.addobs(obs_list[i])
        gsi_project.append(setup)
    return gsi_project
Example #14
0
import unittest
from geodepy.convert import dec2hp, hp2dec, DMSAngle, DDMAngle, dec2dms, dec2ddm, hp2dms, hp2ddm, dd2dms

dec_ex = 123.74875
dec_ex2 = 12.575
dec_ex3 = -12.575
dec_ex4 = 0.0525
dec_ex5 = 0.005

hp_ex = 123.44555
hp_ex2 = 12.3430
hp_ex3 = -12.3430
hp_ex4 = 0.0309
hp_ex5 = 0.0018

dms_ex = DMSAngle(123, 44, 55.5)
dms_ex2 = DMSAngle(12, 34, 30)
dms_ex3 = DMSAngle(-12, -34, -30)
dms_ex4 = DMSAngle(0, 3, 9)
dms_ex5 = DMSAngle(0, 0, 18)

ddm_ex = DDMAngle(123, 44.925)
ddm_ex2 = DDMAngle(12, 34.5)
ddm_ex3 = DDMAngle(-12, -34.5)
ddm_ex4 = DDMAngle(0, 3.15)
ddm_ex5 = DDMAngle(0, 0.3)


class TestConvert(unittest.TestCase):
    def test_dec2hp(self):
        self.assertAlmostEqual(hp_ex, dec2hp(dec_ex), 13)
Example #15
0
def meanfaces(ob1, ob2):
    """
    Take two Observations and return their mean Face Left Sense Observation
    If one Observation and one None, return Face Left Sense Observation
    :param ob1: Observation Object (or None)
    :param ob2: Observation Object (or None)
    :return: Meaned Observation Object of ob1 and ob2 (Face Left Sense)
    """
    if isinstance(ob1, Observation) and isinstance(ob1, type(None)):
        raise TypeError('Invalid Input Type (ob1)')
    elif isinstance(ob2, Observation) and isinstance(ob2, type(None)):
        raise TypeError('Invalid Input Type (ob2)')
    elif isinstance(ob1, type(None)) and isinstance(ob2, type(None)):
        raise TypeError('Ob1 and Ob2 cannot both be None')
    elif isinstance(ob1, type(None)) and isinstance(ob2, Observation):
        if ob2.face == 'FL':
            return ob2
        else:
            return ob2.changeface()
    elif isinstance(ob1, Observation) and isinstance(ob2, type(None)):
        if ob1.face == 'FL':
            return ob1
        else:
            return ob1.changeface()
    elif (ob1.from_id != ob2.from_id
            or ob1.to_id != ob2.to_id
            or ob1.inst_height != ob2.inst_height
            or ob1.target_height != ob2.target_height):
        raise ValueError('Inputs must be Observation Objects. '
                         'From, To, Instrument and Target Height must be the same to mean two observations\n' +
                         'Observation 1\n' +
                         'from: ' + ob1.from_id + ' to: ' + ob1.to_id + ' inst_ht: ' + str(ob1.inst_height)
                         + ' tgt_ht: ' + str(ob1.target_height) + '\n' +
                         'Observation 2\n' +
                         'from: ' + ob2.from_id + ' to: ' + ob2.to_id + ' inst_ht: ' + str(ob2.inst_height)
                         + ' tgt_ht: ' + str(ob2.target_height) + '\n')
    else:
        # Check Face Inputs, convert all to Face Left Sense
        if ob1.face == 'FL' and ob2.face == 'FR':
            ob2 = ob2.changeface()
        elif ob1.face == 'FR' and ob2.face == 'FL':
            ob1 = ob1.changeface()
        elif ob1.face == 'FR' and ob2.face == 'FR':
            ob1 = ob1.changeface()
            ob2 = ob2.changeface()
        elif ob1.face == 'FL' and ob2.face == 'FL':
            pass
        else:
            raise ValueError('Incompatible Face Values')
        # Calculate means, return new observation
        if abs(ob1.hz_obs.dec() - ob2.hz_obs.dec()) < 180:
            meaned_hz = (ob1.hz_obs + ob2.hz_obs) / 2
        elif ob1.hz_obs < ob2.hz_obs:
            ob2_shift = -(DMSAngle(360) - ob2.hz_obs)
            meaned_hz = (ob1.hz_obs + ob2_shift) / 2
            if meaned_hz < DMSAngle(0):
                meaned_hz = meaned_hz + DMSAngle(360)
        elif ob2.hz_obs < ob1.hz_obs:
            ob1_shift = -(DMSAngle(360) - ob1.hz_obs)
            meaned_hz = (ob1_shift + ob2.hz_obs) / 2
            if meaned_hz < DMSAngle(0):
                meaned_hz = meaned_hz + DMSAngle(360)
        meaned_va = (ob1.va_obs + ob2.va_obs) / 2
        meaned_sd = round(((ob1.sd_obs + ob2.sd_obs) / 2), 4)
        return Observation(ob1.from_id,
                           ob1.to_id,
                           ob1.inst_height,
                           ob1.target_height,
                           ob1.face,
                           ob1.rounds + ob2.rounds,
                           meaned_hz,
                           ob1.hz_stdev,
                           meaned_va,
                           ob1.va_stdev,
                           meaned_sd,
                           ob1.sd_stdev)
Example #16
0
 def parse_angle(obs_string):
     dms = float(obs_string)
     degmin, second = divmod(abs(dms) * 1000, 10)
     degree, minute = divmod(degmin, 100)
     return DMSAngle(degree, minute, second * 10)
Example #17
0
    def test_vincinv(self):
        # Flinders Peak
        lat1 = hp2dec(-37.57037203)
        lon1 = hp2dec(144.25295244)
        lat1_DMS = DMSAngle(-37, 57, 3.7203)
        lon1_DMS = DMSAngle(144, 25, 29.5244)

        # Buninyong
        lat2 = hp2dec(-37.39101561)
        lon2 = hp2dec(143.55353839)
        lat2_DMS = DMSAngle(-37, 39, 10.1561)
        lon2_DMS = DMSAngle(143, 55, 35.3839)

        # Test Decimal Degrees Input
        ell_dist, azimuth1to2, azimuth2to1 = vincinv(lat1, lon1, lat2, lon2)
        self.assertEqual(round(ell_dist, 3), 54972.271)
        self.assertEqual(round(dec2hp(azimuth1to2), 6), 306.520537)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        # additional test case:
        pl1 = (-29.85, 140.71666666666667)
        pl2 = (-29.85, 140.76666666666667)
        ell_dist, azimuth1to2, azimuth2to1 = vincinv(pl1[0], pl1[1], pl2[0],
                                                     pl2[1])
        self.assertEqual(round(ell_dist, 3), 4831.553)
        self.assertEqual(round(dec2hp(azimuth1to2), 6), 90.004480)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 269.591520)

        test2 = vincinv(lat1, lon1, lat1, lon1)
        self.assertEqual(test2, (0, 0, 0))

        # Test DMSAngle Input
        ell_dist, azimuth1to2, azimuth2to1 = vincinv(lat1_DMS, lon1_DMS,
                                                     lat2_DMS, lon2_DMS)
        self.assertEqual(round(ell_dist, 3), 54972.271)
        self.assertEqual(round(dec2hp(azimuth1to2), 6), 306.520537)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        test2 = vincinv(lat1_DMS, lon1_DMS, lat1_DMS, lon1_DMS)
        self.assertEqual(test2, (0, 0, 0))

        # Test DDMAngle Input
        (ell_dist, azimuth1to2, azimuth2to1) = vincinv(lat1_DMS.ddm(),
                                                       lon1_DMS.ddm(),
                                                       lat2_DMS.ddm(),
                                                       lon2_DMS.ddm())
        self.assertEqual(round(ell_dist, 3), 54972.271)
        self.assertEqual(round(dec2hp(azimuth1to2), 6), 306.520537)
        self.assertEqual(round(dec2hp(azimuth2to1), 6), 127.102507)

        test2 = vincinv(lat1_DMS.ddm(), lon1_DMS.ddm(), lat1_DMS.ddm(),
                        lon1_DMS.ddm())
        self.assertEqual(test2, (0, 0, 0))
Example #18
0
import unittest
from geodepy.convert import dec2hp, hp2dec, DMSAngle, DDMAngle, dec2dms, dec2ddm, hp2dms, hp2ddm, dd2dms

dec_ex = 123.74875
dec_ex2 = 12.575
hp_ex = 123.44555
hp_ex2 = 12.3430

dms_ex = DMSAngle(123, 44, 55.5)
dms_ex2 = DMSAngle(12, 34, 30)
dms_ex3 = DMSAngle(-12, -34, -30)

ddm_ex = DDMAngle(123, 44.925)
ddm_ex2 = DDMAngle(12, 34.5)
ddm_ex3 = DDMAngle(-12, -34.5)


class TestConvert(unittest.TestCase):
    def test_dec2hp(self):
        self.assertAlmostEqual(hp_ex, dec2hp(dec_ex), 13)
        self.assertAlmostEqual(-hp_ex, dec2hp(-dec_ex), 13)

    def test_hp2dec(self):
        self.assertAlmostEqual(dec_ex, hp2dec(hp_ex), 13)
        self.assertAlmostEqual(-dec_ex, hp2dec(-hp_ex), 13)
        self.assertAlmostEqual(
            hp2dec(hp_ex) + hp2dec(hp_ex2), dec_ex + dec_ex2, 13)

    def test_DMSAngle(self):
        # Test DMSAngle Methods
        self.assertEqual(dec_ex, dms_ex.dec())
Example #19
0
    def test_DMSAngle(self):
        # Test DMSAngle Methods
        self.assertEqual(dec_ex, dms_ex.dec())
        self.assertEqual(hp_ex, dms_ex.hp())
        self.assertEqual(hp_ex3, dms_ex3.hp())
        self.assertEqual(ddm_ex, dms_ex.ddm())

        # Test DMSAngle Sign Conventions
        self.assertEqual(
            -dec_ex,
            DMSAngle(-dms_ex.degree, dms_ex.minute, dms_ex.second).dec())
        self.assertEqual(
            dec_ex,
            DMSAngle(dms_ex.degree, -dms_ex.minute, -dms_ex.second).dec())
        self.assertAlmostEqual(
            -dec_ex4,
            DMSAngle(0, -dms_ex4.minute, dms_ex4.second).dec(), 9)
        self.assertAlmostEqual(
            dec_ex4,
            DMSAngle(0, dms_ex4.minute, dms_ex4.second).dec(), 9)
        self.assertEqual(-dec_ex5, DMSAngle(0, 0, -dms_ex5.second).dec())
        self.assertEqual(dec_ex5, DMSAngle(0, 0, dms_ex5.second).dec())
        self.assertEqual(dms_ex.sign, 1)
        self.assertEqual(-dms_ex.sign, -1)
        self.assertEqual(dms_ex4.sign, 1)
        self.assertEqual(-dms_ex4.sign, -1)
        self.assertEqual(dms_ex5.sign, 1)
        self.assertEqual(-dms_ex5.sign, -1)
        self.assertEqual(DMSAngle(-1, 2, 3).sign, -1)
        self.assertEqual(DMSAngle(1, -2, 3).sign, 1)
        self.assertEqual(DMSAngle(1, 2, -3).sign, 1)
        self.assertEqual(DMSAngle(0, -1, 2).sign, -1)
        self.assertEqual(DMSAngle(0, 0, -3).sign, -1)
        self.assertEqual(DMSAngle(-0, 1, 2).sign, 1)
        self.assertEqual(DMSAngle(-0.0, 1, 2).sign, -1)

        # Test DMSAngle Overloads
        self.assertEqual(dec_ex + dec_ex2, (dms_ex + dms_ex2).dec())
        self.assertEqual(dec_ex - dec_ex2, (dms_ex - dms_ex2).dec())
        self.assertEqual(dec_ex * 5, (dms_ex * 5).dec())
        self.assertEqual(5 * dec_ex, (5 * dms_ex).dec())
        self.assertEqual(dec_ex / 3, (dms_ex / 3).dec())
        self.assertEqual(abs(-dms_ex), dms_ex)
        self.assertEqual(-dms_ex2, dms_ex3)
        self.assertEqual(dms_ex2, abs(dms_ex3))
        self.assertEqual(dms_ex, ddm_ex)
        self.assertTrue(dms_ex == dms_ex)
        self.assertFalse(dms_ex == dms_ex2)
        self.assertTrue(dms_ex != dms_ex2)
        self.assertFalse(dms_ex != dms_ex)
        self.assertTrue(dms_ex > dms_ex2)
        self.assertFalse(dms_ex2 > dms_ex)
        self.assertTrue(dms_ex2 < dms_ex)
        self.assertFalse(dms_ex < dms_ex2)
        with self.assertRaises(TypeError):
            dms_ex * 'a'
        with self.assertRaises(TypeError):
            'a' * dms_ex
        with self.assertRaises(TypeError):
            dms_ex / 'a'
Example #20
0
def fbk2class(fbk_list):
    def parse_angle(obs_string):
        dms = float(obs_string)
        degmin, second = divmod(abs(dms) * 1000, 10)
        degree, minute = divmod(degmin, 100)
        return DMSAngle(degree, minute, second * 10)

    fbk_project = []
    for setup_list in fbk_list:
        obs_list = []
        if setup_list[0][0] == 'STN' and len(setup_list[0]) <= 3:
            # This is the station information part
            from_id = setup_list[0][1]
            inst_height = float(setup_list[0][2])
            coord = Coordinate(from_id, 'utm', 'gda94', 'gda94', '2018.1', 0,
                               0, 0)
            setup = InstSetup(from_id, coord)
        elif setup_list[0][0] == 'STN' and len(setup_list[0]) > 3:
            from_id = setup_list[0][1]
            inst_height = float(setup_list[0][2])
            east = float(setup_list[0][3])
            north = float(setup_list[0][4])
            elev = float(setup_list[0][5])
            coord = Coordinate(from_id, 'utm', 'gda94', 'gda94', '2018.1',
                               east, north, elev)
            setup = InstSetup(from_id, coord)
        for record in setup_list:
            if record[0] == 'F1' or record[0] == 'F2':
                """
                This is the obs information part
                from_id, to_id, inst_height, target_height
                face
                hz_obs
                va_obs
                sd_obs
                hz_dist
                vert_dist
                """
                # Read Face
                if int(float(record[5])) in range(0, 180):
                    face = 'FL'
                elif int(float(record[5])) in range(180, 360):
                    face = 'FR'
                else:
                    ValueError('Invalid Vertical Angle in ' + record)
                to_id = record[2]  # Read To ID
                rounds = 0.5
                hz_obs = parse_angle(record[3])  # 3 is Hz Ob (HP)
                hz_stdev = DMSAngle(0)
                sd_obs = float(record[4])
                sd_stdev = 0.0
                va_obs = parse_angle(record[5])  # 5 is Vert Ob (HP)
                va_stdev = DMSAngle(0)
                target_height = float(record[7])
                obs = Observation(from_id, to_id, inst_height, target_height,
                                  face, rounds, hz_obs, hz_stdev, va_obs,
                                  va_stdev, sd_obs, sd_stdev)
                obs_list.append(obs)
            # else:
            #     raise ValueError('Unexpected format found')
        for i in obs_list:
            setup.addobs(i)
        fbk_project.append(setup)
    return fbk_project