Revision 3102 trunk/extensions/extGeoreferencing/src/com/iver/cit/gvsig/fmap/layers/FLyrPoints.java
FLyrPoints.java | ||
---|---|---|
41 | 41 |
package com.iver.cit.gvsig.fmap.layers; |
42 | 42 |
|
43 | 43 |
import java.awt.Color; |
44 |
import java.awt.Dimension; |
|
44 | 45 |
import java.awt.Graphics2D; |
45 | 46 |
import java.awt.geom.Point2D; |
46 | 47 |
import java.awt.geom.Rectangle2D; |
... | ... | |
71 | 72 |
*/ |
72 | 73 |
public class FLyrPoints extends FLyrDefault { |
73 | 74 |
|
75 |
/** |
|
76 |
* Punto de la capa que representa una coordenada en pixeles de la imagen a |
|
77 |
* georreferenciar, una coordenada de la vista, el viewPort de las mini imagenes |
|
78 |
* ,el centro de estas y el flag activo que dice si el punto tiene que ser tomado en |
|
79 |
* cuenta o no. |
|
80 |
* @author Nacho Brodin (brodin_ign@gva.es) |
|
81 |
* |
|
82 |
*/ |
|
74 | 83 |
public class GeoPoint{ |
75 | 84 |
public Point2D pixelPoint = null; |
76 | 85 |
public Point2D mapPoint = null; |
77 | 86 |
public ViewPort leftViewPort = null, rightViewPort = null; |
78 | 87 |
public Point2D leftCenterPoint = null, rightCenterPoint = null; |
88 |
public boolean active = true; |
|
79 | 89 |
public GeoPoint(Point2D p, Point2D m){ |
80 | 90 |
this.pixelPoint = p; |
81 | 91 |
this.mapPoint = m; |
82 | 92 |
} |
93 |
|
|
94 |
/** |
|
95 |
* Hace una copia de la instancia del punto. |
|
96 |
* @return GeoPoint |
|
97 |
*/ |
|
98 |
public GeoPoint cloneGeoPoint(){ |
|
99 |
Point2D pixel = null; |
|
100 |
Point2D map = null; |
|
101 |
if(pixelPoint != null) |
|
102 |
pixel = (Point2D)pixelPoint.clone(); |
|
103 |
if(mapPoint != null) |
|
104 |
map = (Point2D)mapPoint.clone(); |
|
105 |
|
|
106 |
GeoPoint gp = new GeoPoint(pixel, map); |
|
107 |
|
|
108 |
if(leftViewPort != null){ |
|
109 |
gp.leftViewPort = new ViewPort(leftViewPort.getProjection()); |
|
110 |
gp.leftViewPort.setExtent((Rectangle2D)leftViewPort.getExtent().clone()); |
|
111 |
gp.leftViewPort.setImageSize((Dimension)leftViewPort.getImageSize().clone()); |
|
112 |
gp.leftViewPort.setScale(); |
|
113 |
} |
|
114 |
|
|
115 |
if(rightViewPort != null){ |
|
116 |
gp.rightViewPort = new ViewPort(rightViewPort.getProjection()); |
|
117 |
gp.rightViewPort.setExtent((Rectangle2D)rightViewPort.getExtent().clone()); |
|
118 |
gp.rightViewPort.setImageSize((Dimension)rightViewPort.getImageSize().clone()); |
|
119 |
gp.rightViewPort.setScale(); |
|
120 |
} |
|
121 |
|
|
122 |
if(leftCenterPoint != null) |
|
123 |
gp.leftCenterPoint = (Point2D)this.leftCenterPoint.clone(); |
|
124 |
if(rightCenterPoint != null) |
|
125 |
gp.rightCenterPoint = (Point2D)this.rightCenterPoint.clone(); |
|
126 |
gp.active = this.active; |
|
127 |
return gp; |
|
128 |
} |
|
83 | 129 |
|
84 | 130 |
} |
85 | 131 |
|
132 |
/** |
|
133 |
* Estado de la capa de puntos. |
|
134 |
* @author Nacho Brodin (brodin_ign@gva.es) |
|
135 |
* |
|
136 |
*/ |
|
137 |
public class FLyrPointsState{ |
|
138 |
public ArrayList pointList = new ArrayList(); |
|
139 |
public boolean showNumber = true; |
|
140 |
public String lastTool = "zoomIn"; |
|
141 |
} |
|
142 |
|
|
86 | 143 |
private ArrayList pointList = new ArrayList(); |
87 | 144 |
private final int DIAM_CIRCLE = 18; |
88 |
private String lastTool = null; |
|
145 |
private String lastTool = "zoomIn"; |
|
146 |
private boolean showNumber = true; |
|
147 |
private FLyrPointsState state = null; |
|
89 | 148 |
|
90 | 149 |
/** |
91 | 150 |
* Obtiene el array de puntos |
... | ... | |
96 | 155 |
} |
97 | 156 |
|
98 | 157 |
/** |
158 |
* Salva el estado actual de la capa de puntos. Podr? ser recuperado |
|
159 |
* este ?ltimo estado salvado con la funci?n recoveryState |
|
160 |
* |
|
161 |
*/ |
|
162 |
public void saveState(){ |
|
163 |
if(state == null) |
|
164 |
state = new FLyrPointsState(); |
|
165 |
else |
|
166 |
state.pointList.clear(); |
|
167 |
|
|
168 |
for(int i=0;i<pointList.size();i++) |
|
169 |
state.pointList.add(((GeoPoint)pointList.get(i)).cloneGeoPoint()); |
|
170 |
|
|
171 |
state.showNumber = showNumber; |
|
172 |
state.lastTool = lastTool; |
|
173 |
} |
|
174 |
|
|
175 |
/** |
|
176 |
* Recupera el estado de la capa de puntos desde la ?ltima vez que se |
|
177 |
* ejecut? la funci?n saveState. Si no hay ning?n estdo salvado es que |
|
178 |
* al principio estaba la capa vacia por lo que reiniciamos la capa de puntos. |
|
179 |
*/ |
|
180 |
public void recoveryState(){ |
|
181 |
if(state != null){ |
|
182 |
pointList.clear(); |
|
183 |
for(int i=0;i<state.pointList.size();i++) |
|
184 |
pointList.add(((GeoPoint)state.pointList.get(i)).cloneGeoPoint()); |
|
185 |
|
|
186 |
showNumber = state.showNumber; |
|
187 |
lastTool = state.lastTool; |
|
188 |
}else{ |
|
189 |
pointList = new ArrayList(); |
|
190 |
showNumber = true; |
|
191 |
lastTool = "zoomIn"; |
|
192 |
state = null; |
|
193 |
} |
|
194 |
} |
|
195 |
|
|
196 |
/** |
|
99 | 197 |
* Asigna el array de puntos |
100 | 198 |
* @param list |
101 | 199 |
*/ |
... | ... | |
109 | 207 |
*/ |
110 | 208 |
public void draw(BufferedImage image, Graphics2D g, ViewPort vp, |
111 | 209 |
Cancellable cancel,double scale) throws DriverException { |
210 |
|
|
112 | 211 |
View theView = (View) PluginServices.getMDIManager().getActiveView(); |
113 | 212 |
//BufferedImage img = theView.getMapControl().getImage(); |
114 | 213 |
//g.drawImage(img, 0, 0, null); |
... | ... | |
132 | 231 |
//Punto de la imagen |
133 | 232 |
pto = ((GeoPoint)pointList.get(i)).pixelPoint; |
134 | 233 |
|
135 |
if(pto != null){ |
|
136 |
Point2D p = lyrGeoRaster.img2World(pto); |
|
137 |
p = vp.fromMapPoint(p); |
|
138 |
drawPixelCrux(g, p); |
|
234 |
if(((GeoPoint)pointList.get(i)).active){ |
|
235 |
if(pto != null){ |
|
236 |
Point2D p = lyrGeoRaster.img2World(pto); |
|
237 |
p = vp.fromMapPoint(p); |
|
238 |
drawPixelCrux(g, p, i); |
|
239 |
|
|
240 |
} |
|
139 | 241 |
|
242 |
//Punto de la vista |
|
243 |
pto = ((GeoPoint)pointList.get(i)).mapPoint; |
|
244 |
if(pto != null){ |
|
245 |
Point2D p = vp.fromMapPoint(pto); |
|
246 |
drawMapCrux(g, p, i); |
|
247 |
} |
|
140 | 248 |
} |
141 |
|
|
142 |
//Punto de la vista |
|
143 |
pto = ((GeoPoint)pointList.get(i)).mapPoint; |
|
144 |
if(pto != null){ |
|
145 |
Point2D p = vp.fromMapPoint(pto); |
|
146 |
drawMapCrux(g, p); |
|
147 |
} |
|
148 | 249 |
} |
149 | 250 |
} |
150 | 251 |
} |
... | ... | |
154 | 255 |
* el pixel de la imagen. |
155 | 256 |
* @param g Graphics |
156 | 257 |
*/ |
157 |
private void drawPixelCrux(Graphics2D g, Point2D p){ |
|
258 |
private void drawPixelCrux(Graphics2D g, Point2D p, int pointNumber){
|
|
158 | 259 |
int dpto = (DIAM_CIRCLE >> 1); |
159 | 260 |
int incr = 5; |
160 | 261 |
g.setColor(Color.WHITE); |
... | ... | |
162 | 263 |
(int)p.getY() - dpto + 1, |
163 | 264 |
DIAM_CIRCLE - 2, |
164 | 265 |
DIAM_CIRCLE - 2); |
266 |
g.drawLine((int)p.getX() - incr, (int)p.getY() - 1, (int)p.getX() - 1, (int)p.getY() - 1); |
|
267 |
g.drawLine((int)p.getX() - incr, (int)p.getY() + 1, (int)p.getX() - 1, (int)p.getY() + 1); |
|
268 |
|
|
269 |
g.drawLine((int)p.getX() + incr, (int)p.getY() - 1, (int)p.getX() + 1, (int)p.getY() - 1); |
|
270 |
g.drawLine((int)p.getX() + incr, (int)p.getY() + 1, (int)p.getX() + 1, (int)p.getY() + 1); |
|
271 |
|
|
272 |
g.drawLine((int)p.getX() - 1, (int)p.getY() - incr, (int)p.getX() - 1, (int)p.getY() - 1); |
|
273 |
g.drawLine((int)p.getX() + 1, (int)p.getY() - incr, (int)p.getX() + 1, (int)p.getY() - 1); |
|
274 |
|
|
275 |
g.drawLine((int)p.getX() - 1, (int)p.getY() + incr, (int)p.getX() - 1, (int)p.getY() + 1); |
|
276 |
g.drawLine((int)p.getX() + 1, (int)p.getY() + incr, (int)p.getX() + 1, (int)p.getY() + 1); |
|
277 |
|
|
165 | 278 |
g.setColor(Color.red); |
166 | 279 |
g.drawOval( (int)p.getX() - dpto, |
167 | 280 |
(int)p.getY() - dpto, |
168 | 281 |
DIAM_CIRCLE, |
169 | 282 |
DIAM_CIRCLE); |
170 |
g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto , (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto + DIAM_CIRCLE); |
|
171 |
g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto + DIAM_CIRCLE, (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto); |
|
172 |
//g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto + 3, (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto + DIAM_CIRCLE - 3); |
|
173 |
//g.drawLine((int)p.getX() - dpto + 3, (int)p.getY() - dpto + DIAM_CIRCLE, (int)p.getX() - dpto + DIAM_CIRCLE - 3, (int)p.getY() - dpto); |
|
283 |
g.drawLine((int)p.getX(), (int)p.getY() - dpto - incr, (int)p.getX(), (int)p.getY() + dpto + incr); |
|
284 |
g.drawLine((int)p.getX() - dpto - incr, (int)p.getY(), (int)p.getX() + dpto + incr, (int)p.getY()); |
|
285 |
//g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto , (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto + DIAM_CIRCLE); |
|
286 |
//g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto + DIAM_CIRCLE, (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto); |
|
287 |
|
|
288 |
if(showNumber){ |
|
289 |
g.setColor(Color.WHITE); |
|
290 |
g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 4), (int)(p.getY() - dpto - 4) ); |
|
291 |
g.setColor(Color.red); |
|
292 |
g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 1), (int)(p.getY() - dpto - 1) ); |
|
293 |
} |
|
174 | 294 |
} |
175 | 295 |
|
176 | 296 |
/** |
... | ... | |
178 | 298 |
* la coordenada de la vista. |
179 | 299 |
* @param g Graphics |
180 | 300 |
*/ |
181 |
private void drawMapCrux(Graphics2D g, Point2D p){ |
|
301 |
private void drawMapCrux(Graphics2D g, Point2D p, int pointNumber){
|
|
182 | 302 |
int dpto = (DIAM_CIRCLE >> 1); |
183 | 303 |
int incr = 5; |
184 | 304 |
g.setColor(Color.WHITE); |
... | ... | |
205 | 325 |
DIAM_CIRCLE); |
206 | 326 |
g.drawLine((int)p.getX(), (int)p.getY() - dpto - incr, (int)p.getX(), (int)p.getY() + dpto + incr); |
207 | 327 |
g.drawLine((int)p.getX() - dpto - incr, (int)p.getY(), (int)p.getX() + dpto + incr, (int)p.getY()); |
328 |
if(showNumber){ |
|
329 |
g.setColor(Color.WHITE); |
|
330 |
g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 4), (int)(p.getY() - dpto - 4) ); |
|
331 |
g.setColor(new Color(45, 8 , 165)); |
|
332 |
g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 1), (int)(p.getY() - dpto - 1) ); |
|
333 |
} |
|
208 | 334 |
} |
209 | 335 |
|
210 | 336 |
/* (non-Javadoc) |
... | ... | |
302 | 428 |
else |
303 | 429 |
return 0; |
304 | 430 |
} |
305 |
|
|
431 |
|
|
306 | 432 |
/** |
433 |
* Activa o desactiva el punto de una posici?n de la lista |
|
434 |
* @param n N?mero de punto |
|
435 |
* @param active true activo, false desactivo |
|
436 |
*/ |
|
437 |
public void setPointActive(int n, boolean active){ |
|
438 |
if(n < 0 || n >= this.length()) |
|
439 |
return; |
|
440 |
((GeoPoint)pointList.get(n)).active = active; |
|
441 |
} |
|
442 |
|
|
443 |
/** |
|
444 |
* Dice si un punto de la lista est? activo o no |
|
445 |
* @param n Posici?n del punto |
|
446 |
* @return true si est? activo y false si no lo est?. |
|
447 |
*/ |
|
448 |
public boolean isPointActive(int n){ |
|
449 |
if(n < 0 || n >= this.length()) |
|
450 |
return false; |
|
451 |
return ((GeoPoint)pointList.get(n)).active; |
|
452 |
} |
|
453 |
|
|
454 |
/** |
|
307 | 455 |
* Obtiene el extent de la capa |
308 | 456 |
* @return extent en Rectangle2D. |
309 | 457 |
*/ |
... | ... | |
389 | 537 |
* @param panel donde se carga la informaci?n |
390 | 538 |
*/ |
391 | 539 |
public void loadVisualPoint(int pos, GeoreferencingDialog dialog){ |
392 |
GeoPoint pto = this.getPoint(pos); |
|
540 |
GeoPoint pto = null; |
|
541 |
try{ |
|
542 |
pto = this.getPoint(pos); |
|
543 |
}catch(ArrayIndexOutOfBoundsException exc){ |
|
544 |
//Todavia no hay puntos por lo que no hacemos nada |
|
545 |
return; |
|
546 |
} |
|
393 | 547 |
DataPointPanel dpp = dialog.getConectorPanel().getDataPointsTabPanel().getSelectPointsPanel().getDataPointPanel(); |
548 |
|
|
549 |
//Llenamos los JTextField con los valores del punto |
|
394 | 550 |
if(pto.pixelPoint != null){ |
395 | 551 |
dpp.getTX().setText(""+pto.pixelPoint.getX()); |
396 | 552 |
dpp.getTY().setText(""+pto.pixelPoint.getY()); |
... | ... | |
400 | 556 |
dpp.getLongitud().setText(tailDecimal(""+pto.mapPoint.getX())); |
401 | 557 |
} |
402 | 558 |
|
559 |
//El Checkbox de activaci?n |
|
560 |
dialog.getOptionsPanel().getCbActivePoint().setSelected(pto.active); |
|
561 |
|
|
403 | 562 |
//Seleccionamos la fila de la tabla |
404 | 563 |
PointTable table = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getJTable(); |
405 |
table.getTable().setRowSelectionInterval(pos, pos); |
|
564 |
try{ |
|
565 |
table.getTable().setRowSelectionInterval(pos, pos); |
|
566 |
}catch(IllegalArgumentException exc){ |
|
567 |
System.err.println("Intervalo erroneo "+pos); |
|
568 |
} |
|
406 | 569 |
|
407 | 570 |
//Cargamos las mini imagenes |
408 |
dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setCenterPoint(getCenterPoint(pos, false));
|
|
409 |
dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setNewViewPort(getMiniExtent(pos, false));
|
|
410 |
dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().draw();
|
|
571 |
dialog.getZoomControlLeft().setCenterPoint(getCenterPoint(pos, false));
|
|
572 |
dialog.getZoomControlLeft().setNewViewPort(getMiniExtent(pos, false));
|
|
573 |
dialog.getZoomControlLeft().draw();
|
|
411 | 574 |
|
412 |
dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().setCenterPoint(getCenterPoint(pos, true));
|
|
413 |
dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().setNewViewPort(getMiniExtent(pos, true));
|
|
414 |
dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().draw();
|
|
575 |
dialog.getZoomControlRight().setCenterPoint(getCenterPoint(pos, true));
|
|
576 |
dialog.getZoomControlRight().setNewViewPort(getMiniExtent(pos, true));
|
|
577 |
dialog.getZoomControlRight().draw();
|
|
415 | 578 |
} |
416 | 579 |
|
417 | 580 |
/** |
... | ... | |
433 | 596 |
agp.getZoomRight().clear(); |
434 | 597 |
|
435 | 598 |
//Actualizamos la vista |
436 |
View theView = (View) PluginServices.getMDIManager().getActiveView(); |
|
437 |
theView.getMapControl().getMapContext().invalidate(); |
|
599 |
View theView = null; |
|
600 |
try{ |
|
601 |
theView = (View) PluginServices.getMDIManager().getActiveView(); |
|
602 |
theView.getMapControl().getMapContext().invalidate(); |
|
603 |
}catch(ClassCastException exc){ |
|
604 |
return; |
|
605 |
} |
|
438 | 606 |
} |
439 | 607 |
|
440 | 608 |
/** |
... | ... | |
446 | 614 |
remove(pos); |
447 | 615 |
|
448 | 616 |
//Actualiza los controles de tabla y selector |
617 |
grd.getSelectPointsPanel().getTableControlerPanel().setNItems(this.length()); |
|
449 | 618 |
grd.getConectorPanel().getDataPointsTabPanel(). |
450 |
getSelectPointsPanel().getTableControlerPanel().setNItems(this.length()); |
|
451 |
grd.getConectorPanel().getDataPointsTabPanel(). |
|
452 | 619 |
getTablePointsPanel().getTableControlerPanel().setNItems(this.length()); |
453 | 620 |
|
454 | 621 |
//Elimina la fila de la tabla y renumera los puntos |
... | ... | |
461 | 628 |
|
462 | 629 |
//Carga los puntos |
463 | 630 |
if(pos == 0){ |
464 |
grd.getConectorPanel().getDataPointsTabPanel().getSelectPointsPanel().getTableControlerPanel().setSelectedIndex(pos);
|
|
631 |
grd.getSelectPointsPanel().getTableControlerPanel().setSelectedIndex(pos); |
|
465 | 632 |
loadVisualPoint(pos, grd); |
466 | 633 |
}else{ |
467 | 634 |
grd.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getTableControlerPanel().setSelectedIndex(pos - 1); |
... | ... | |
469 | 636 |
} |
470 | 637 |
|
471 | 638 |
//Redibujamos la vista |
472 |
View theView = (View) PluginServices.getMDIManager().getActiveView(); |
|
473 |
theView.getMapControl().getMapContext().invalidate(); |
|
639 |
View theView = null; |
|
640 |
try{ |
|
641 |
theView = (View) PluginServices.getMDIManager().getActiveView(); |
|
642 |
theView.getMapControl().getMapContext().invalidate(); |
|
643 |
}catch(ClassCastException exc){ |
|
644 |
return; |
|
645 |
} |
|
474 | 646 |
} |
475 | 647 |
|
476 | 648 |
/** |
... | ... | |
488 | 660 |
System.out.println("PUNTO "+i+": NULL"); |
489 | 661 |
} |
490 | 662 |
} |
663 |
|
|
664 |
/** |
|
665 |
* @return Returns the showNumber. |
|
666 |
*/ |
|
667 |
public boolean isShowNumber() { |
|
668 |
return showNumber; |
|
669 |
} |
|
670 |
|
|
671 |
/** |
|
672 |
* @param showNumber The showNumber to set. |
|
673 |
*/ |
|
674 |
public void setShowNumber(boolean showNumber) { |
|
675 |
this.showNumber = showNumber; |
|
676 |
} |
|
491 | 677 |
} |
Also available in: Unified diff