Statistics
| Revision:

gvsig-gdal / trunk / org.gvsig.gdal2 / org.gvsig.gdal2.prov / org.gvsig.gdal2.prov.raster.legend / src / main / java / org / gvsig / raster / gdal / provider / legend / RasterGdalGetColorTable.java @ 370

History | View | Annotate | Download (5.5 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

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

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

    
31
    private static Integer code = null;
32

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

    
40
    }
41

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

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

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

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

    
62

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

    
67
            Dataset gdalDataSet = rasterGdalProvider.getGdalDataSet();
68

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

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

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

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

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