Exemplo n.º 1
0
    def __init__(
            self,
            data=[],
            src_region=None,
            xinc=None,
            yinc=None,
            name='waffles_sm',
            src_srs='epsg:4326',
            dst_srs=None,
            extend=0,
            node='pixel',
            ogr_format='ESRI Shapefile',
            recursive=False,
            verbose=False
    ):
        """generate spatial-metadata"""
        
        self.data = data
        self.xinc = utils.float_or(xinc)
        self.yinc = utils.float_or(yinc)
        self.src_srs = utils.str_or(src_srs, 'epsg:4326')
        self.dst_srs = utils.str_or(dst_srs, 'epsg:4326')
        self.extend = extend
        self.node = node
        self.recursive = recursive
        
        self.region = src_region
        self.d_region = self.dist_region()
        
        self.name = name
        self.ogr_format = ogr_format
        self.verbose = verbose

        self._init_data()
        self._init_vector()
Exemplo n.º 2
0
    def warp(self, dst_srs='epsg:4326'):
        """warp the region from self.epsg to dst_epsg"""

        dst_srs = utils.str_or(dst_srs)
        if dst_srs is None or self.src_srs is None: return(self)

        src_srs = osr.SpatialReference()
        src_srs.SetFromUserInput(self.src_srs)

        dst_srs_ = osr.SpatialReference()
        dst_srs_.SetFromUserInput(dst_srs)
        try:
            src_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
            dst_srs_.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
        except: pass
        
        dst_trans = osr.CoordinateTransformation(src_srs, dst_srs_)
        if dst_trans is None:
            utils.echo_error_msg('could not perform transformation')
            return(self)

        self.src_srs = dst_srs
        self.wkt = None
        
        return(self.transform(dst_trans))
Exemplo n.º 3
0
 def __init__(self,
              x=None,
              y=None,
              z=None,
              w=1,
              src_srs='epsg:4326',
              z_units='m',
              z_datum='msl'):
     self.x = float_or(x)
     self.y = float_or(y)
     self.z = float_or(z)
     self.w = float_or(w, 1)
     self.src_srs = str_or(src_srs, 'epsg:4326')
     self.z_units = z_units
     self.z_datum = z_datum
Exemplo n.º 4
0
 def __init__(self,
              xmin=None,
              xmax=None,
              ymin=None,
              ymax=None,
              zmin=None,
              zmax=None,
              wmin=None,
              wmax=None,
              src_srs='epsg:4326',
              wkt=None):        
     self.xmin = utils.float_or(xmin)
     self.xmax = utils.float_or(xmax)
     self.ymin = utils.float_or(ymin)
     self.ymax = utils.float_or(ymax)
     self.zmin = utils.float_or(zmin)
     self.zmax = utils.float_or(zmax)
     self.wmin = utils.float_or(wmin)
     self.wmax = utils.float_or(wmax)
     self.src_srs = utils.str_or(src_srs, 'epsg:4326')
     self.wkt = wkt
Exemplo n.º 5
0
    def warp(self, dst_srs=None):
        """transform the x/y using dst_srs"""

        from osgeo import osr
        dst_srs = str_or(dst_srs)
        if dst_srs is None or self.src_srs is None:
            return (self)

        src_srs = osr.SpatialReference()
        src_srs.SetFromUserInput(self.src_srs)
        dst_srs_ = osr.SpatialReference()
        dst_srs_.SetFromUserInput(dst_srs)
        try:
            src_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
            dst_srs_.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
        except:
            pass

        dst_trans = osr.CoordinateTransformation(src_srs, dst_srs_)
        if dst_trans is None:
            return (self)

        self.transform(dst_trans)
        return (self)
