Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / infobypoint / viewtool / InfoByPixelPointViewTool.java @ 1169

History | View | Annotate | Download (5.86 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.app.basic.tool.infobypoint.viewtool;
23

    
24
import java.awt.geom.Point2D;
25
import java.awt.image.BufferedImage;
26
import java.util.ArrayList;
27
import java.util.List;
28

    
29
import org.gvsig.fmap.dal.coverage.RasterLocator;
30
import org.gvsig.fmap.dal.coverage.RasterManager;
31
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
32
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
33
import org.gvsig.fmap.dal.coverage.util.ColorConversion;
34
import org.gvsig.fmap.mapcontext.ViewPort;
35
import org.gvsig.fmap.mapcontext.layers.FLayer;
36
import org.gvsig.fmap.mapcontext.layers.FLayers;
37
import org.gvsig.fmap.mapcontrol.MapControl;
38
import org.gvsig.fmap.mapcontrol.tools.Events.PointEvent;
39
import org.gvsig.raster.fmap.layers.FLyrRaster;
40
import org.gvsig.raster.tools.app.basic.tool.infobypoint.gui.InfoByPointDataModel;
41
import org.gvsig.raster.tools.app.basic.tool.selectrasterlayer.SelectImageListImpl;
42

    
43
/**
44
 * Extensi?n de la clase SelectImageListenerImple de FMap. Esta clase permite
45
 * capturar el evento de la selecci?n de un punto RGB sobre la vista
46
 * 
47
 * 22/02/2008
48
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
49
 */
50
public class InfoByPixelPointViewTool extends SelectImageListImpl {
51
        private RasterManager            rManager            = RasterLocator.getManager();
52
        private InfoByPointDataModel     model               = null;
53
        private ColorConversion          conv                = null;
54
        private ViewPort                 viewPort            = null;
55
        private FLayers                  layers              = null;
56
        private List<String>             list                = null;
57
        
58
        /**
59
         * Contructor
60
         * @param mapCtrl
61
         */
62
        public InfoByPixelPointViewTool(MapControl mapCtrl, InfoByPointDataModel model) {
63
                super(mapCtrl);
64
                this.model = model;
65
                conv = rManager.getColorConversion();
66
                viewPort = mapCtrl.getViewPort();
67
                layers = mapCtrl.getMapContext().getLayers();
68
                list = new ArrayList<String>();
69
        }
70

    
71
        /* (non-Javadoc)
72
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.PointListener#point(com.iver.cit.gvsig.fmap.tools.Events.PointEvent)
73
         */
74
        @SuppressWarnings("deprecation")
75
        public void point(PointEvent event) {
76
                super.point(event);
77

    
78
                Point2D point2D = event.getPoint();
79

    
80
                BufferedImage image = mapCtrl.getImage();
81
                int value = image.getRGB((int) point2D.getX(), (int) point2D.getY());
82
                int r = (value >> 16) & 0xff;
83
                int g = (value >> 8) & 0xff;
84
                int b = value & 0xff;
85
                
86
                double[] cmyk = conv.RGBtoCMYK(r & 0xff, g & 0xff, b & 0xff, 1D);
87
                
88
                double[] hsl = conv.RGBtoHSL(r & 0xff, g & 0xff, b & 0xff);
89
                hsl[0] = (int)(255.0 * hsl[0] / 360.0 + 0.5);
90
                hsl[2] = (int) (hsl[2] * 255. + 0.5);
91
                hsl[1] = (int) (hsl[1] * 255. + 0.5);
92
                
93
                Point2D mapPoint = viewPort.toMapPoint(point2D);
94
                
95
                model.setARGB(r, g, b);
96
                model.setCMYK(cmyk);
97
                model.setHSL(hsl[0], hsl[1], hsl[2]);
98
                model.setViewPoint(point2D.getX(), point2D.getY());
99
                model.setWorldPoint(mapPoint.getX(), mapPoint.getY());
100
                
101
                //Raster dependent
102
                
103
                list.clear();
104
                FLyrRaster selected = null;
105
                for (int i = layers.getLayersCount() - 1; i >= 0; i--) {
106
                        FLayer lyr = layers.getLayer(i);
107
                        if(lyr instanceof FLyrRaster) {
108
                                FLyrRaster raster = (FLyrRaster)lyr;
109
                                if(raster.isInside(mapPoint)) {
110
                                        list.add(raster.getName());
111
                                        if(raster.isActive())
112
                                                selected = raster;
113
                                }
114
                        }
115
                }
116
                
117
                if(selected != null) {
118
                        Point2D rasterPoint = selected.getDataStore().worldToRaster(mapPoint);
119
                        model.setNumberOfBands(selected.getDataStore().getBandCount());
120
                        model.setBandValues(getBandValues(selected.getDataStore(), rasterPoint));
121
                        model.setPixelPoint(rasterPoint.getX(), rasterPoint.getY());
122
                } else {
123
                        list.clear();
124
                        list.add("...");
125
                        model.setNumberOfBands(0);
126
                        model.setBandValues(new double[]{Double.NaN});
127
                        model.setPixelPoint(-1, -1);
128
                }
129
                model.setLayerList(list);
130
                
131
                model.notifyObservers();
132
        }
133
        
134
        /**
135
         * Loads the values of a pixel point
136
         * @param dataStore
137
         * @param pxPoint
138
         * @return
139
         */
140
        private double[] getBandValues(RasterDataStore dataStore, Point2D pxPoint) {
141
                double[] res = new double[dataStore.getBandCount()];
142
                int pos = 0;
143
                try {
144
                        if(dataStore.getDataType()[0] >= 0 && dataStore.getDataType()[0] <= 3) {
145
                                for(int i = 0; i < dataStore.getBandCount(); i++) {
146
                                        int val = ((Integer)dataStore.getData((int)pxPoint.getX(), (int)pxPoint.getY(), i)).intValue();
147
                                        if(dataStore.getDataType()[0] == Buffer.TYPE_BYTE)
148
                                                res[pos] = (val & 0x000000ff);
149
                                        else
150
                                                res[pos] = val;
151
                                        pos ++;
152
                                }
153
                        }
154

    
155
                        if(dataStore.getDataType()[0] == 4) {
156
                                for(int i = 0; i < dataStore.getBandCount(); i++) {
157
                                        res[pos] = ((Float)dataStore.getData((int)pxPoint.getX(), (int)pxPoint.getY(), i)).doubleValue() ;
158
                                        pos ++;
159
                                }
160
                        }
161
                        if(dataStore.getDataType()[0] == 5) {
162
                                for(int i = 0; i < dataStore.getBandCount(); i++) {
163
                                        res[pos] = ((Double)dataStore.getData((int)pxPoint.getX(), (int)pxPoint.getY(), i)).doubleValue();
164
                                        pos ++;
165
                                }
166
                        }
167
                        return res;
168
                } catch (Exception e) {
169
                        for (int i = 0; i < dataStore.getBandCount(); i++) {
170
                                res[i] = Double.NaN;
171
                        }
172
                } 
173
                return res;
174
        }
175
}