Statistics
| Revision:

gvsig-raster / org.gvsig.raster.georeferencing / trunk / org.gvsig.raster.georeferencing / org.gvsig.raster.georeferencing.swing / org.gvsig.raster.georeferencing.swing.impl / src / main / java / org / gvsig / raster / georeferencing / swing / impl / option / CellSizeDialog.java @ 1752

History | View | Annotate | Download (6.04 KB)

1
package org.gvsig.raster.georeferencing.swing.impl.option;
2

    
3
import java.awt.Color;
4
import java.awt.GridBagConstraints;
5
import java.awt.GridBagLayout;
6
import java.beans.PropertyChangeEvent;
7
import java.beans.PropertyChangeListener;
8
import java.util.EventObject;
9
import java.util.HashMap;
10

    
11
import javax.swing.JLabel;
12
import javax.swing.JPanel;
13

    
14
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
15
import org.gvsig.gui.beans.datainput.DataInputContainerListener;
16
import org.gvsig.i18n.Messages;
17
import org.gvsig.raster.georeferencing.GeoreferencingLibrary;
18
import org.gvsig.raster.georeferencing.Geotransformation;
19
import org.gvsig.raster.georeferencing.swing.model.GeoreferencingOptionsDataModel;
20
import org.gvsig.raster.swing.basepanel.AbstractButtonsPanel;
21
import org.gvsig.raster.swing.basepanel.ButtonsPanelListener;
22
import org.gvsig.raster.swing.impl.basepanel.ButtonsPanel;
23
import org.gvsig.raster.tools.algorithm.base.RasterBaseAlgorithmLibrary;
24
import org.gvsig.raster.tools.algorithm.base.process.ProcessException;
25
import org.gvsig.raster.tools.algorithm.base.process.RasterProcess;
26

    
27
/**
28
 * @author Nacho Brodin (nachobrodin@gmail.com)
29
 */