Exemplo n.º 6
0
def main():
    src_grid = None
    dst_grid = None
    vdatum_in = 5703
    vdatum_out = 7662
    verbose = False
    keep_cache = False
    cache_dir = utils.cudem_cache

    i = 1

    argv = sys.argv
    while i < len(argv):
        arg = argv[i]

        if arg == '-i' or arg == '--vdatum_in':
            vdatum_in = argv[i + 1]
            i = i + 1
        elif arg == '-o' or arg == '--vdatum_out':
            vdatum_out = argv[i + 1]
            i = i + 1

        elif arg == '--cache-dir' or arg == '-D' or arg == '-cache-dir':
            cache_dir = os.path.join(utils.str_or(argv[i + 1], os.path.expanduser('~')), '.cudem_cache')
            i = i + 1
        elif arg[:2] == '-D': cache_dir = os.path.join(utils.str_or(argv[i + 1], os.path.expanduser('~')), '.cudem_cache')
        elif arg == '--list-epsg':
            #print(_epsg_desc(htdpfun.HTDP()._reference_frames))
            print(_epsg_desc('htdp epsg', vdatums._htdp_reference_frames))
            print(_epsg_desc('cdn espg', vdatums._cdn_reference_frames))
            print(_epsg_desc('tidal epsg', vdatums._tidal_frames))
            #list_proj_cdn_epsg()
            sys.exit(1)
        elif arg == '-k' or arg == '--keep-cache': keep_cache = True
        elif arg == '--verbose': verbose = True
        elif arg == '-help' or arg == '--help' or arg == '-h':
            print(_usage)
            sys.exit(1)
        elif arg == '-version' or arg == '--version':
            print('vertical_datum_convert.py, version {}'.format(_version))
            sys.exit(1)
        elif src_grid is None:
            src_grid = arg
        elif dst_grid is None:
            dst_grid = arg
        else:
            sys.stderr.write(_usage)
            sys.exit(1)
        i = i + 1

    if src_grid is None:
        sys.stderr.write(_usage)
        sys.exit(1)

    if dst_grid is None:
        dst_grid = '.'.join(src_grid.split('.')[:-1]) + '_' + str(vdatum_out.replace('(', '_').replace(')', '_')) + '.' + src_grid.split('.')[-1]

    if not os.path.exists(src_grid):
        utils.echo_error_msg('Error: {} is not a valid file'.format(src_grid))
    else:
        src_infos = demfun.infos(src_grid)
        
        src_region = regions.Region().from_geo_transform(src_infos['geoT'], src_infos['nx'], src_infos['ny'])
        src_region.src_srs = demfun.get_srs(src_grid)
        src_region.warp()
        x_inc, y_inc = src_region.increments(src_infos['nx'], src_infos['ny'])
        tmp_x_inc, tmp_y_inc = src_region.increments(src_infos['nx']/10, src_infos['ny']/10)
        vt = vdatums.VerticalTransform(src_region, tmp_x_inc, tmp_y_inc, vdatum_in, vdatum_out, cache_dir=cache_dir)
        _trans_grid = vt.run()
        
        if _trans_grid is not None:
            utils.run_cmd('gdalwarp {} {} -ts {} {} -s_srs epsg:4326 -t_srs {}'.format(_trans_grid, '_{}'.format(_trans_grid), src_infos['nx'], src_infos['ny'], demfun.get_srs(src_grid)), verbose=True)
            utils.run_cmd('gdal_calc.py -A {} -B {} --calc "A+B" --outfile {}'.format(src_grid.replace(' ', '\ '), '_{}'.format(_trans_grid).replace(' ', '\ '), dst_grid.replace(' ', '\ ')), verbose=True)
            utils.remove_glob(_trans_grid, '_{}'.format(_trans_grid))
        else:
            utils.echo_error_msg('could not parse input/output vertical datums: {} -> {}; check spelling, etc'.format(vdatum_in, vdatum_out))

        if not keep_cache:
            utils.remove_glob(cache_dir)
Exemplo n.º 7
0
    def parse_fn(self):
        """parse the datalist entry line"""

        if self.fn is None: return (self)
        if os.path.exists(self.fn):
            self.guess_data_format()
            self.metadata['name'] = self.fn.split('.')[0]
            return (self.fn)

        this_entry = re.findall(r'[^"\s]\S*|".+?"', self.fn.rstrip())

        try:
            entry = [utils.str_or(x) if n == 0 else utils.int_or(x) if n < 2 else utils.float_or(x) if n < 3 else utils.str_or(x) \
                     for n, x in enumerate(this_entry)]
        except Exception as e:
            utils.echo_error_msg('could not parse entry {}'.format(self.fn))
            return (self)

        ## ==============================================
        ## data format
        ## guess format based on fn if not specified and
        ## parse format for dataset specific opts.
        ## ==============================================
        if len(entry) < 2:
            for key in self.data_types.keys():
                se = entry[0].split('.')
                see = se[-1] if len(se) > 1 else entry[0].split(":")[0]
                if see in self.data_types[key]['fmts']:
                    entry.append(int(key))
                    break

            if len(entry) < 2:
                utils.echo_error_msg('could not parse entry {}'.format(
                    self.fn))
                return (self)

        else:
            opts = this_entry[1].split(':')
            if len(opts) > 1:
                self.ds_args = utils.args2dict(list(opts[1:]), {})
                this_entry[1] = opts[0]
            else:
                self.ds_args = {}

        ## ==============================================
        ## weight
        ## inherit weight of parent
        ## ==============================================
        if len(entry) < 3:
            entry.append(1)
        elif entry[2] is None:
            entry[2] = 1

        if self.parent is not None:
            if self.weight is not None:
                self.weight *= entry[2]
        else:
            if self.weight is not None:
                self.weight = entry[2]

        ## ==============================================
        ## title
        ## ==============================================
        if len(entry) < 4:
            entry.append(self.metadata['title'])
        else:
            self.metadata['title'] = entry[3]

        ## ==============================================
        ## source
        ## ==============================================
        if len(entry) < 5:
            entry.append(self.metadata['source'])
        else:
            self.metadata['source'] = entry[4]

        ## ==============================================
        ## date
        ## ==============================================
        if len(entry) < 6:
            entry.append(self.metadata['date'])
        else:
            self.metadata['date'] = entry[5]

        ## ==============================================
        ## data type
        ## ==============================================
        if len(entry) < 7:
            entry.append(self.metadata['data_type'])
        else:
            self.metadata['data_type'] = entry[6]

        ## ==============================================
        ## resolution
        ## ==============================================
        if len(entry) < 8:
            entry.append(self.metadata['resolution'])
        else:
            self.metadata['resolution'] = entry[7]

        ## ==============================================
        ## hdatum
        ## ==============================================
        if len(entry) < 9:
            entry.append(self.metadata['hdatum'])
        else:
            self.metadata['hdatum'] = entry[8]

        ## ==============================================
        ## vdatum
        ## ==============================================
        if len(entry) < 10:
            entry.append(self.metadata['vdatum'])
        else:
            self.metadata['vdatum'] = entry[9]

        ## ==============================================
        ## url
        ## ==============================================
        if len(entry) < 11:
            entry.append(self.metadata['url'])
        else:
            self.metadata['url'] = entry[10]

        ## ==============================================
        ## file-name
        ## ==============================================
        if self.parent is None or entry[1] == -11:
            self.fn = entry[0]
        else:
            self.fn = os.path.join(os.path.dirname(self.parent.fn), entry[0])

        self.data_format = entry[1]
        self.guess_data_format()
        return (self)