예제 #1
0
    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()
예제 #2
0
    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()
예제 #3
0
    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()
예제 #4
0
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)) 
예제 #6
0
    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))
예제 #7
0
파일: gvapp.py 프로젝트: tomaszpg/PogodaTMC
    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()
예제 #9
0
    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
예제 #10
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()
예제 #11
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()
예제 #12
0
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()
예제 #13
0
    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)
예제 #14
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 = 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()
예제 #15
0
    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)
예제 #16
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
예제 #17
0
파일: gvcorecmds.py 프로젝트: Onjrew/OpenEV
    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
예제 #18
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