예제 #1
0
    def coordinatesToString(cls, coords):
        try:
            E = int(coords.E)
            N = int(coords.N)
            e100k = E // 100000
            n100k = N // 100000

            if e100k < 0 or e100k > 6 or n100k < 0 or n100k > 12:
                log.error("e100k = {}, n100k = {} - OOR", e100k, n100k)
                raise OSGridError('Position out of range')

            nf = 19 - n100k
            ef = 10 + e100k

            l1 = nf - (nf % 5) + (ef // 5)
            l2 = (5 * nf) % 25 + (ef % 5)
            l = [l1, l2]
            log.debug("l = {}", l)
            rect = ''.join([GridReference.alphabet[int(x)] for x in l])
            log.debug("l = {}, rect = {}", l, rect)

            e = E % 100000
            n = N % 100000
            log.debug('e = {}, n = {}', e, n)

            return ' '.join([rect, str(e).rjust(5, '0'), str(n).rjust(5, '0')])
        except:
            traceback.print_exc()
            log.debug('{}', traceback.format_exc())
            return ''
예제 #2
0
    def stringToEN(cls, arg):
        if not isinstance(arg, str):
            raise OSGridError('Grid reference must be a string')

        log.debug('Parsing {}', arg)
        gridref = arg.strip().upper()

        log.debug('gridref is {}', gridref)
        match = re.match('^(\d+),\s*(\d+)$', gridref)
        if match:
            log.debug('Matched pair of numbers')
            return [int(x) for x in match.groups()]

        match = re.match('^([A-Z]{2})\s*([0-9]+)(\s*)([0-9]+)$', gridref)
        if not match:
            log.error("Couldn't match expected format")
            raise OSGridError('Invalid grid reference')

        g = match.groups()
        alpha = g[0]
        l1 = ord(alpha[0]) - ord('A')
        l2 = ord(alpha[1]) - ord('A')

        if l1 > 7: l1 -= 1
        if l2 > 7: l2 -= 1

        e100km = ((l1 - 2) % 5) * 5 + (l2 % 5)
        n100km = 19 - 5 * (l1 // 5) - l2 // 5
        log.debug("e100k = {}, n100k = {}", e100km, n100km)
        if e100km < 0 or e100km > 6 or n100km < 0 or n100km > 12:
            log.error("e100k = {}, n100k = {} - OOR", e100km, n100km)
            raise OSGridError('Invalid grid reference')

        if len(g[2]) == 0:
            s = g[1] + g[3]
            c = len(s) // 2
            en = [s[:c], s[c:]]
        else:
            en = [g[1], g[3]]

        if len(en[0]) != len(en[1]):
            log.error('e=*{}* n=*{}* - unequal lengths', *en)
            raise OSGridError('Invalid grid reference')

        en = [int((x + '00000')[:5]) for x in en]
        log.debug('EN is {}', en)
        factor = pow(10, 5)
        return [en[0] + e100km * factor, en[1] + n100km * factor]
예제 #3
0
 def __init__(self,arg):
     if isinstance(arg,LatitudeLongitude):
         if arg.tag!='OSGB36' : 
             log.debug("Transforming {} to OSGB36",arg)
             arg=arg.transform('OSGB36')
             log.debug("Transformed value is {}",arg)
         phi=radians(arg.latitude)
         l  =radians(arg.longitude)
     
         log.debug("phi = {}, l = {}",phi,l)
         v=OSDefaultGrid(phi,l)
         parsed = v.latLongToGrid()
     elif isinstance(arg,list) and areNumbers(arg):
         parsed=arg[:2]
     elif isinstance(arg,str):
         parsed=GridReference.stringToEN(arg)
     else:
         raise OSGridError('Arguments to OSGridRef constructor must be string, LatLong or E,N') 
     
     log.debug('out is {}',parsed)
     self.E, self.N = [floor(x) for x in parsed] # [round(x,0) for x in parsed]
     log.debug("E = {}, N = {}",self.E,self.N)
예제 #4
0
    def toLatLong(self, tag='WGS84', viaString=False):
        if viaString:
            g = OSGridReference(str(self))
            return g.toLatLong(tag=tag, viaString=False)

        phi = OSDefaultGrid.phi0
        M = 0

        log.debug('Starting loop with phi = {}', phi)
        dN = self.N - OSDefaultGrid.N0
        while True:
            phi += (dN - M) / (OSDefaultGrid.aF0())
            M = OSDefaultGrid.meridional(phi)
            if dN - M < 1.0e-5: break

        log.debug('Ending loop with phi = {}', phi)

        v = OSDefaultGrid(phi, self.E)
        phi, l = v.gridToLatLong()

        point = LatLong(degrees(phi), degrees(l), tag='OSGB36')
        if (tag != 'OSGB36'):
            point = point.transform(tag)
        return point
예제 #5
0
    def __init__(self, *args):
        if len(args) == 0:
            raise OSGridError(
                'Initialisation of OSGRidReference requires at least one argument'
            )
        arg = args[0]

        if isinstance(arg, str):
            log.debug('Parsing {}', arg)
            gridref = arg.strip().upper()

            log.debug('gridref is {}', gridref)
            match = re.match('^(\d+),\s*(\d+)$', gridref)
            if match:
                log.debug('Matched pair of numbers')
                return [int(x) for x in match.groups()]

            match = re.match('^([A-Z]{2})\s*([0-9]+)(\s*)([0-9]+)$', gridref)
            if not match:
                log.error("Couldn't match expected format")
                raise OSGridError('Invalid grid reference')

            g = match.groups()
            alpha = g[0]
            l1 = ord(alpha[0]) - ord('A')
            l2 = ord(alpha[1]) - ord('A')

            if l1 > 7: l1 -= 1
            if l2 > 7: l2 -= 1

            e100km = ((l1 - 2) % 5) * 5 + (l2 % 5)
            n100km = 19 - 5 * (l1 // 5) - l2 // 5
            log.debug("e100k = {}, n100k = {}", e100km, n100km)
            if e100km < 0 or e100km > 6 or n100km < 0 or n100km > 12:
                log.error("e100k = {}, n100k = {} - OOR", e100km, n100km)
                raise OSGridError('Invalid grid reference')

            if len(g[2]) == 0:
                s = g[1] + g[3]
                c = len(s) // 2
                en = [s[:c], s[c:]]
            else:
                en = [g[1], g[3]]

            if len(en[0]) != len(en[1]):
                log.error('e=*{}* n=*{}* - unequal lengths', *en)
                raise OSGridError('Invalid grid reference')

            en = [int((x + '00000')[:5]) for x in en]
            log.debug('EN is {}', en)
            factor = pow(10, 5)
            parsed = [en[0] + e100km * factor, en[1] + n100km * factor]

        elif isinstance(arg, LatLong):
            if arg.tag != 'OSGB36':
                log.debug("Transforming {} to OSGB36", arg)
                arg = arg.transform('OSGB36')
                log.debug("Transformed value is {}", arg)
            phi = radians(arg.latitude)
            l = radians(arg.longitude)

            log.debug("phi = {}, l = {}", phi, l)
            v = OSDefaultGrid(phi, l)
            parsed = v.latLongToGrid()

        elif len(args) >= 2 and areNumbers(args[:2]):
            parsed = args[:2]
        else:
            raise OSGridError(
                'Arguments to OSGridRef constructor must be string or LatLong or E,N'
            )

        log.debug('out is {}', parsed)
        self.E, self.N = [floor(x)
                          for x in parsed]  # [round(x,0) for x in parsed]
        log.debug("E = {}, N = {}", self.E, self.N)