30
public class CellSizeDialog extends AbstractButtonsPanel implements DataInputContainerListener, PropertyChangeListener {
31
        private static final long              serialVersionUID   = 1L;
32
        private CellSizeOptionsPanel           cellSizePanel      = null;
33
        private JPanel                         panel              = null;
34
        private JLabel                         labelText          = null;
35
        private JLabel                         xsizeText          = null;
36
        private JLabel                         ysizeText          = null;
37
        private GeoreferencingOptionsDataModel dataModel          = null;
38
        
39
        public CellSizeDialog(GeoreferencingOptionsDataModel dataModel, ButtonsPanelListener listener) {
40
                this.dataModel = dataModel;
41
                getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setVisible(false);
42
                getButtonsPanel().addButtonPressedListener(listener);
43
                init();
44
                if(dataModel != null) {
45
                        calculateTransformation();
46
                }
47
        }
48
        
49
        /**
50
         * Acciones de inicializaci?n del panel
51
         */
52
        public void init() {
53
                labelText = new JLabel(Messages.getText("recomended_size"));
54
                xsizeText = new JLabel("X:- px");
55
                ysizeText = new JLabel("Y:- px");
56
                xsizeText.setForeground(Color.red);
57
                ysizeText.setForeground(Color.red);
58
                
59
                GridBagLayout gl = new GridBagLayout();
60
                setLayout(gl);
61
                
62
                GridBagConstraints gbc = new GridBagConstraints();
63
                gbc.weightx = 1.0;
64
                gbc.weighty = 0;
65
                gbc.fill = GridBagConstraints.HORIZONTAL;
66
                
67
                gbc.gridy = 1;
68
                add(getCellSizePanel(), gbc);
69
                
70
                gbc.gridy = 2;
71
                add(getPanel(), gbc);
72
        }
73
        
74
        public CellSizeOptionsPanel getCellSizePanel() {
75
                if(cellSizePanel == null) {
76
                        cellSizePanel = new CellSizeOptionsPanel();
77
                        cellSizePanel.getXCellSizeTextField().setListener(this);
78
                        cellSizePanel.getYCellSizeTextField().setListener(this);
79
                }
80
                return cellSizePanel;
81
        }
82
        
83
        public JPanel getPanel() {
84
                if(panel == null) {
85
                        panel = new JPanel(new GridBagLayout());
86
                        
87
                        GridBagConstraints gbc = new GridBagConstraints();
88
                        gbc.weightx = 1.0;
89
                        gbc.weighty = 0;
90
                        gbc.fill = GridBagConstraints.HORIZONTAL;
91
                        
92
                        gbc.gridy = 1;
93
                        panel.add(labelText, gbc);
94
                        
95
                        gbc.gridy = 2;
96
                        panel.add(xsizeText, gbc);
97
                        
98
                        gbc.gridy = 3;
99
                        panel.add(ysizeText, gbc);
100
                }
101
                return panel;
102
        }
103

    
104
        public void actionValueChanged(EventObject e) {
105
                calculateTransformation();
106
        }
107
        
108
        public void propertyChange(PropertyChangeEvent evt) {
109
                if(evt.getPropertyName().equals("value")) 
110
                        calculateTransformation();
111
        }
112
        
113
        @SuppressWarnings("unchecked")
114
        private void calculateTransformation() {
115
                if(dataModel == null)
116
                        return;
117
                
118
                double xCellSize = 0;
119
                double yCellSize = 0;
120
                String cs1 = getCellSizePanel().getXCellSizeTextField().getValue();
121
                String cs2 = getCellSizePanel().getYCellSizeTextField().getValue();
122
                try {
123
                        xCellSize = Double.valueOf(cs1);
124
                        yCellSize = Double.valueOf(cs2);
125
                } catch (NumberFormatException e) {
126
                        xsizeText.setText("X: ? px");
127
                        ysizeText.setText("Y: ? px");
128
                        return;
129
                }
130
                
131
                try {
132
                        RasterProcess transform = RasterBaseAlgorithmLibrary.getManager().createRasterTask(GeoreferencingLibrary.GEOTRANSFORM_PROCESS_LABEL);
133
                        transform.addParam("gcps", dataModel.getGCPList().getGeoPointList());
134
                        transform.addParam("Order", new Integer(dataModel.getDegree()));
135
                        transform.execute();
136
                        int w = (int)dataModel.getDataStore().getWidth();
137
                        int h = (int)dataModel.getDataStore().getHeight();
138
                        HashMap<String, Object> map = (HashMap<String, Object>)transform.getResult();
139
                        Geotransformation gt = (Geotransformation)map.get("RESULT");
140
                        
141
                        // Obtenida la transformacion la aplicamos a los puntos extremos de la imagen
142
                        double p1[] = gt.getCoordMap(0, 0);                
143
                        double p2[] = gt.getCoordMap(w, 0);                
144
                        double p3[] = gt.getCoordMap(0, h);
145
                        double p4[] = gt.getCoordMap(w, h);
146
                        
147
                        double xmin = Math.min(Math.min(p1[0], p3[0]), Math.min(p2[0], p4[0]));
148
                        double ymin = Math.min(Math.min(p3[1], p4[1]), Math.min(p1[1], p2[1]));
149
                        double xmax = Math.max(Math.max(p2[0], p4[0]), Math.max(p1[0], p3[0]));        
150
                        double ymax = Math.max(Math.max(p1[1], p2[1]), Math.max(p3[1], p4[1]));
151
                        
152
                        if(xCellSize > 0 && yCellSize > 0) {
153
                                w = (int)((xmax - xmin) / xCellSize);
154
                                h = (int)((ymax - ymin) / yCellSize);
155
                        } else {
156
                                xCellSize = ((xmax - xmin) / w);
157
                                yCellSize = ((ymax - ymin) / h);
158
                                getCellSizePanel().getXCellSizeTextField().setValue(Double.toString(xCellSize));
159
                                getCellSizePanel().getYCellSizeTextField().setValue(Double.toString(yCellSize));
160
                        }
161
                        
162
                        if(dataModel.getAlgorithm() == GeoreferencingLibrary.AFFINE) {
163
                                xsizeText.setText("X: "+ (int)dataModel.getDataStore().getWidth() + " px (native)");
164
                                ysizeText.setText("Y: "+ (int)dataModel.getDataStore().getHeight() + " px (native)");
165
                        } else {
166
                                xsizeText.setText("X: " + w + " px");
167
                                ysizeText.setText("Y: " + h + " px");
168
                        }
169
                        dataModel.setXCellSize(xCellSize);
170
                        dataModel.setYCellSize(yCellSize);
171
                } catch (ProcessInterruptedException e) {
172
                } catch (ProcessException e) {
173
                        xsizeText.setText("X: ? px");
174
                        ysizeText.setText("Y: ? px");
175
                }
176
        }
177

    
178
}