svn-gvsig-desktop / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / edition / VectorialEditableAdapter.java @ 4193
History | View | Annotate | Download (25.5 KB)
1 | 3612 | fjp | /*
|
---|---|---|---|
2 | * Created on 12-ene-2006 by fjp
|
||
3 | *
|
||
4 | * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
||
5 | 3722 | caballero | *
|
6 | 3612 | fjp | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
7 | 3722 | caballero | *
|
8 | 3612 | fjp | * This program is free software; you can redistribute it and/or
|
9 | * modify it under the terms of the GNU General Public License
|
||
10 | * as published by the Free Software Foundation; either version 2
|
||
11 | * of the License, or (at your option) any later version.
|
||
12 | 3722 | caballero | *
|
13 | 3612 | fjp | * This program is distributed in the hope that it will be useful,
|
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
16 | * GNU General Public License for more details.
|
||
17 | 3722 | caballero | *
|
18 | 3612 | fjp | * You should have received a copy of the GNU General Public License
|
19 | * along with this program; if not, write to the Free Software
|
||
20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
21 | 3722 | caballero | *
|
22 | 3612 | fjp | * For more information, contact:
|
23 | *
|
||
24 | * Generalitat Valenciana
|
||
25 | * Conselleria d'Infraestructures i Transport
|
||
26 | * Av. Blasco Ib??ez, 50
|
||
27 | * 46010 VALENCIA
|
||
28 | * SPAIN
|
||
29 | *
|
||
30 | * +34 963862235
|
||
31 | * gvsig@gva.es
|
||
32 | * www.gvsig.gva.es
|
||
33 | 3722 | caballero | *
|
34 | 3612 | fjp | * or
|
35 | 3722 | caballero | *
|
36 | 3612 | fjp | * IVER T.I. S.A
|
37 | * Salamanca 50
|
||
38 | * 46005 Valencia
|
||
39 | * Spain
|
||
40 | 3722 | caballero | *
|
41 | 3612 | fjp | * +34 963163400
|
42 | * dac@iver.es
|
||
43 | */
|
||
44 | /* CVS MESSAGES:
|
||
45 | 3722 | caballero | *
|
46 | 3612 | fjp | * $Id$
|
47 | * $Log$
|
||
48 | 4193 | fjp | * Revision 1.33 2006-02-24 07:57:58 fjp
|
49 | * FUNCIONA!!! (Creo)
|
||
50 | *
|
||
51 | * Revision 1.32 2006/02/23 17:55:45 fjp
|
||
52 | 4147 | fjp | * Preparando para poder editar con el EditionManager
|
53 | *
|
||
54 | 4191 | fjp | * Revision 1.31 2006/02/21 16:44:08 fjp
|
55 | * Preparando para poder editar con el EditionManager
|
||
56 | *
|
||
57 | 4181 | fjp | * Revision 1.30 2006/02/20 18:14:59 fjp
|
58 | * Preparando para poder editar con el EditionManager
|
||
59 | *
|
||
60 | 4171 | fjp | * Revision 1.29 2006/02/20 10:32:54 fjp
|
61 | * Preparando para poder editar con el EditionManager
|
||
62 | *
|
||
63 | 4159 | fjp | * Revision 1.28 2006/02/17 13:40:03 fjp
|
64 | * Preparando para poder editar con el EditionManager
|
||
65 | *
|
||
66 | 4147 | fjp | * Revision 1.27 2006/02/17 10:41:14 fjp
|
67 | 4144 | fjp | * Evento de edici?n lanzado cuando una capa se pone en edici?n
|
68 | *
|
||
69 | * Revision 1.26 2006/02/17 08:21:19 fjp
|
||
70 | 4135 | fjp | * *** empty log message ***
|
71 | *
|
||
72 | * Revision 1.25 2006/02/16 09:38:10 fjp
|
||
73 | 4123 | fjp | * Preparando compatibilidad para bases de datos (y de paso, acelerando :-)
|
74 | *
|
||
75 | * Revision 1.24 2006/02/16 09:06:28 caballero
|
||
76 | 4120 | caballero | * commandStack
|
77 | *
|
||
78 | * Revision 1.23 2006/02/15 18:16:02 fjp
|
||
79 | 4085 | fjp | * POR TERMINAR
|
80 | *
|
||
81 | 4115 | fjp | * Revision 1.22 2006/02/13 18:18:31 fjp
|
82 | * POR TERMINAR
|
||
83 | *
|
||
84 | 4085 | fjp | * Revision 1.21 2006/02/10 13:28:23 caballero
|
85 | 4061 | caballero | * poder cambiar la selecci?n
|
86 | *
|
||
87 | * Revision 1.20 2006/02/09 13:11:54 caballero
|
||
88 | 4026 | caballero | * *** empty log message ***
|
89 | *
|
||
90 | * Revision 1.19 2006/02/08 16:45:29 caballero
|
||
91 | 4000 | caballero | * elimnar c?dio no usado
|
92 | *
|
||
93 | * Revision 1.18 2006/02/08 15:18:45 caballero
|
||
94 | 3996 | caballero | * control de las rows eliminadas
|
95 | *
|
||
96 | * Revision 1.17 2006/02/07 10:18:44 caballero
|
||
97 | 3980 | caballero | * Con BoundedShape
|
98 | *
|
||
99 | * Revision 1.16 2006/02/06 12:01:41 caballero
|
||
100 | 3958 | caballero | * driver del ova
|
101 | *
|
||
102 | * Revision 1.15 2006/02/03 14:09:32 fjp
|
||
103 | 3943 | fjp | * Preparando edici?n
|
104 | *
|
||
105 | 3952 | fjp | * Revision 1.14 2006/02/03 12:16:33 fjp
|
106 | * Preparando edici?n
|
||
107 | *
|
||
108 | 3943 | fjp | * Revision 1.13 2006/02/03 11:54:12 caballero
|
109 | 3940 | caballero | * tablas con vectorialEditableAdapter en edici?n
|
110 | 3936 | fjp | *
|
111 | * Revision 1.11 2006/01/31 08:10:05 caballero
|
||
112 | 3849 | caballero | * cambio de feature a row
|
113 | *
|
||
114 | * Revision 1.10 2006/01/30 08:18:14 caballero
|
||
115 | 3836 | caballero | * m?todos para deshacer y rehacer
|
116 | *
|
||
117 | * Revision 1.9 2006/01/23 17:30:28 caballero
|
||
118 | 3728 | caballero | * coger los datos del ova
|
119 | *
|
||
120 | * Revision 1.8 2006/01/23 16:16:16 caballero
|
||
121 | 3722 | caballero | * getRowIndex
|
122 | *
|
||
123 | * Revision 1.7 2006/01/20 08:37:10 fjp
|
||
124 | 3695 | fjp | * Preparando la edici?n
|
125 | *
|
||
126 | * Revision 1.6 2006/01/19 12:48:20 caballero
|
||
127 | 3688 | caballero | * poder modificar su vectorial Adapter
|
128 | *
|
||
129 | * Revision 1.5 2006/01/19 09:28:11 fjp
|
||
130 | 3686 | fjp | * Preparando la edici?n
|
131 | *
|
||
132 | * Revision 1.4 2006/01/17 10:24:02 fjp
|
||
133 | 3651 | fjp | * Preparando edici?n
|
134 | *
|
||
135 | 3653 | fjp | * Revision 1.3 2006/01/16 12:47:38 fjp
|
136 | * Preparando edici?n
|
||
137 | *
|
||
138 | 3652 | fjp | * Revision 1.2 2006/01/16 11:23:00 fjp
|
139 | * Preparando edici?n
|
||
140 | *
|
||
141 | 3651 | fjp | * Revision 1.1 2006/01/12 13:39:14 fjp
|
142 | 3612 | fjp | * preaparar edicion
|
143 | *
|
||
144 | *
|
||
145 | */
|
||
146 | package com.iver.cit.gvsig.fmap.edition; |
||
147 | |||
148 | import java.awt.geom.Rectangle2D; |
||
149 | import java.io.IOException; |
||
150 | 3722 | caballero | import java.util.List; |
151 | 3612 | fjp | |
152 | import com.hardcode.driverManager.DriverLoadException; |
||
153 | 3943 | fjp | import com.hardcode.gdbms.engine.data.DataSource; |
154 | import com.hardcode.gdbms.engine.values.Value; |
||
155 | 3940 | caballero | import com.iver.cit.gvsig.fmap.DriverException; |
156 | import com.iver.cit.gvsig.fmap.core.DefaultFeature; |
||
157 | 3980 | caballero | import com.iver.cit.gvsig.fmap.core.FShape; |
158 | 3612 | fjp | import com.iver.cit.gvsig.fmap.core.IFeature; |
159 | import com.iver.cit.gvsig.fmap.core.IGeometry; |
||
160 | 3652 | fjp | import com.iver.cit.gvsig.fmap.core.IRow; |
161 | 4159 | fjp | import com.iver.cit.gvsig.fmap.core.v02.FConverter; |
162 | 3980 | caballero | import com.iver.cit.gvsig.fmap.drivers.BoundedShapes; |
163 | 3940 | caballero | import com.iver.cit.gvsig.fmap.drivers.DriverAttributes; |
164 | 3612 | fjp | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
165 | 4085 | fjp | import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator; |
166 | 3940 | caballero | import com.iver.cit.gvsig.fmap.drivers.VectorialDriver; |
167 | 4061 | caballero | import com.iver.cit.gvsig.fmap.layers.FBitSet; |
168 | 3940 | caballero | import com.iver.cit.gvsig.fmap.layers.ReadableVectorial; |
169 | import com.iver.cit.gvsig.fmap.layers.SelectableDataSource; |
||
170 | 3612 | fjp | import com.iver.cit.gvsig.fmap.layers.VectorialAdapter; |
171 | 4085 | fjp | import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor; |
172 | 3652 | fjp | import com.vividsolutions.jts.geom.Envelope; |
173 | import com.vividsolutions.jts.index.quadtree.Quadtree; |
||
174 | 3612 | fjp | |
175 | /**
|
||
176 | * @author fjp
|
||
177 | 3722 | caballero | *
|
178 | 3612 | fjp | */
|
179 | 3980 | caballero | public class VectorialEditableAdapter extends EditableAdapter implements ReadableVectorial, BoundedShapes { |
180 | 4171 | fjp | protected VectorialAdapter ova;
|
181 | 3958 | caballero | //private VectorialDriver driver;
|
182 | 4159 | fjp | protected Quadtree index;
|
183 | 4115 | fjp | |
184 | |||
185 | /* private class MyFeatureIterator implements IFeatureIterator
|
||
186 | {
|
||
187 | int numReg = 0;
|
||
188 | Rectangle2D rect;
|
||
189 | String epsg;
|
||
190 | IFeatureIterator origFeatIt;
|
||
191 | boolean bHasNext = true;
|
||
192 | |||
193 | public MyFeatureIterator(Rectangle2D r, String strEPSG) throws DriverException
|
||
194 | {
|
||
195 | rect = r;
|
||
196 | epsg = strEPSG;
|
||
197 | origFeatIt = ova.getFeatureIterator(r, epsg);
|
||
198 | }
|
||
199 | public boolean hasNext() throws DriverException {
|
||
200 | return bHasNext;
|
||
201 | }
|
||
202 | |||
203 | public IFeature next() throws DriverException {
|
||
204 | IFeature aux = origFeatIt.next();
|
||
205 | return null;
|
||
206 | }
|
||
207 | |||
208 | public void closeIterator() throws DriverException {
|
||
209 | |||
210 | }
|
||
211 | |||
212 | } */
|
||
213 | |||
214 | 3940 | caballero | public VectorialEditableAdapter(){
|
215 | super();
|
||
216 | 3652 | fjp | } |
217 | 3940 | caballero | public void setOriginalVectorialAdapter(ReadableVectorial rv){ |
218 | ova=(VectorialAdapter)rv; |
||
219 | try {
|
||
220 | 3958 | caballero | setOriginalDataSource(rv.getRecordset()); |
221 | 3940 | caballero | } catch (DriverLoadException e) {
|
222 | // TODO Auto-generated catch block
|
||
223 | e.printStackTrace(); |
||
224 | 3652 | fjp | } |
225 | } |
||
226 | /*
|
||
227 | * (non-Javadoc)
|
||
228 | 3722 | caballero | *
|
229 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#start()
|
230 | */
|
||
231 | public void start() throws DriverIOException { |
||
232 | 3653 | fjp | ova.start(); |
233 | 3652 | fjp | } |
234 | |||
235 | /*
|
||
236 | * (non-Javadoc)
|
||
237 | 3722 | caballero | *
|
238 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#stop()
|
239 | */
|
||
240 | public void stop() throws DriverIOException { |
||
241 | 3653 | fjp | ova.stop(); |
242 | 3652 | fjp | } |
243 | |||
244 | /*
|
||
245 | * (non-Javadoc)
|
||
246 | 3722 | caballero | *
|
247 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShape(int)
|
248 | */
|
||
249 | public IGeometry getShape(int rowIndex) throws DriverIOException { |
||
250 | // Si no est? en el fichero de expansi?n
|
||
251 | 3996 | caballero | int calculatedIndex=getCalculatedIndex(rowIndex);
|
252 | Integer integer = new Integer(calculatedIndex); |
||
253 | 3652 | fjp | if (!relations.containsKey(integer)) {
|
254 | // Si ha sido eliminada
|
||
255 | 3996 | caballero | /*if (delRows.get(integer.intValue())) {
|
256 | 3652 | fjp | return null;
|
257 | 3996 | caballero | } else {*/
|
258 | return ova.getShape(calculatedIndex);
|
||
259 | //}
|
||
260 | 3652 | fjp | } else {
|
261 | int num = ((Integer) relations.get(integer)).intValue(); |
||
262 | 3722 | caballero | DefaultRowEdited feat; |
263 | 3652 | fjp | try {
|
264 | 3722 | caballero | feat = (DefaultRowEdited) expansionFile.getRow(num); |
265 | return ((IFeature)feat.getLinkedRow()).getGeometry().cloneGeometry();//getGeometry(); |
||
266 | 3652 | fjp | } catch (IOException e) { |
267 | e.printStackTrace(); |
||
268 | throw new DriverIOException(e); |
||
269 | } |
||
270 | } |
||
271 | |||
272 | } |
||
273 | |||
274 | /*
|
||
275 | * (non-Javadoc)
|
||
276 | 3722 | caballero | *
|
277 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShapeType()
|
278 | */
|
||
279 | public int getShapeType() throws DriverIOException { |
||
280 | 3653 | fjp | return ova.getShapeType();
|
281 | 3652 | fjp | } |
282 | 3940 | caballero | public VectorialAdapter getOriginalAdapter(){
|
283 | return ova;
|
||
284 | 3652 | fjp | } |
285 | 3940 | caballero | public VectorialDriver getDriver() {
|
286 | 3958 | caballero | return ova.getDriver();
|
287 | 3652 | fjp | } |
288 | 3940 | caballero | public void setDriver(VectorialDriver driver) { |
289 | 3958 | caballero | this.ova.setDriver(driver);
|
290 | 3652 | fjp | } |
291 | 3958 | caballero | public DriverAttributes getDriverAttributes(){
|
292 | return ova.getDriverAttributes();
|
||
293 | 3940 | caballero | } |
294 | 3652 | fjp | |
295 | 3940 | caballero | /**
|
296 | * DOCUMENT ME!
|
||
297 | *
|
||
298 | * @throws EditionException DOCUMENT ME!
|
||
299 | */
|
||
300 | public void startEdition() throws EditionException { |
||
301 | super.startEdition();
|
||
302 | 3652 | fjp | |
303 | 3940 | caballero | try {
|
304 | expansionFile.open(); |
||
305 | 3652 | fjp | |
306 | 3940 | caballero | // TODO: Si la capa dispone de un ?ndice espacial, hacer
|
307 | // algo aqu? para que se use ese ?ndice espacial.
|
||
308 | index = new Quadtree();
|
||
309 | 3653 | fjp | |
310 | 3940 | caballero | for (int i = 0; i < ova.getShapeCount(); i++) { |
311 | IGeometry g=null;
|
||
312 | 3653 | fjp | try {
|
313 | 3940 | caballero | g = ((DefaultFeature) ova.getFeature(i)).getGeometry(); |
314 | } catch (DriverException e1) {
|
||
315 | // TODO Auto-generated catch block
|
||
316 | e1.printStackTrace(); |
||
317 | 3653 | fjp | } |
318 | |||
319 | 3940 | caballero | if (g == null) { |
320 | continue;
|
||
321 | } |
||
322 | 3652 | fjp | |
323 | 3940 | caballero | Rectangle2D r = g.getBounds2D();
|
324 | Envelope e = new Envelope(r.getX(), r.getX() + r.getWidth(),
|
||
325 | r.getY(), r.getY() + r.getHeight()); |
||
326 | index.insert(e, new Integer(i)); |
||
327 | } |
||
328 | } catch (DriverIOException e) {
|
||
329 | throw new EditionException(e); |
||
330 | } catch (IOException e) { |
||
331 | throw new EditionException(e); |
||
332 | } |
||
333 | 3652 | fjp | |
334 | 3940 | caballero | System.err.println("Se han metido en el ?ndice " + |
335 | index.queryAll().size() + " geometr?as");
|
||
336 | } |
||
337 | 3652 | fjp | |
338 | 3940 | caballero | /* (non-Javadoc)
|
339 | * @see com.iver.cit.gvsig.fmap.edition.IEditableSource#getRow(int)
|
||
340 | */
|
||
341 | public IRowEdited getRow(int index) throws DriverIOException, IOException { |
||
342 | 4026 | caballero | int calculatedIndex=getCalculatedIndex(index);
|
343 | Integer integer = new Integer(calculatedIndex); |
||
344 | 3940 | caballero | //Si no est? en el fichero de expansi?n
|
345 | 4115 | fjp | DefaultRowEdited edRow=null;
|
346 | 3940 | caballero | if (!relations.containsKey(integer)) {
|
347 | 4115 | fjp | try {
|
348 | edRow = new DefaultRowEdited(ova.getFeature(calculatedIndex),
|
||
349 | DefaultRowEdited.STATUS_ORIGINAL, index); |
||
350 | 4135 | fjp | System.out.println("Piden la feature con ID= " + index); |
351 | 4147 | fjp | // Exception e = new Exception();
|
352 | // e.printStackTrace();
|
||
353 | 4115 | fjp | } catch (DriverException e) {
|
354 | // TODO Auto-generated catch block
|
||
355 | e.printStackTrace(); |
||
356 | } |
||
357 | 3652 | fjp | |
358 | 4115 | fjp | return edRow;
|
359 | 3940 | caballero | } else {
|
360 | int num = ((Integer) relations.get(integer)).intValue(); |
||
361 | 4115 | fjp | IRowEdited aux = expansionFile.getRow(num); |
362 | 4191 | fjp | edRow = new DefaultRowEdited(aux.getLinkedRow().cloneRow(), aux.getStatus(), index);
|
363 | 4115 | fjp | return edRow;
|
364 | 3940 | caballero | } |
365 | 4191 | fjp | } |
366 | 3940 | caballero | /**
|
367 | * Elimina una geometria. Si es una geometr?a original de la capa en
|
||
368 | * edici?n se marca como eliminada (haya sido modificada o no). Si es una
|
||
369 | * geometr?a a?adida posteriormente se invalida en el fichero de
|
||
370 | * expansi?n, para que una futura compactaci?n termine con ella.
|
||
371 | *
|
||
372 | * @param index ?ndice de la geometr?a.
|
||
373 | *
|
||
374 | * @throws DriverIOException
|
||
375 | * @throws IOException
|
||
376 | */
|
||
377 | 4191 | fjp | public IRow doRemoveRow(int index) throws DriverIOException, IOException { |
378 | 3996 | caballero | //Llega el calculatedIndex
|
379 | Integer integer = new Integer(index); |
||
380 | 3652 | fjp | |
381 | 3940 | caballero | IFeature feat = null;
|
382 | 3996 | caballero | delRows.set(index, true);
|
383 | 3940 | caballero | //Si la geometr?a no ha sido modificada
|
384 | if (!relations.containsKey(integer)) {
|
||
385 | 3996 | caballero | |
386 | 3940 | caballero | try {
|
387 | feat = (DefaultFeature) (ova.getFeature(index)); |
||
388 | } catch (DriverException e) {
|
||
389 | // TODO Auto-generated catch block
|
||
390 | e.printStackTrace(); |
||
391 | } |
||
392 | } else {
|
||
393 | int num = ((Integer) relations.get(integer)).intValue(); |
||
394 | feat = (IFeature) expansionFile.getRow(num).getLinkedRow(); |
||
395 | 3996 | caballero | //expansionFile.invalidateRow(num);
|
396 | 3653 | fjp | } |
397 | 3996 | caballero | System.err.println("Elimina una Row en la posici?n: " + index); |
398 | 3940 | caballero | //Se actualiza el ?ndice
|
399 | if (feat != null) { |
||
400 | Rectangle2D r = feat.getGeometry().getBounds2D();
|
||
401 | 3996 | caballero | boolean borrado=this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), |
402 | 3940 | caballero | r.getY(), r.getY() + r.getHeight()), new Integer(index)); |
403 | 3996 | caballero | System.out.println("Est? borrado : "+ borrado); |
404 | System.out.println("Index.lenght : "+ this.index.size()); |
||
405 | |||
406 | 3940 | caballero | } |
407 | 4120 | caballero | setSelection(new FBitSet());
|
408 | 4191 | fjp | return feat;
|
409 | 3940 | caballero | } |
410 | /**
|
||
411 | * Si se intenta modificar una geometr?a original de la capa en edici?n se
|
||
412 | * a?ade al fichero de expansi?n y se registra la posici?n en la que se
|
||
413 | * a?adi?. Si se intenta modificar una geometria que se encuentra en el
|
||
414 | * fichero de expansi?n (por ser nueva o original pero modificada) se
|
||
415 | * invoca el m?todo modifyGeometry y se actualiza el ?ndice de la
|
||
416 | * geometria en el fichero.
|
||
417 | *
|
||
418 | 4191 | fjp | * @param calculatedIndex DOCUMENT ME!
|
419 | 3940 | caballero | * @param feat DOCUMENT ME!
|
420 | *
|
||
421 | 4181 | fjp | * @return position inside ExpansionFile
|
422 | 3940 | caballero | *
|
423 | * @throws IOException
|
||
424 | * @throws DriverIOException
|
||
425 | */
|
||
426 | 4191 | fjp | public int doModifyRow(int calculatedIndex, IRow feat) |
427 | 3940 | caballero | throws IOException, DriverIOException { |
428 | 4191 | fjp | int posAnteriorInExpansionFile = -1; |
429 | Integer integer = new Integer(calculatedIndex); |
||
430 | 3652 | fjp | |
431 | 3940 | caballero | IFeature featAnt = null;
|
432 | 4191 | fjp | System.err.println("Modifica una Row en la posici?n: " + calculatedIndex); |
433 | 3940 | caballero | //Si la geometr?a no ha sido modificada
|
434 | if (!relations.containsKey(integer)) {
|
||
435 | 4191 | fjp | int newPosition = expansionFile.addRow(feat);
|
436 | relations.put(integer, new Integer(newPosition)); |
||
437 | 3652 | fjp | |
438 | 3940 | caballero | //Se actualiza el ?ndice espacial
|
439 | try {
|
||
440 | 4191 | fjp | featAnt = (DefaultFeature) (ova.getFeature(calculatedIndex)); |
441 | 3940 | caballero | } catch (DriverException e) {
|
442 | // TODO Auto-generated catch block
|
||
443 | e.printStackTrace(); |
||
444 | } |
||
445 | 3652 | fjp | |
446 | 3940 | caballero | Rectangle2D rAnt = featAnt.getGeometry().getBounds2D();
|
447 | Rectangle2D r = ((IFeature) feat).getGeometry().getBounds2D();
|
||
448 | this.index.remove(new Envelope(rAnt.getX(), |
||
449 | rAnt.getX() + rAnt.getWidth(), rAnt.getY(), |
||
450 | 4191 | fjp | rAnt.getY() + rAnt.getHeight()), new Integer(calculatedIndex)); |
451 | 3940 | caballero | this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), |
452 | 4191 | fjp | r.getY(), r.getY() + r.getHeight()), new Integer(calculatedIndex)); |
453 | 3940 | caballero | } else {
|
454 | //Obtenemos el ?ndice en el fichero de expansi?n
|
||
455 | int num = ((Integer) relations.get(integer)).intValue(); |
||
456 | 4191 | fjp | posAnteriorInExpansionFile = num; |
457 | 3653 | fjp | |
458 | 3940 | caballero | //Obtenemos la geometr?a para actualiza el ?ndice espacialposteriormente
|
459 | featAnt = (IFeature) expansionFile.getRow(num).getLinkedRow(); |
||
460 | 3652 | fjp | |
461 | 3940 | caballero | /*
|
462 | * Se modifica la geometr?a y nos guardamos el ?ndice dentro del fichero
|
||
463 | * de expansi?n en el que se encuentra la geometr?a modificada
|
||
464 | */
|
||
465 | num = expansionFile.modifyRow(num, feat); |
||
466 | 3652 | fjp | |
467 | 3940 | caballero | /*
|
468 | * Actualiza la relaci?n del ?ndice de la geometr?a al ?ndice en el fichero
|
||
469 | * de expansi?n.
|
||
470 | */
|
||
471 | relations.put(integer, new Integer(num)); |
||
472 | 3653 | fjp | |
473 | 3940 | caballero | //Se modifica el ?ndice espacial
|
474 | Rectangle2D rAnt = featAnt.getGeometry().getBounds2D();
|
||
475 | Rectangle2D r = ((IFeature) feat).getGeometry().getBounds2D();
|
||
476 | this.index.remove(new Envelope(rAnt.getX(), |
||
477 | rAnt.getX() + rAnt.getWidth(), rAnt.getY(), |
||
478 | 4191 | fjp | rAnt.getY() + rAnt.getHeight()), new Integer(calculatedIndex)); |
479 | 3940 | caballero | this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), |
480 | 4191 | fjp | r.getY(), r.getY() + r.getHeight()), new Integer(calculatedIndex)); |
481 | 3940 | caballero | } |
482 | 3652 | fjp | |
483 | 4191 | fjp | return posAnteriorInExpansionFile;
|
484 | 3940 | caballero | } |
485 | /**
|
||
486 | * Actualiza en el mapa de ?ndices, la posici?n en la que estaba la
|
||
487 | * geometr?a antes de ser modificada. Se marca como v?lida, en caso de que
|
||
488 | * fuera una modificaci?n de una geometr?a que estuviese en el fichero de
|
||
489 | * expansi?n antes de ser modificada y se pone el puntero de escritura del
|
||
490 | * expansion file a justo despues de la penultima geometr?a
|
||
491 | *
|
||
492 | * @param geometryIndex ?ndice de la geometr?a que se quiere deshacer su
|
||
493 | * modificaci?n
|
||
494 | * @param previousExpansionFileIndex ?ndice que ten?a antes la geometr?a en
|
||
495 | * el expansionFile. Si vale -1 quiere decir que es una
|
||
496 | * modificaci?n de una geometr?a original y por tanto no hay que
|
||
497 | * actualizar el mapa de indices sino eliminar su entrada.
|
||
498 | *
|
||
499 | * @throws IOException
|
||
500 | * @throws DriverIOException
|
||
501 | */
|
||
502 | public void undoModifyRow(int geometryIndex, int previousExpansionFileIndex) |
||
503 | throws IOException, DriverIOException { |
||
504 | 3996 | caballero | //Llega el CalculatedIndex
|
505 | /*
|
||
506 | 3940 | caballero | * Si la acci?n de modificar se realiz? sobre una geometr?a original
|
507 | */
|
||
508 | if (previousExpansionFileIndex == -1) { |
||
509 | //Se obtiene la geometr?a para actualizar el ?ndice
|
||
510 | IGeometry g = ((DefaultFeature) getRow(geometryIndex).getLinkedRow()).getGeometry(); |
||
511 | Rectangle2D r = g.getBounds2D();
|
||
512 | 3652 | fjp | |
513 | 3940 | caballero | //Se elimina de las relaciones y del fichero de expansi?n
|
514 | relations.remove(new Integer(geometryIndex)); |
||
515 | expansionFile.deleteLastRow(); |
||
516 | 3652 | fjp | |
517 | 3940 | caballero | //Se actualizan los ?ndices
|
518 | IGeometry gAnt = ((DefaultFeature) getRow(geometryIndex) |
||
519 | .getLinkedRow()).getGeometry(); |
||
520 | Rectangle2D rAnt = gAnt.getBounds2D();
|
||
521 | this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), |
||
522 | r.getY(), r.getY() + r.getHeight()), |
||
523 | new Integer(geometryIndex)); |
||
524 | this.index.insert(new Envelope(rAnt.getX(), |
||
525 | rAnt.getX() + rAnt.getWidth(), rAnt.getY(), |
||
526 | rAnt.getY() + rAnt.getHeight()), new Integer(geometryIndex)); |
||
527 | } else {
|
||
528 | //Se obtiene la geometr?a para actualizar el ?ndice
|
||
529 | IGeometry g = null;
|
||
530 | 4191 | fjp | int inverse = getInversedIndex(geometryIndex);
|
531 | g = ((DefaultFeature) getRow(inverse).getLinkedRow()).getGeometry(); |
||
532 | System.out.println("Actual: " + g.toString()); |
||
533 | 3652 | fjp | |
534 | 3940 | caballero | Rectangle2D r = g.getBounds2D();
|
535 | this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), |
||
536 | r.getY(), r.getY() + r.getHeight()), |
||
537 | new Integer(geometryIndex)); |
||
538 | 3652 | fjp | |
539 | 3940 | caballero | //Se actualiza la relaci?n de ?ndices
|
540 | //Integer integer = new Integer(geometryIndex);
|
||
541 | relations.put(new Integer(geometryIndex), |
||
542 | new Integer(previousExpansionFileIndex)); |
||
543 | 3652 | fjp | |
544 | 3940 | caballero | //Se recupera la geometr?a
|
545 | 3996 | caballero | //expansionFile.validateRow(previousExpansionFileIndex);
|
546 | 3652 | fjp | |
547 | 3940 | caballero | //Se actualizan los ?ndices
|
548 | 4191 | fjp | // g = ((IFeature) (expansionFile.getRow(previousExpansionFileIndex).getLinkedRow())).getGeometry();
|
549 | // System.out.println("Anterior a la que volvemos : " + g.toString());
|
||
550 | g = ((DefaultFeature) getRow(inverse).getLinkedRow()).getGeometry(); |
||
551 | 3940 | caballero | r = g.getBounds2D(); |
552 | this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), |
||
553 | r.getY(), r.getY() + r.getHeight()), |
||
554 | new Integer(geometryIndex)); |
||
555 | } |
||
556 | } |
||
557 | 3653 | fjp | |
558 | 3940 | caballero | /**
|
559 | * A?ade una geometria al fichero de expansi?n y guarda la correspondencia
|
||
560 | * en la tabla relations.
|
||
561 | *
|
||
562 | * @param feat geometr?a a guardar.
|
||
563 | *
|
||
564 | 4193 | fjp | * @return calculatedIndex
|
565 | 3940 | caballero | *
|
566 | * @throws DriverIOException
|
||
567 | * @throws IOException
|
||
568 | */
|
||
569 | public int doAddRow(IRow feat) throws DriverIOException, IOException { |
||
570 | 4193 | fjp | int calculatedIndex=super.doAddRow(feat); |
571 | 3940 | caballero | // Actualiza el ?ndice espacial
|
572 | 4061 | caballero | IGeometry g = ((IFeature)feat).getGeometry(); |
573 | 3940 | caballero | Rectangle2D r = g.getBounds2D();
|
574 | index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
|
||
575 | 4193 | fjp | r.getY() + r.getHeight()), new Integer(calculatedIndex)); |
576 | 3653 | fjp | |
577 | 4193 | fjp | return calculatedIndex;
|
578 | 3940 | caballero | } |
579 | /**
|
||
580 | * Se desmarca como invalidada en el fichero de expansion o como eliminada
|
||
581 | * en el fichero original
|
||
582 | *
|
||
583 | * @param index DOCUMENT ME!
|
||
584 | *
|
||
585 | * @throws IOException
|
||
586 | * @throws DriverIOException
|
||
587 | */
|
||
588 | public void undoRemoveRow(int index) throws IOException, DriverIOException { |
||
589 | super.undoRemoveRow(index);
|
||
590 | 3653 | fjp | |
591 | 3940 | caballero | IGeometry g = null;
|
592 | g = ((IFeature) getRow(index).getLinkedRow()).getGeometry(); |
||
593 | 3653 | fjp | |
594 | 3940 | caballero | Rectangle2D r = g.getBounds2D();
|
595 | this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), |
||
596 | r.getY(), r.getY() + r.getHeight()), new Integer(index)); |
||
597 | } |
||
598 | /**
|
||
599 | * Se elimina del final del fichero de expansi?n poniendo el puntero de
|
||
600 | * escritura apuntando al final de la pen?ltima geometr?a. Deber? quitar
|
||
601 | * la relaci?n del mapa de relaciones
|
||
602 | *
|
||
603 | * @param index ?ndice de la geometr?a que se a?adi?
|
||
604 | *
|
||
605 | * @throws DriverIOException
|
||
606 | * @throws IOException
|
||
607 | */
|
||
608 | 4191 | fjp | public void undoAddRow(int calculatedIndex) throws DriverIOException, IOException { |
609 | int inverse = getInversedIndex(calculatedIndex);
|
||
610 | IGeometry g = ((IFeature) getRow(inverse).getLinkedRow()).getGeometry(); |
||
611 | 3940 | caballero | Rectangle2D r = g.getBounds2D();
|
612 | this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), |
||
613 | 4191 | fjp | r.getY(), r.getY() + r.getHeight()), new Integer(calculatedIndex)); |
614 | 3653 | fjp | |
615 | 4191 | fjp | super.undoAddRow(calculatedIndex);
|
616 | 4120 | caballero | setSelection(new FBitSet());
|
617 | 3940 | caballero | } |
618 | /**
|
||
619 | * Obtiene las geometr?as que se encuentran en el rect?ngulo que se pasa
|
||
620 | * como par?metro haciendo uso del ?ndice espacial
|
||
621 | *
|
||
622 | * @param r Rect?ngulo indicando la porci?n del espacio para el cual se
|
||
623 | * quiere saber los ?ndices de las geometr?as que se encuentran
|
||
624 | * dentro de ?l
|
||
625 | *
|
||
626 | * @return Array de ?ndices para su uso con getGeometry, removeGeometry,
|
||
627 | * ...
|
||
628 | */
|
||
629 | 4135 | fjp | public int[] getRowsIndexes_OL(Rectangle2D r) { |
630 | 3940 | caballero | Envelope e = new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
|
631 | r.getY() + r.getHeight()); |
||
632 | List l = index.query(e);
|
||
633 | int[] indexes = new int[l.size()]; |
||
634 | 3653 | fjp | |
635 | 3940 | caballero | for (int index = 0; index < l.size(); index++) { |
636 | Integer i = (Integer) l.get(index); |
||
637 | 3996 | caballero | indexes[index] = getInversedIndex(i.intValue()); |
638 | 3940 | caballero | } |
639 | 3653 | fjp | |
640 | 3940 | caballero | return indexes;
|
641 | } |
||
642 | /**
|
||
643 | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShapeCount()
|
||
644 | 3836 | caballero | */
|
645 | 3940 | caballero | public int getShapeCount() throws DriverIOException { |
646 | 3996 | caballero | try {
|
647 | return getRowCount();
|
||
648 | } catch (IOException e) { |
||
649 | throw new DriverIOException(e); |
||
650 | } |
||
651 | 3836 | caballero | } |
652 | 3722 | caballero | |
653 | 3836 | caballero | /**
|
654 | 3940 | caballero | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getFullExtent()
|
655 | 3836 | caballero | */
|
656 | 3940 | caballero | public Rectangle2D getFullExtent() throws DriverIOException { |
657 | 3952 | fjp | // TODO: Recalcularlo cada vez que se a?ade un addRow
|
658 | return ova.getFullExtent();
|
||
659 | 3836 | caballero | } |
660 | 3943 | fjp | /**
|
661 | * En la implementaci?n por defecto podemos hacer que cada
|
||
662 | * feature tenga ID = numero de registro.
|
||
663 | * En el DBAdapter podr?amos "overrride" este m?todo y poner
|
||
664 | * como ID de la Feature el campo ?nico escogido en
|
||
665 | * la base de datos.
|
||
666 | * @param numReg
|
||
667 | * @return
|
||
668 | * @throws DriverException
|
||
669 | */
|
||
670 | public IFeature getFeature(int numReg) throws DriverException |
||
671 | { |
||
672 | IGeometry geom; |
||
673 | IFeature feat = null;
|
||
674 | try {
|
||
675 | geom = getShape(numReg); |
||
676 | DataSource rs = getRecordset();
|
||
677 | Value[] regAtt = new Value[rs.getFieldCount()]; |
||
678 | for (int fieldId=0; fieldId < rs.getFieldCount(); fieldId++ ) |
||
679 | 3958 | caballero | { |
680 | 3943 | fjp | regAtt[fieldId] = rs.getFieldValue(numReg, fieldId); |
681 | } |
||
682 | 3958 | caballero | |
683 | 3943 | fjp | feat = new DefaultFeature(geom, regAtt, numReg + ""); |
684 | } catch (DriverIOException e) {
|
||
685 | throw new DriverException(e); |
||
686 | } catch (DriverLoadException e) {
|
||
687 | throw new DriverException(e); |
||
688 | } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
|
||
689 | throw new DriverException(e); |
||
690 | } |
||
691 | return feat;
|
||
692 | } |
||
693 | 3952 | fjp | public void stopEdition(IWriter writer) throws EditionException { |
694 | super.stopEdition(writer);
|
||
695 | try {
|
||
696 | ova.getDriver().reLoad(); |
||
697 | } catch (IOException e) { |
||
698 | e.printStackTrace(); |
||
699 | throw new EditionException(e); |
||
700 | } |
||
701 | } |
||
702 | 3980 | caballero | public Rectangle2D getShapeBounds(int index) throws IOException { |
703 | //Solo se utiliza cuando el driver es BoundedShapes
|
||
704 | // Si no est? en el fichero de expansi?n
|
||
705 | Integer integer = new Integer((int) index); |
||
706 | if (!relations.containsKey(integer)) {
|
||
707 | if (ova.getDriver() instanceof BoundedShapes){ |
||
708 | BoundedShapes bs = (BoundedShapes) ova.getDriver(); |
||
709 | return bs.getShapeBounds(index);
|
||
710 | }else{
|
||
711 | return ova.getDriver().getShape(index).getBounds2D();
|
||
712 | } |
||
713 | |||
714 | } else {
|
||
715 | int num = ((Integer) relations.get(integer)).intValue(); |
||
716 | DefaultRowEdited feat; |
||
717 | feat = (DefaultRowEdited) expansionFile.getRow(num); |
||
718 | if (feat.getStatus() == IRowEdited.STATUS_DELETED)
|
||
719 | return null; |
||
720 | IGeometry geom = ((IFeature)feat.getLinkedRow()).getGeometry(); |
||
721 | return geom.getBounds2D();//getGeometry(); |
||
722 | } |
||
723 | |||
724 | } |
||
725 | public int getShapeType(int index) { |
||
726 | try {
|
||
727 | return ova.getShapeType();
|
||
728 | } catch (DriverIOException e) {
|
||
729 | // TODO Auto-generated catch block
|
||
730 | e.printStackTrace(); |
||
731 | } |
||
732 | return FShape.MULTI;
|
||
733 | } |
||
734 | 4115 | fjp | /**
|
735 | * Usar solo cuando est?s seguro de que puedes
|
||
736 | * gastar memoria. Nosotros lo usamos para las
|
||
737 | * b?squedas por ?ndice espacial con el handle.
|
||
738 | * La idea es usarlo una vez, guardar las geometr?as que
|
||
739 | * necesitas en ese extent y trabajar con ellas
|
||
740 | * hasta el siguiente cambio de extent.
|
||
741 | * @param r
|
||
742 | * @param strEPSG
|
||
743 | * @return
|
||
744 | * @throws DriverException
|
||
745 | */
|
||
746 | public IRowEdited[] getFeatures(Rectangle2D r, String strEPSG) throws DriverException { |
||
747 | // En esta clase suponemos random access.
|
||
748 | // Luego tendremos otra clase que sea VectorialEditableDBAdapter
|
||
749 | // que reescribir? este m?todo.
|
||
750 | 4159 | fjp | Envelope e = FConverter.convertRectangle2DtoEnvelope(r); |
751 | 4115 | fjp | List l = index.query(e);
|
752 | IRowEdited[] feats = new IRowEdited[l.size()]; |
||
753 | try {
|
||
754 | for (int index = 0; index < l.size(); index++) { |
||
755 | Integer i = (Integer) l.get(index); |
||
756 | int inverse = getInversedIndex(i.intValue());
|
||
757 | 4181 | fjp | feats[index] = (IRowEdited) getRow(inverse); |
758 | 4085 | fjp | } |
759 | 4115 | fjp | } catch (DriverIOException e1) {
|
760 | throw new DriverException(e1); |
||
761 | } catch (IOException e1) { |
||
762 | throw new DriverException(e1); |
||
763 | 4085 | fjp | } |
764 | 4115 | fjp | |
765 | return feats;
|
||
766 | 4085 | fjp | } |
767 | |||
768 | 3980 | caballero | |
769 | 3612 | fjp | } |