Statistics
| Revision:

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

History | View | Annotate | Download (5.97 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.swing.infobypoint.InfoByPointDataModel;
41
import org.gvsig.raster.tools.app.basic.tool.selectrasterlayer.SelectImageListImpl;
42

    
43
/**
44
 * This tool writes in InfoByPointDataModel the information about the selected point.
45
 * 
46
 * @author Nacho Brodin (nachobrodin@gmail.com)
47
 */
48
public class InfoByPixelPointViewTool extends SelectImageListImpl {
49
        private RasterManager            rManager            = RasterLocator.getManager();
50
        private InfoByPointDataModel     model               = null;
51
        private ColorConversion          conv                = null;
52
        private ViewPort                 viewPort            = null;
53
        private FLayers                  layers              = null;
54
        private List<String>             list                = null;
55
        
56
        /**
57
         * Contructor
58
         * @param mapCtrl
59
         */
60
        public InfoByPixelPointViewTool(MapControl mapCtrl, InfoByPointDataModel model) {
61
                super(mapCtrl);
62
                this.model = model;
63
                conv = rManager.getColorConversion();
64
                viewPort = mapCtrl.getViewPort();
65
                layers = mapCtrl.getMapContext().getLayers();
66
                list = new ArrayList<String>();
67
        }
68

    
69
        @SuppressWarnings("deprecation")
70
        public void point(PointEvent event) {
71
                super.point(event);
72

    
73
                Point2D point2D = event.getPoint();
74

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

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