def layer_change(self, *args): if self.view is None: new_layer = None else: new_layer = self.view.active_layer() if new_layer == self.layer: return if self.layer_selcb_id is not None: self.layer.disconnect(self.layer_selcb_id) self.layer.disconnect(self.layer_sselcb_id) self.layer_selcb_id = None self.layer = new_layer if self.layer is not None \ and gvutils.is_of_class(self.layer.__class__, 'GvShapeLayer'): self.layer_selcb_id = \ self.layer.connect('selection-changed',self.sel_change) self.layer_sselcb_id = \ self.layer.connect('subselection-changed',self.ssel_change) self.notify('active-layer-changed') self.sel_change() self.ssel_change()
def reset_image(self, *args): lay = gview.app.sel_manager.get_active_layer() lay_name = lay.get_name() if (lay is None) or (gvutils.is_of_class(lay.__class__, 'GvRasterLayer') == 0): gvutils.warning( 'Please select a raster layer using the layer dialog.\n') return layfname = lay.get_parent().get_name()[:-2] view = gview.app.sel_manager.get_active_view() viewwin = gview.app.sel_manager.get_active_view_window() row = gview.app.layerdlg.list_layers().index(view.active_layer()) view.remove_layer(lay) viewwin.file_open_by_name(layfname) lay = gview.app.sel_manager.get_active_layer() lay.set_name(lay_name) if row != 0: gview.app.layerdlg.layerlist.swap_rows(0, row) view.swap_layers(0, row) if viewwin.laytoggle.active: viewwin.updateLayers()
def layer_change(self, *args): if self.view is None: new_layer = None else: new_layer = self.view.active_layer() if new_layer == self.layer: return if self.layer_selcb_id is not None: self.layer.disconnect(self.layer_selcb_id) self.layer.disconnect(self.layer_sselcb_id) self.layer_selcb_id = None self.layer = new_layer if self.layer is not None \ and gvutils.is_of_class(self.layer.__class__, 'GvShapeLayer'): self.layer_selcb_id = \ self.layer.connect('selection-changed',self.sel_change) self.layer_sselcb_id = \ self.layer.connect('subselection-changed',self.ssel_change) self.notify('active-layer-changed') self.sel_change() self.ssel_change()
def layer_is_raster(): layer = gview.app.sel_manager.get_active_layer() if (layer is None) or (gvutils.is_of_class(layer.__class__, 'GvRasterLayer') == 0): gvutils.warning( 'Please select a raster layer using the layer dialog.\n') return BCG_Dialog()
def apply(self, *args): layer = gview.app.sel_manager.get_active_layer() if (layer is None) or (gvutils.is_of_class( layer.__class__, 'GvRasterLayer' ) == 0): gvutils.warning('Please select a raster layer using the layer dialog.\n') return lut = self.image_adjust(self.bright_adjustment) for isrc in range(layer.sources): (smin, smax) = layer.autoscale( isource=isrc, viewonly = 1 ) layer.set_source(isrc, layer.get_data(isrc), smin, smax, layer.get_const_value(isrc), lut, layer.nodata_get(isrc))
def apply(self, *args): layer = gview.app.sel_manager.get_active_layer() if (layer is None) or (gvutils.is_of_class(layer.__class__, 'GvRasterLayer') == 0): gvutils.warning( 'Please select a raster layer using the layer dialog.\n') return lut = self.image_adjust(self.bright_adjustment) for isrc in range(layer.sources): (smin, smax) = layer.autoscale(isource=isrc, viewonly=1) layer.set_source(isrc, layer.get_data(isrc), smin, smax, layer.get_const_value(isrc), lut, layer.nodata_get(isrc))
def save_vector_layer_request( self, *args ): view = self.view_manager.get_active_view() if view is None: return layer = view.active_layer() if layer is None: return if gvutils.is_of_class( layer.__class__, 'GvShapesLayer' ) == 0: return pgufilesel.SimpleFileSelect( self.save_vector_layer_with_file, cb_data = layer.get_parent(), title = 'Shapefile To Save to', default_filename = layer.get_name() )
def reset_image(self,*args): lay = gview.app.sel_manager.get_active_layer() lay_name = lay.get_name() if (lay is None) or (gvutils.is_of_class( lay.__class__, 'GvRasterLayer' ) == 0): gvutils.warning('Please select a raster layer using the layer dialog.\n') return layfname = lay.get_parent().get_name()[:-2] view = gview.app.sel_manager.get_active_view() viewwin = gview.app.sel_manager.get_active_view_window() row = gview.app.layerdlg.list_layers().index(view.active_layer()) view.remove_layer(lay) viewwin.file_open_by_name(layfname) lay = gview.app.sel_manager.get_active_layer() lay.set_name(lay_name) if row != 0: gview.app.layerdlg.layerlist.swap_rows(0,row) view.swap_layers(0,row) if viewwin.laytoggle.active: viewwin.updateLayers()
def execute(self, args, line, interp): import gvutils import gview import gdalnumeric clayer = gview.app.sel_manager.get_active_layer() if clayer is None: interp.showText('No layer is currently active!', 'error') return 0 try: roi = gview.app.toolbar.get_roi() except: roi = None # /s argument is 1 if user requested screenshot, 0 # if the underlying data was requested (default). # NOTE: roi is ignored for screenshot option is_ss = args[1] shell_vars = {} if is_ss == 1: cview = gview.app.sel_manager.get_active_view() if roi is not None: txt='Warning- ROI is ignored for screenshot-style get.\n'+\ 'Grabbing whole view area.\n' interp.showText(txt, 'error') # Note: for now, assume colour mode to start with (since # even single band images may have luts applied), and # if all three bands are identical in the end (greyscale # equivalent), return 1. err = cview.print_to_file(cview.get_width(), cview.get_height(), '_temp.tif', 'GTiff', 1) import os if err != 0: interp.showText( 'Error grabbing screenshot- unable to generate temporary file.\n', 'error') os.unlink('_temp.tif') return 0 try: import Numeric new_arr = gdalnumeric.LoadFile('_temp.tif') if ((max( Numeric.ravel( Numeric.fabs(new_arr[0, :, :] - new_arr[1, :, :]))) == 0) and (max( Numeric.ravel( Numeric.fabs(new_arr[2, :, :] - new_arr[1, :, :]))) == 0)): shp = Numeric.shape(new_arr) new_arr = Numeric.reshape(new_arr[0, :, :], (shp[1], shp[2])) except: interp.showText( 'Error grabbing screenshot- unable to load temporary file.\n', 'error') os.unlink('_temp.tif') return 0 shell_vars[args[0]] = new_arr os.unlink('_temp.tif') return (1, shell_vars) if gvutils.is_of_class(clayer.__class__, 'GvRasterLayer'): ds = clayer.get_parent().get_dataset() if roi is None: shell_vars[args[0]] = gdalnumeric.DatasetReadAsArray(ds) return (1, shell_vars) else: # Here, need to check if georeferencing is on or not and # convert to pixel/line coordinates if it is on. cview = gview.app.sel_manager.get_active_view() if (cview.get_raw(clayer) == 0): # view is georeferenced- convert corners [pixel, line] = clayer.view_to_pixel(roi[0], roi[1]) [pixel2, line2] = clayer.view_to_pixel(roi[0] + roi[2], roi[1] + roi[3]) [pixel3, line3] = clayer.view_to_pixel(roi[0], roi[1] + roi[3]) [pixel4, line4] = clayer.view_to_pixel(roi[0] + roi[2], roi[1]) # Get pixel-space rectangle (offsets of 1 ensure that # only pixels fully enclosed by the roi are included- # int casting will round floating point pixel/line # values down) max_pix = int(max(pixel, pixel2, pixel3, pixel4)) min_pix = int(min(pixel, pixel2, pixel3, pixel4)) + 1 max_line = int(max(line, line2, line3, line4)) min_line = int(min(line, line2, line3, line4)) + 1 # in pixel/line space, selected region is a parallelogram # but not necessarily a rectangle. Choose a rectangle # that fully encloses the parallelogram roi = (min_pix, min_line, max_pix - min_pix, max_line - min_line) shell_vars = {} shell_vars[args[0]] = gdalnumeric.DatasetReadAsArray( ds, roi[0], roi[1], roi[2], roi[3]) return (1, shell_vars) elif gvutils.is_of_class(clayer.__class__, 'GvShapesLayer'): shps = clayer.get_parent() selected = clayer.get_selected() if len(selected) == 0: newshps = gview.GvShapes() for item in shps.get_schema(): newshps.add_field(item[0], item[1], item[2], item[3]) for shp in shps: if shp is not None: newshps.append(shp.copy()) shell_vars = {} shell_vars[args[0]] = newshps return (1, shell_vars) else: newshps = gview.GvShapes() for item in shps.get_schema(): newshps.add_field(item[0], item[1], item[2], item[3]) for idx in selected: newshps.append(shps[idx].copy()) shell_vars = {} shell_vars[args[0]] = newshps return (1, shell_vars) else: interp.showText( 'Active layer is not a raster or recognized vector layer!', 'error') return 0
def export_cb(self, *args): ipfile = self.frame_dict['Files'].get('Input') opfile = self.frame_dict['Files'].get('Output') if os.path.isfile(opfile): resp = GtkExtra.message_box('Confirmation', opfile + ' exists. Overwrite?', ('Yes', 'No')) if resp == 'No': return elif len(opfile) == 0: gvutils.error('No output filename entered!') return use_viewscale = 0 rast = gdal.OpenShared(ipfile, gdalconst.GA_ReadOnly) if rast is None: if len(ipfile) == 0: gvutils.error('Please specify an input file!') else: gvutils.error('Unable to open ' + ipfile + ' as a GDAL supported file!') return # Catch the case where the input file consists of in-memory VRT lines # and the output format is also VRT. In this case, the new VRT would # no longer be valid once openev was exited because the input file # is not on disk (filename looks something like '<VRTDataset....'). # If the user is just exporting the file as-is, simply copying the # original lines to disk will suffice. However, if they want to # window or scale, we'd need more complicated manipulations. For now, # give an error message in that case. opformat = self.format_list[self.format_menu.get_history()] if (ipfile[0] == '<') and (opformat == 'VRT'): if self.res_list[self.res_menu.get_history()] != 'Full': msg='Only full output resolution is currently\n'+\ 'supported for export of in-memory VRTs\n'+\ 'to on-disk VRTs.' gvutils.error(msg) return if ((self.button_dict['Mode'].get_active()) and ((self.button_dict['IP_window'].get_active()) or (self.button_dict['Scale'].get_active()) or (len(self.optentry.get_text()) > 0))): msg='Scaling, windowing, and advanced creation\n'+\ 'options are not yet supported for export of \n'+\ 'in-memory VRTs to on-disk VRTs' gvutils.error(msg) return linelist = string.split(ipfile, '\n') newlinelist = [] for item in linelist: newlinelist.append(item + '\n') fh = open(opfile, 'w') fh.writelines(newlinelist) fh.close() ovrs = self._overview_list[self.overview_menu.get_history()] if ovrs != 'None': outds = gdal.OpenShared(opfile) if outds is None: gvutils.error('Error opening ' + opfile + ' for overview creation!') return progress = pguprogress.PGUProgressDialog( 'Building overviews...', cancel=gtk.TRUE) if ovrs is 'Nearest': outds.BuildOverviews("nearest", callback=progress.ProgressCB) else: outds.BuildOverviews("average_magphase", callback=progress.ProgressCB) progress.destroy() return vrt_opts = vrtutils.VRTCreationOptions(rast.RasterCount) if self._geocode_list[self.geocoding_menu.get_history()] == 'GCP': vrt_opts.set_geopref('gcps') elif self._geocode_list[ self.geocoding_menu.get_history()] == 'Geotransform': vrt_opts.set_geopref('geotransform') band_list = None # Scale the output file according to the current view's # min/max if self.button_dict['Scale'].get_active(): try: clayer = self.app.sel_manager.get_active_layer() if clayer.get_parent().get_dataset().GetDescription( ) != ipfile: wtxt = 'Input file and active layer file names do not match- may ' wtxt = wtxt + 'result in unexpected scaling!' gvutils.warning(wtxt) if gvutils.is_of_class(clayer.__class__, 'GvRasterLayer') == 0: gvutils.warning( 'Active layer is not a raster- view scaling ignored!') else: src_count = clayer.sources band_list = [] RGBAlist = ['Red', 'Green', 'Blue', 'Alpha'] for src in range(src_count): # layer sources are numbered 0...3; band sources are numbered 1,2,... src_bandnum = clayer.get_data(src).get_band_number() band_list.append(src_bandnum) vrt_opts.set_scaling( (clayer.min_get(src), clayer.max_get(src), 0, 255), (src_bandnum, )) vrt_opts.set_datatype(gdal.GDT_Byte, (src_bandnum, )) if src_count == 3: vrt_opts.set_color_interp(RGBAlist[src], (src_bandnum, )) # src_count is three even when there is an alpha channel # for rgb/rgba case if src_count == 3: try: src = 3 src_bandnum = clayer.get_data( src).get_band_number() band_list.append(src_bandnum) vrt_opts.set_scaling((clayer.min_get(src), clayer.max_get(src), 0, 255), (src_bandnum, )) vrt_opts.set_datatype(gdal.GDT_Byte, (src_bandnum, )) vrt_opts.set_color_interp(RGBAlist[src], (src_bandnum, )) except: pass use_viewscale = 1 if clayer.get_mode() == gview.RLM_COMPLEX: # This doesn't deal with complex yet... gvutils.error( 'View scaling option is not yet supported for complex data!' ) return elif rast._band[0].DataType == gdal.GDT_CInt16: # This doesn't deal with complex yet... gvutils.error( 'View scaling option is not yet supported for complex data!' ) return elif rast._band[0].DataType == gdal.GDT_CInt32: # This doesn't deal with complex yet... gvutils.error( 'View scaling option is not yet supported for complex data!' ) return elif rast._band[0].DataType == gdal.GDT_CFloat32: # This doesn't deal with complex yet... gvutils.error( 'View scaling option is not yet supported for complex data!' ) return elif rast._band[0].DataType == gdal.GDT_CFloat64: # This doesn't deal with complex yet... gvutils.error( 'View scaling option is not yet supported for complex data!' ) return except: gvutils.error( 'Unable to find active raster layer for scaling!') return # Get windowing options if self.button_dict['IP_window'].get_active(): try: spix = int(self.frame_dict['IP_window']. entry_dict['start_pix'].get_text()) sline = int(self.frame_dict['IP_window']. entry_dict['start_line'].get_text()) npix = int(self.frame_dict['IP_window'].entry_dict['num_pix']. get_text()) nlines = int(self.frame_dict['IP_window']. entry_dict['num_lines'].get_text()) if (spix < 0) or (sline < 0): gvutils.error( 'Negative start pixel and/or line! Aborting...') return if (npix + spix > rast.RasterXSize): gvutils.error( 'Window is too large (last column in input: ' + str(rast.RasterXSize) + ')! Aborting...') return if (nlines + sline > rast.RasterYSize): gvutils.error('Window is too large (last row in input: ' + str(rast.RasterYSize) + ')! Aborting...') return except: gvutils.error('Error retrieving window options! Aborting...') return else: spix = 0 sline = 0 npix = rast.RasterXSize nlines = rast.RasterYSize vrt_opts.set_src_window((spix, sline, npix, nlines)) if self.res_list[self.res_menu.get_history()] != 'Full': ovrlevel = int(self.res_list[self.res_menu.get_history()][2]) else: ovrlevel = 1 vrt_opts.set_dst_window((0, 0, npix / ovrlevel, nlines / ovrlevel)) vrt_tree = vrtutils.serializeDataset(rast, vrt_opts, band_list) vrt_lines = gdal.SerializeXMLTree(vrt_tree) vrtdataset = gdal.Open(vrt_lines) driver = gdal.GetDriverByName(opformat) # Parse creation options: optstr = string.strip(self.optentry.get_text()) if len(optstr) > 0: # should be able to deal with several # types of entries, eg. # 'TILED=YES','TFW=YES' # and # TILED=YES,TFW=YES if optstr[0] in ["'", '"']: split1 = string.split(optstr, ",") copts = [] for item in split1: if len(item) > 2: copts.append(item[1:len(item) - 1]) else: copts = string.split(optstr, ',') else: copts = [] progress = pguprogress.PGUProgressDialog('Export to ' + opfile, cancel=gtk.TRUE) progress.SetDefaultMessage("translated") outdataset = driver.CreateCopy(opfile, vrtdataset, options=copts, callback=progress.ProgressCB) if outdataset is None: progress.destroy() gvutils.error('Unable to create output file ' + opfile) return ovrs = self._overview_list[self.overview_menu.get_history()] if ovrs is 'Nearest': progress.SetDefaultMessage("overviews built") outdataset.BuildOverviews("nearest", callback=progress.ProgressCB) elif ovrs is 'Average': progress.SetDefaultMessage("overviews built") outdataset.BuildOverviews("average_magphase", callback=progress.ProgressCB) progress.destroy()
def export_cb(self,*args): ipfile=self.frame_dict['Files'].get('Input') opfile=self.frame_dict['Files'].get('Output') if os.path.isfile(opfile): resp=GtkExtra.message_box('Confirmation',opfile + ' exists. Overwrite?',('Yes','No')) if resp == 'No': return elif len(opfile) == 0: gvutils.error('No output filename entered!') return use_viewscale=0 rast = gdal.OpenShared(ipfile, gdalconst.GA_ReadOnly) if rast is None: if len(ipfile) == 0: gvutils.error('Please specify an input file!') else: gvutils.error('Unable to open ' + ipfile + ' as a GDAL supported file!') return # Catch the case where the input file consists of in-memory VRT lines # and the output format is also VRT. In this case, the new VRT would # no longer be valid once openev was exited because the input file # is not on disk (filename looks something like '<VRTDataset....'). # If the user is just exporting the file as-is, simply copying the # original lines to disk will suffice. However, if they want to # window or scale, we'd need more complicated manipulations. For now, # give an error message in that case. opformat=self.format_list[self.format_menu.get_history()] if (ipfile[0] == '<') and (opformat == 'VRT'): if self.res_list[self.res_menu.get_history()] != 'Full': msg='Only full output resolution is currently\n'+\ 'supported for export of in-memory VRTs\n'+\ 'to on-disk VRTs.' gvutils.error(msg) return if ( (self.button_dict['Mode'].get_active()) and ((self.button_dict['IP_window'].get_active()) or (self.button_dict['Scale'].get_active()) or (len(self.optentry.get_text()) > 0))): msg='Scaling, windowing, and advanced creation\n'+\ 'options are not yet supported for export of \n'+\ 'in-memory VRTs to on-disk VRTs' gvutils.error(msg) return linelist=string.split(ipfile,'\n') newlinelist=[] for item in linelist: newlinelist.append(item+'\n') fh=open(opfile,'w') fh.writelines(newlinelist) fh.close() ovrs=self._overview_list[self.overview_menu.get_history()] if ovrs != 'None': outds=gdal.OpenShared(opfile) if outds is None: gvutils.error('Error opening '+opfile+' for overview creation!') return progress = pguprogress.PGUProgressDialog( 'Building overviews...', cancel = gtk.TRUE ) if ovrs is 'Nearest': outds.BuildOverviews( "nearest", callback = progress.ProgressCB ) else: outds.BuildOverviews( "average_magphase", callback = progress.ProgressCB ) progress.destroy() return vrt_opts=vrtutils.VRTCreationOptions(rast.RasterCount) if self._geocode_list[self.geocoding_menu.get_history()] == 'GCP': vrt_opts.set_geopref('gcps') elif self._geocode_list[self.geocoding_menu.get_history()] == 'Geotransform': vrt_opts.set_geopref('geotransform') band_list = None # Scale the output file according to the current view's # min/max if self.button_dict['Scale'].get_active(): try: clayer = self.app.sel_manager.get_active_layer() if clayer.get_parent().get_dataset().GetDescription() != ipfile: wtxt = 'Input file and active layer file names do not match- may ' wtxt = wtxt + 'result in unexpected scaling!' gvutils.warning(wtxt) if gvutils.is_of_class(clayer.__class__,'GvRasterLayer') == 0: gvutils.warning('Active layer is not a raster- view scaling ignored!') else: src_count=clayer.sources band_list = [] RGBAlist=['Red','Green','Blue','Alpha'] for src in range(src_count): # layer sources are numbered 0...3; band sources are numbered 1,2,... src_bandnum=clayer.get_data(src).get_band_number() band_list.append(src_bandnum) vrt_opts.set_scaling((clayer.min_get(src),clayer.max_get(src),0,255),(src_bandnum,)) vrt_opts.set_datatype(gdal.GDT_Byte,(src_bandnum,)) if src_count == 3: vrt_opts.set_color_interp(RGBAlist[src], (src_bandnum,)) # src_count is three even when there is an alpha channel # for rgb/rgba case if src_count == 3: try: src=3 src_bandnum=clayer.get_data(src).get_band_number() band_list.append(src_bandnum) vrt_opts.set_scaling((clayer.min_get(src), clayer.max_get(src),0,255), (src_bandnum,)) vrt_opts.set_datatype(gdal.GDT_Byte,(src_bandnum,)) vrt_opts.set_color_interp(RGBAlist[src], (src_bandnum,)) except: pass use_viewscale=1 if clayer.get_mode()==gview.RLM_COMPLEX: # This doesn't deal with complex yet... gvutils.error('View scaling option is not yet supported for complex data!') return elif rast._band[0].DataType == gdal.GDT_CInt16: # This doesn't deal with complex yet... gvutils.error('View scaling option is not yet supported for complex data!') return elif rast._band[0].DataType == gdal.GDT_CInt32: # This doesn't deal with complex yet... gvutils.error('View scaling option is not yet supported for complex data!') return elif rast._band[0].DataType == gdal.GDT_CFloat32: # This doesn't deal with complex yet... gvutils.error('View scaling option is not yet supported for complex data!') return elif rast._band[0].DataType == gdal.GDT_CFloat64: # This doesn't deal with complex yet... gvutils.error('View scaling option is not yet supported for complex data!') return except: gvutils.error('Unable to find active raster layer for scaling!') return # Get windowing options if self.button_dict['IP_window'].get_active(): try: spix=int(self.frame_dict['IP_window'].entry_dict['start_pix'].get_text()) sline=int(self.frame_dict['IP_window'].entry_dict['start_line'].get_text()) npix=int(self.frame_dict['IP_window'].entry_dict['num_pix'].get_text()) nlines=int(self.frame_dict['IP_window'].entry_dict['num_lines'].get_text()) if (spix < 0) or (sline < 0): gvutils.error('Negative start pixel and/or line! Aborting...') return if (npix+spix > rast.RasterXSize): gvutils.error('Window is too large (last column in input: '+str(rast.RasterXSize)+')! Aborting...') return if (nlines+sline > rast.RasterYSize): gvutils.error('Window is too large (last row in input: '+str(rast.RasterYSize)+')! Aborting...') return except: gvutils.error('Error retrieving window options! Aborting...') return else: spix=0 sline=0 npix=rast.RasterXSize nlines=rast.RasterYSize vrt_opts.set_src_window((spix,sline,npix,nlines)) if self.res_list[self.res_menu.get_history()] != 'Full': ovrlevel=int(self.res_list[self.res_menu.get_history()][2]) else: ovrlevel=1 vrt_opts.set_dst_window((0,0,npix/ovrlevel,nlines/ovrlevel)) vrt_tree=vrtutils.serializeDataset(rast,vrt_opts,band_list) vrt_lines=gdal.SerializeXMLTree(vrt_tree) vrtdataset=gdal.Open(vrt_lines) driver=gdal.GetDriverByName(opformat) # Parse creation options: optstr=string.strip(self.optentry.get_text()) if len(optstr) > 0: # should be able to deal with several # types of entries, eg. # 'TILED=YES','TFW=YES' # and # TILED=YES,TFW=YES if optstr[0] in ["'",'"']: split1=string.split(optstr,",") copts=[] for item in split1: if len(item) > 2: copts.append(item[1:len(item)-1]) else: copts=string.split(optstr,',') else: copts=[] progress = pguprogress.PGUProgressDialog( 'Export to '+opfile, cancel = gtk.TRUE ) progress.SetDefaultMessage("translated") outdataset=driver.CreateCopy(opfile,vrtdataset, options=copts, callback=progress.ProgressCB) if outdataset is None: progress.destroy() gvutils.error('Unable to create output file '+opfile) return ovrs=self._overview_list[self.overview_menu.get_history()] if ovrs is 'Nearest': progress.SetDefaultMessage("overviews built") outdataset.BuildOverviews( "nearest", callback = progress.ProgressCB ) elif ovrs is 'Average': progress.SetDefaultMessage("overviews built") outdataset.BuildOverviews( "average_magphase", callback = progress.ProgressCB ) progress.destroy()
def layer_is_raster(): layer = gview.app.sel_manager.get_active_layer() if (layer is None) or (gvutils.is_of_class( layer.__class__, 'GvRasterLayer' ) == 0): gvutils.warning('Please select a raster layer using the layer dialog.\n') return BCG_Dialog()
def load_active(self,*args): layer = gview.app.sel_manager.get_active_layer() if (layer is None) or (gvutils.is_of_class( layer.__class__, 'GvRasterLayer' ) == 0): gvutils.warning('Please select a raster layer using the layer dialog.\n') return layer_ds = layer.get_parent().get_name()[:-2] ds = gdal.OpenShared(layer_ds) gview.manager.add_dataset(ds) if ds.RasterCount == 3: rlayer1 = gview.manager.get_dataset_raster(ds,1) rlayer2 = gview.manager.get_dataset_raster(ds,2) rlayer3 = gview.manager.get_dataset_raster(ds,3) raster = gview.GvRasterLayer(rlayer1) ras_copy = gview.GvRasterLayer(rlayer1) raster.set_source(1,rlayer2) raster.set_source(2,rlayer3) ras_copy.set_source(1,rlayer2) ras_copy.set_source(2,rlayer3) else: rlayer = gview.manager.get_dataset_raster(ds,1) raster = gview.GvRasterLayer(rlayer) ras_copy = gview.GvRasterLayer(rlayer) raster.set_name('RASTER') ras_copy.set_name('RASTER') oldras1 = self.viewarea1.get_named_layer('RASTER') oldras2 = self.viewarea2.get_named_layer('RASTER') if oldras1 is not None: self.viewarea1.remove_layer(oldras1) self.viewarea2.remove_layer(oldras2) #check for lut: lut_name = os.path.splitext(layer_ds)[0] + '.lut' if os.path.isfile(lut_name): lut_file = open(lut_name,'rb') lut = '' lut = lut_file.read() #print 'loading:', len(lut) if lut: for isrc in range(raster.sources): #(smin, smax) = raster_layer.autoscale( isource=isrc, viewonly = 1 ) #print (smin,smax) raster.set_source(isrc, raster.get_data(isrc), 0, 255, raster.get_const_value(isrc), lut, raster.nodata_get(isrc)) ras_copy.set_source(isrc, ras_copy.get_data(isrc), 0, 255, ras_copy.get_const_value(isrc), lut, ras_copy.nodata_get(isrc)) lut_file.close() #check for bcg: bcg_name = os.path.splitext(layer_ds)[0] + '.bcg' if os.path.isfile(bcg_name): bcg_file = open(bcg_name,'r') bcg = '' bcg = bcg_file.readline() bcg = bcg.replace('\n','') bcg_file.close() values = bcg.split(',') self.bright_adjustment.set_value(float(values[0])) self.contrast_adjustment.set_value(float(values[1])) self.gamma_adjustment.set_value(float(values[2])) self.viewarea1.add_layer(raster) self.viewarea1.set_active_layer(raster) self.viewarea2.add_layer(ras_copy) self.viewarea2.set_active_layer(ras_copy)
def export_cb(self,*args): ipfile = self.frame_dict['Files'].get('Input') opfile = self.frame_dict['Files'].get('Output') if os.path.isfile(opfile): resp = gvutils.yesno('Confirmation', '%s exists. Overwrite?' % opfile) if resp == 'No': return elif len(opfile) == 0: gvutils.error('No output filename entered!') return use_viewscale = 0 rast = gdal.OpenShared(ipfile, gdal.GA_ReadOnly) if rast is None: if not ipfile: gvutils.error('Please specify an input file!') else: gvutils.error('Unable to open %s as a GDAL supported file!' % ipfile) return # Catch the case where the input file consists of in-memory VRT lines # and the output format is also VRT. In this case, the new VRT would # no longer be valid once openev was exited because the input file # is not on disk (filename looks something like '<VRTDataset....'). # If the user is just exporting the file as-is, simply copying the # original lines to disk will suffice. However, if they want to # window or scale, we'd need more complicated manipulations. For now, # give an error message in that case. opformat = self.format_list[self.format_menu.get_history()] if ipfile.startswith('<') and opformat == 'VRT': if self.res_list[self.res_menu.get_history()] != 'Full': msg = 'Only full output resolution is currently\n'+\ 'supported for export of in-memory VRTs\nto on-disk VRTs.' gvutils.error(msg) return if self.button_dict['Mode'].get_active() and \ (self.button_dict['IP_window'].get_active() or self.button_dict['Scale'].get_active() or self.optentry.get_text()): msg = 'Scaling, windowing, and advanced creation\n'+\ 'options are not yet supported for export of \n'+\ 'in-memory VRTs to on-disk VRTs' gvutils.error(msg) return linelist = ipfile.split('\n') newlinelist = [] for item in linelist: newlinelist.append(item+'\n') fh = open(opfile,'w') fh.writelines(newlinelist) fh.close() ovrs = self._overview_list[self.overview_menu.get_history()] if ovrs != 'None': outds = gdal.OpenShared(opfile) if outds is None: gvutils.error('Error opening %s for overview creation!' % opfile) return ## progress = pgu.ProgressDialog('Building overviews...', cancel=True) if ovrs is 'Nearest': outds.BuildOverviews("nearest") else: outds.BuildOverviews("average_magphase") ## progress.destroy() return vrt_opts = vrtutils.VRTCreationOptions(rast.RasterCount) if self._geocode_list[self.geocoding_menu.get_history()] == 'GCP': vrt_opts.set_geopref('gcps') elif self._geocode_list[self.geocoding_menu.get_history()] == 'Geotransform': vrt_opts.set_geopref('geotransform') band_list = None # Scale the output file according to the current view's min/max laststretch = 'none_lut' clayer = None if self.button_dict['Scale'].get_active(): try: clayer = self.app.sel_manager.get_active_layer() dtype = rast.GetRasterBand(1).DataType if clayer.get_mode() == gview.RLM_COMPLEX or \ dtype in (gdal.GDT_CInt16,gdal.GDT_CInt32,gdal.GDT_CFloat32,gdal.GDT_CFloat64): # This doesn't deal with complex yet... gvutils.error('View scaling option is not yet supported for complex data!') return if clayer.parent.get_dataset().GetDescription() != ipfile: wtxt = 'Input file and active layer file names do not match- may ' wtxt += 'result in unexpected scaling!' gvutils.warning(wtxt) if not gvutils.is_of_class(clayer.__class__,'GvRasterLayer'): gvutils.warning('Active layer is not a raster- view scaling ignored!') else: src_count = clayer.sources band_list = [] RGBAlist = ['Red','Green','Blue','Alpha'] for src in range(src_count): # layer sources are numbered 0...3; band sources are numbered 1,2,... src_bandnum = clayer.get_data(src).get_band_number() band_list.append(src_bandnum) vrt_opts.set_scaling((clayer.min_get(src), clayer.max_get(src),0,255), (src_bandnum,)) vrt_opts.set_datatype(gdal.GDT_Byte, (src_bandnum,)) if src_count == 3: vrt_opts.set_color_interp(RGBAlist[src], (src_bandnum,)) # src_count is three even when there is an alpha channel # for rgb/rgba case if src_count == 3: try: src = 3 src_bandnum = clayer.get_data(src).get_band_number() band_list.append(src_bandnum) vrt_opts.set_scaling((clayer.min_get(src), clayer.max_get(src),0,255), (src_bandnum,)) vrt_opts.set_datatype(gdal.GDT_Byte,(src_bandnum,)) vrt_opts.set_color_interp(RGBAlist[src], (src_bandnum,)) except: pass use_viewscale = 1 laststretch = clayer.get_property('last_stretch') except: gvutils.error('Unable to find active raster layer for scaling!') return # Get windowing options if self.button_dict['IP_window'].get_active(): try: dic = self.frame_dict['IP_window'].entry_dict spix = int(dic['start_pix'].get_text()) sline = int(dic['start_line'].get_text()) npix = int(dic['num_pix'].get_text()) nlines = int(dic['num_lines'].get_text()) if spix < 0 or sline < 0: gvutils.error('Negative start pixel and/or line! Aborting...') return if npix+spix > rast.RasterXSize: gvutils.error('Window is too large (last column in input: %s)! Aborting...' % rast.RasterXSize) return if nlines+sline > rast.RasterYSize: gvutils.error('Window is too large (last row in input: %s)! Aborting...' % rast.RasterYSize) return except: gvutils.error('Error retrieving window options! Aborting...') return else: spix = 0 sline = 0 npix = rast.RasterXSize nlines = rast.RasterYSize vrt_opts.set_src_window((spix, sline, npix, nlines)) if self.res_list[self.res_menu.get_history()] != 'Full': ovrlevel = int(self.res_list[self.res_menu.get_history()][2]) else: ovrlevel = 1 vrt_opts.set_dst_window((0, 0, npix/ovrlevel, nlines/ovrlevel)) vrt_tree = vrtutils.serializeDataset(rast, vrt_opts, band_list) vrt_lines = gdal.SerializeXMLTree(vrt_tree) vrtdataset = gdal.Open(vrt_lines) driver = gdal.GetDriverByName(opformat) # Parse creation options: optstr = self.optentry.get_text().strip() if optstr: # should be able to deal with several # types of entries, eg. # 'TILED=YES','TFW=YES' # and # TILED=YES,TFW=YES if optstr[0] in ("'",'"'): split1 = optstr.split(",") copts=[] for item in split1: if len(item) > 2: copts.append(item[1:len(item)-1]) else: copts = optstr.split(',') else: copts = [] progress = pgu.ProgressDialog('Export to '+opfile, cancel=True) progress.SetDefaultMessage("translated") progress.show() progress.ProgressCB(0) if use_viewscale and laststretch != 'linear': gvutils.error('Sorry, not working yet...') progress.destroy() return outdataset = driver.Create(opfile, vrtdataset.RasterXSize, vrtdataset.RasterYSize, bands=vrtdataset.RasterCount, options=copts) outdataset.SetProjection(vrtdataset.GetProjection()) outdataset.SetGeoTransform(vrtdataset.GetGeoTransform()) lut = clayer.get_source_lut(0) prg = 1 denom = vrtdataset.RasterCount * vrtdataset.RasterYSize for b in range(vrtdataset.RasterCount): band = vrtdataset.GetRasterBand(b+1) outband = outdataset.GetRasterBand(b+1) offset = float(b * vrtdataset.RasterYSize) for ln in range(vrtdataset.RasterYSize): line = band.ReadRaster(0, ln, vrtdataset.RasterXSize, 1) enhline = map(lambda x: lut[ord(x)], line) buf = ''.join(enhline) outband.WriteRaster(0, ln, vrtdataset.RasterXSize, 1, buf) prg = progress.ProgressCB((float(ln) + offset)/denom, '') if not prg: print 'Cancelled!' break if not prg: outdataset = None break else: outdataset = driver.CreateCopy(opfile, vrtdataset, options=copts) if outdataset is None: progress.destroy() gvutils.error('Unable to create output file '+opfile) return progress.ProgressCB(1, 'Done') ovrs = self._overview_list[self.overview_menu.get_history()] if ovrs is 'Nearest': progress.SetDefaultMessage("overviews built") outdataset.BuildOverviews("nearest") elif ovrs is 'Average': progress.SetDefaultMessage("overviews built") outdataset.BuildOverviews("average_magphase") progress.ProgressCB(1, 'Done') progress.destroy()
def load_active(self, *args): layer = gview.app.sel_manager.get_active_layer() if (layer is None) or (gvutils.is_of_class(layer.__class__, 'GvRasterLayer') == 0): gvutils.warning( 'Please select a raster layer using the layer dialog.\n') return layer_ds = layer.get_parent().get_name()[:-2] ds = gdal.OpenShared(layer_ds) gview.manager.add_dataset(ds) if ds.RasterCount == 3: rlayer1 = gview.manager.get_dataset_raster(ds, 1) rlayer2 = gview.manager.get_dataset_raster(ds, 2) rlayer3 = gview.manager.get_dataset_raster(ds, 3) raster = gview.GvRasterLayer(rlayer1) ras_copy = gview.GvRasterLayer(rlayer1) raster.set_source(1, rlayer2) raster.set_source(2, rlayer3) ras_copy.set_source(1, rlayer2) ras_copy.set_source(2, rlayer3) else: rlayer = gview.manager.get_dataset_raster(ds, 1) raster = gview.GvRasterLayer(rlayer) ras_copy = gview.GvRasterLayer(rlayer) raster.set_name('RASTER') ras_copy.set_name('RASTER') oldras1 = self.viewarea1.get_named_layer('RASTER') oldras2 = self.viewarea2.get_named_layer('RASTER') if oldras1 is not None: self.viewarea1.remove_layer(oldras1) self.viewarea2.remove_layer(oldras2) #check for lut: lut_name = os.path.splitext(layer_ds)[0] + '.lut' if os.path.isfile(lut_name): lut_file = open(lut_name, 'rb') lut = '' lut = lut_file.read() #print 'loading:', len(lut) if lut: for isrc in range(raster.sources): #(smin, smax) = raster_layer.autoscale( isource=isrc, viewonly = 1 ) #print (smin,smax) raster.set_source(isrc, raster.get_data(isrc), 0, 255, raster.get_const_value(isrc), lut, raster.nodata_get(isrc)) ras_copy.set_source(isrc, ras_copy.get_data(isrc), 0, 255, ras_copy.get_const_value(isrc), lut, ras_copy.nodata_get(isrc)) lut_file.close() #check for bcg: bcg_name = os.path.splitext(layer_ds)[0] + '.bcg' if os.path.isfile(bcg_name): bcg_file = open(bcg_name, 'r') bcg = '' bcg = bcg_file.readline() bcg = bcg.replace('\n', '') bcg_file.close() values = bcg.split(',') self.bright_adjustment.set_value(float(values[0])) self.contrast_adjustment.set_value(float(values[1])) self.gamma_adjustment.set_value(float(values[2])) self.viewarea1.add_layer(raster) self.viewarea1.set_active_layer(raster) self.viewarea2.add_layer(ras_copy) self.viewarea2.set_active_layer(ras_copy)
def save_cb(self, *args): if self.copy_but.active: outfile = GtkExtra.file_sel_box(title=_("Output File")) if outfile is None: return ds = self.viewarea1.active_layer().get_parent().get_dataset() bright_val = math.floor(self.bright_adjustment.value * 255 / 100) contrast_val = (100 + self.contrast_adjustment.value) / 100 gamma_val = self.gamma_adjustment.value outarray = Numeric.zeros( (ds.RasterCount, ds.RasterYSize, ds.RasterXSize), typecode=Numeric.UnsignedInt8) try: size = ds.RasterYSize import EasyDialogs progress = EasyDialogs.ProgressBar(title='Working...', maxval=size) except: pass lut = [] for i in range(256): value = i + math.floor(bright_val) if value < 0: value = 0 elif value >= 255: value = 255 if contrast_val != 1.0: value = value * contrast_val if value < 0: value = 0 elif value >= 255: value = 255 if gamma_val != 1: value = 255 * math.pow( float(abs(value)) / 255, 1.0 / gamma_val) if value < 0: value = 0 elif value >= 255: value = 255 value = int(value) lut.append(value) lutarray = Numeric.array((lut), typecode=Numeric.UnsignedInt8) for m in range(ds.RasterCount): inband = ds.GetRasterBand(m + 1) for i in range(ds.RasterYSize): #inarray = inband.ReadAsArray() inarray = inband.ReadAsArray(0, i, inband.XSize, 1, inband.XSize, 1)[0].astype(Numeric.UnsignedInt8) #outarray = Numeric.zeros(inarray.shape) try: progress.label('Processing Band: ' + str(m + 1) + ', Line: ' + str(i)) progress.set(i) except: pass outarray[m][i].flat[:] = Numeric.take(lutarray, inarray.flat) res_ds = gdalnumeric.OpenArray(outarray, ds) res_ds = gview.manager.add_dataset(res_ds) view = gview.app.sel_manager.get_active_view_window() if self.copy_but.active: driver = ds.GetDriver() driver.CreateCopy(outfile, res_ds) view.file_open_by_name(outfile) self.destroy() elif self.owrite_but.active: for layer in gview.app.sel_manager.get_active_view().list_layers(): if gvutils.is_of_class(layer.__class__, 'GvRasterLayer') == 1: if layer.get_parent().get_dataset().GetDescription( ) == ds.GetDescription(): gview.app.sel_manager.get_active_view().remove_layer( layer) fname = ds.GetDescription() driver = ds.GetDriver() driver.CreateCopy(fname, res_ds) view.file_open_by_name(fname) view.refresh_cb() self.destroy() del ds del res_ds del outarray
def execute(self, args, line, interp): import gvutils import gview import gdalnumeric clayer = gview.app.sel_manager.get_active_layer() if clayer is None: interp.showText('No layer is currently active!','error') return 0 try: roi=gview.app.toolbar.get_roi() except: roi=None # /s argument is 1 if user requested screenshot, 0 # if the underlying data was requested (default). # NOTE: roi is ignored for screenshot option is_ss=args[1] shell_vars={} if is_ss == 1: cview=gview.app.sel_manager.get_active_view() if roi is not None: txt='Warning- ROI is ignored for screenshot-style get.\n'+\ 'Grabbing whole view area.\n' interp.showText(txt,'error') # Note: for now, assume colour mode to start with (since # even single band images may have luts applied), and # if all three bands are identical in the end (greyscale # equivalent), return 1. err=cview.print_to_file(cview.get_width(),cview.get_height(), '_temp.tif','GTiff',1) import os if err != 0: interp.showText( 'Error grabbing screenshot- unable to generate temporary file.\n', 'error') os.unlink('_temp.tif') return 0 try: import Numeric new_arr=gdalnumeric.LoadFile('_temp.tif') if ((max(Numeric.ravel(Numeric.fabs(new_arr[0,:,:] - new_arr[1,:,:]))) == 0) and (max(Numeric.ravel(Numeric.fabs(new_arr[2,:,:] - new_arr[1,:,:]))) == 0)): shp=Numeric.shape(new_arr) new_arr=Numeric.reshape(new_arr[0,:,:],(shp[1],shp[2])) except: interp.showText( 'Error grabbing screenshot- unable to load temporary file.\n', 'error') os.unlink('_temp.tif') return 0 shell_vars[args[0]]=new_arr os.unlink('_temp.tif') return(1,shell_vars) if gvutils.is_of_class(clayer.__class__,'GvRasterLayer'): ds=clayer.get_parent().get_dataset() if roi is None: shell_vars[args[0]]=gdalnumeric.DatasetReadAsArray(ds) return (1,shell_vars) else: # Here, need to check if georeferencing is on or not and # convert to pixel/line coordinates if it is on. cview=gview.app.sel_manager.get_active_view() if (cview.get_raw(clayer) == 0): # view is georeferenced- convert corners [pixel,line] = clayer.view_to_pixel(roi[0],roi[1]) [pixel2,line2] = clayer.view_to_pixel(roi[0]+roi[2], roi[1]+roi[3]) [pixel3,line3] = clayer.view_to_pixel(roi[0], roi[1]+roi[3]) [pixel4,line4] = clayer.view_to_pixel(roi[0]+roi[2], roi[1]) # Get pixel-space rectangle (offsets of 1 ensure that # only pixels fully enclosed by the roi are included- # int casting will round floating point pixel/line # values down) max_pix = int(max(pixel,pixel2,pixel3,pixel4)) min_pix = int(min(pixel,pixel2,pixel3,pixel4))+1 max_line = int(max(line,line2,line3,line4)) min_line = int(min(line,line2,line3,line4))+1 # in pixel/line space, selected region is a parallelogram # but not necessarily a rectangle. Choose a rectangle # that fully encloses the parallelogram roi = (min_pix,min_line,max_pix-min_pix,max_line-min_line) shell_vars={} shell_vars[args[0]]=gdalnumeric.DatasetReadAsArray(ds,roi[0], roi[1],roi[2],roi[3]) return (1,shell_vars) elif gvutils.is_of_class(clayer.__class__,'GvShapesLayer'): shps=clayer.get_parent() selected = clayer.get_selected() if len(selected) == 0: newshps = gview.GvShapes() for item in shps.get_schema(): newshps.add_field(item[0],item[1],item[2],item[3]) for shp in shps: if shp is not None: newshps.append(shp.copy()) shell_vars={} shell_vars[args[0]]=newshps return (1,shell_vars) else: newshps = gview.GvShapes() for item in shps.get_schema(): newshps.add_field(item[0],item[1],item[2],item[3]) for idx in selected: newshps.append(shps[idx].copy()) shell_vars={} shell_vars[args[0]]=newshps return (1,shell_vars) else: interp.showText( 'Active layer is not a raster or recognized vector layer!', 'error') return 0
def save_cb(self, *args): if self.copy_but.active: outfile=GtkExtra.file_sel_box(title=_("Output File")) if outfile is None: return ds = self.viewarea1.active_layer().get_parent().get_dataset() bright_val = math.floor(self.bright_adjustment.value*255/100) contrast_val = (100+self.contrast_adjustment.value)/100 gamma_val = self.gamma_adjustment.value outarray = Numeric.zeros((ds.RasterCount,ds.RasterYSize,ds.RasterXSize),typecode=Numeric.UnsignedInt8) try: size = ds.RasterYSize import EasyDialogs progress = EasyDialogs.ProgressBar(title='Working...',maxval=size) except: pass lut = [] for i in range(256): value = i + math.floor(bright_val) if value < 0 : value = 0 elif value >= 255: value = 255 if contrast_val != 1.0: value = value * contrast_val if value < 0 : value = 0 elif value >= 255: value = 255 if gamma_val != 1: value = 255*math.pow(float(abs(value))/255,1.0/gamma_val) if value < 0 : value = 0 elif value >= 255: value = 255 value = int(value) lut.append(value) lutarray = Numeric.array((lut),typecode=Numeric.UnsignedInt8) for m in range(ds.RasterCount): inband = ds.GetRasterBand(m+1) for i in range(ds.RasterYSize): #inarray = inband.ReadAsArray() inarray = inband.ReadAsArray(0, i, inband.XSize, 1, inband.XSize, 1)[0].astype(Numeric.UnsignedInt8) #outarray = Numeric.zeros(inarray.shape) try: progress.label('Processing Band: ' + str(m+1) + ', Line: '+str(i)) progress.set(i) except: pass outarray[m][i].flat[:] = Numeric.take(lutarray,inarray.flat) res_ds = gdalnumeric.OpenArray(outarray,ds) res_ds = gview.manager.add_dataset(res_ds) view = gview.app.sel_manager.get_active_view_window() if self.copy_but.active: driver = ds.GetDriver() driver.CreateCopy(outfile,res_ds) view.file_open_by_name(outfile) self.destroy() elif self.owrite_but.active: for layer in gview.app.sel_manager.get_active_view().list_layers(): if gvutils.is_of_class( layer.__class__, 'GvRasterLayer' ) == 1: if layer.get_parent().get_dataset().GetDescription() == ds.GetDescription(): gview.app.sel_manager.get_active_view().remove_layer(layer) fname = ds.GetDescription() driver = ds.GetDriver() driver.CreateCopy(fname,res_ds) view.file_open_by_name(fname) view.refresh_cb() self.destroy() del ds del res_ds del outarray