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()
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))
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
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
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)
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)
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)