Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.gdal / org.gvsig.raster.gdal.provider.legend / src / main / java / org / gvsig / raster / gdal / provider / legend / RasterGdalGetColorTable.java @ 6336

History | View | Annotate | Download (5.44 KB)

1
package org.gvsig.raster.gdal.provider.legend;
2

    
3
import java.awt.Color;
4
import java.util.ArrayList;
5
import java.util.List;
6

    
7
import org.gdal.gdal.Band;
8
import org.gdal.gdal.Dataset;
9
import org.gvsig.fmap.dal.raster.api.RasterStore;
10
import org.gvsig.raster.gdal.provider.AbstractRasterGdalStoreProvider;
11
import org.gvsig.raster.lib.legend.api.ColorInterpretation;
12
import org.gvsig.raster.lib.legend.api.ColorTable;
13
import org.gvsig.raster.lib.legend.api.ColorTableClass;
14
import org.gvsig.raster.lib.legend.api.RasterLegendLocator;
15
import org.gvsig.raster.lib.legend.api.RasterLegendManager;
16
import org.gvsig.tools.ToolsLocator;
17
import org.gvsig.tools.dynobject.DynClass;
18
import org.gvsig.tools.dynobject.DynMethod;
19
import org.gvsig.tools.dynobject.DynObject;
20
import org.gvsig.tools.dynobject.exception.DynMethodException;
21
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
22

    
23
/**
24
 * Dynamic method to add a get Color Table funcionality
25
 * @author dmartinezizquierdo
26
 *
27
 */
28
public class RasterGdalGetColorTable implements DynMethod {
29

    
30
    private static Integer code = null;
31

    
32
    static void register(DynClass storeClass) {
33
        if (code != null) {
34
            return;
35
        }
36
        code = ToolsLocator.getDynObjectManager()
37
                .registerDynMethod(storeClass, new RasterGdalGetColorTable());
38

    
39
    }
40

    
41
    @Override
42
    public int getCode() throws DynMethodNotSupportedException {
43
        return code;
44
    }
45

    
46
    @Override
47
    public String getDescription() {
48
        return "Raster GDAL Color Table";
49
    }
50

    
51
    @Override
52
    public String getName() {
53
        return RasterStore.DYNMETHOD_GETCOLORTABLE_NAME;
54
    }
55

    
56
    @Override
57
    public Object invoke(DynObject self, Object[] args)
58
        throws DynMethodException {
59
        ColorTable colorTable = null;
60

    
61

    
62
        try {
63
            AbstractRasterGdalStoreProvider rasterGdalProvider=(AbstractRasterGdalStoreProvider)self;
64
            RasterLegendManager legendManager=RasterLegendLocator.getRasterLegendManager();
65

    
66
            Dataset gdalDataSet = rasterGdalProvider.getGdalDataSet();
67

    
68
            ColorInterpretation colorInterpretation =(ColorInterpretation)rasterGdalProvider.
69
                invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORINTERPRETATION_NAME, null);
70
            for (int bandNumber = 1; bandNumber <= gdalDataSet.getRasterCount(); bandNumber++) {
71
                //Band in GDAL begins in 1, meanwhile we begin in 0
72
                int indexColorInterpretation=bandNumber-1;
73
                if (ColorInterpretation.PALETTE_BAND.equals(colorInterpretation.get(indexColorInterpretation))){
74
                    Band gdalBand=gdalDataSet.GetRasterBand(bandNumber);
75
                    org.gdal.gdal.ColorTable gdalBandColorTable = gdalBand.GetColorTable();
76
                    if (gdalBandColorTable!=null){
77
                        List<ColorTableClass> colorTableClasses=new ArrayList<ColorTableClass>();
78

    
79
                        for (int i=0;i<gdalBandColorTable.GetCount();i++){
80
                            String className=i+"";
81
                            double value=((byte)i);
82
                            double interpolation=50.0;
83
                            Color color=gdalBandColorTable.GetColorEntry(i);
84
                            ColorTableClass colorTableClass = legendManager.createColorTableClass(className, value, interpolation, color);
85
                            colorTableClasses.add(colorTableClass);
86
                        }
87
                        String colorTableName = rasterGdalProvider.getName() + "_color_table";
88
                        colorTable = legendManager.createColorTable(colorTableName,
89
                            colorTableClasses, true);
90
                        //FIXME: De momento devolvemos el primero solo.
91
                        return colorTable;
92
                    }
93
                    else {
94
                        List<ColorTableClass> colorTableClasses=new ArrayList<ColorTableClass>();
95
                        double[] minMax=new double[2];
96
                        gdalBand.ComputeRasterMinMax(minMax);
97
                        Double increment=(minMax[1]-minMax[0])/256;
98

    
99
                        for (int i=0;i<255;i++){
100
                            String className=i+"";
101
                            double value=((minMax[0]+(i*increment)));
102
                            double interpolation=50.0;
103
                            int intARGB = ((i & 0xFF) << 24) | // alpha
104
                                ((i & 0xFF) << 16) | // red
105
                                ((i & 0xFF) << 8) | // green
106
                                ((i & 0xFF) << 0); // blue
107
                            Color color=new Color(intARGB);
108
                            ColorTableClass colorTableClass = legendManager.createColorTableClass(className, value, interpolation, color);
109
                            colorTableClasses.add(colorTableClass);
110
                        }
111
                        String colorTableName = rasterGdalProvider.getName() + "_color_table";
112
                        colorTable = legendManager.createColorTable(colorTableName,
113
                            colorTableClasses, true);
114
                        //FIXME: De momento devolvemos el primero solo.
115
                        return colorTable;
116
                    }
117
                }
118

    
119
            }
120
       } catch (DynMethodNotSupportedException e) {
121
           //FIXME
122
           throw new RuntimeException(e);
123
       }
124
       return null;
125
    }
126

    
127
    @Override
128
    public Object clone() throws CloneNotSupportedException {
129
        return super.clone();
130
    }
131
}