root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / edition / VectorialEditableAdapter.java @ 13882
History | View | Annotate | Download (34.6 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 | 13882 | jaume | * Revision 1.76 2007-09-19 16:25:04 jaume
|
49 | * ReadExpansionFileException removed from this context
|
||
50 | *
|
||
51 | * Revision 1.75 2007/07/25 06:52:08 caballero
|
||
52 | 12779 | caballero | * reproject
|
53 | *
|
||
54 | * Revision 1.74 2007/06/22 10:52:30 caballero
|
||
55 | 12300 | caballero | * start y stop
|
56 | *
|
||
57 | * Revision 1.73 2007/05/29 19:09:07 azabala
|
||
58 | 11880 | azabala | * using of spatial index in spatial iteration now depends of the query area (to avoid using index in full scan queries)
|
59 | *
|
||
60 | * Revision 1.72 2007/05/07 09:02:47 caballero
|
||
61 | 11468 | caballero | * editing memory
|
62 | *
|
||
63 | * Revision 1.71 2007/04/25 14:42:24 caballero
|
||
64 | 11361 | caballero | * BoundShape
|
65 | *
|
||
66 | * Revision 1.70 2007/04/19 17:28:24 azabala
|
||
67 | 11287 | azabala | * changes in ReadableVectorial interface (new iteration modes)
|
68 | *
|
||
69 | * Revision 1.69 2007/03/06 17:08:55 caballero
|
||
70 | 10627 | caballero | * Exceptions
|
71 | *
|
||
72 | * Revision 1.68 2007/02/19 12:36:22 caballero
|
||
73 | 10394 | caballero | * *** empty log message ***
|
74 | *
|
||
75 | * Revision 1.67 2007/02/13 11:31:08 caballero
|
||
76 | 10288 | caballero | * optimizo cuando el cambio es alfanum?rico
|
77 | *
|
||
78 | * Revision 1.66 2007/02/12 08:53:37 caballero
|
||
79 | 10255 | caballero | * FieldExpresion
|
80 | *
|
||
81 | * Revision 1.65 2007/02/08 12:03:07 caballero
|
||
82 | 10210 | caballero | * comentar println
|
83 | *
|
||
84 | * Revision 1.64 2006/09/21 17:32:11 azabala
|
||
85 | 7461 | azabala | * *** empty log message ***
|
86 | 7271 | jaume | *
|
87 | * Revision 1.62 2006/08/10 08:20:31 caballero
|
||
88 | 6714 | caballero | * flatness
|
89 | *
|
||
90 | * Revision 1.61 2006/07/20 13:03:07 fjp
|
||
91 | 6478 | fjp | * nuevos campos
|
92 | *
|
||
93 | * Revision 1.60 2006/07/12 11:48:41 fjp
|
||
94 | 6212 | fjp | * Draft to add, remove and delete fields
|
95 | *
|
||
96 | 6323 | fjp | * Revision 1.59 2006/07/12 10:34:52 fjp
|
97 | * Draft to add, remove and delete fields
|
||
98 | *
|
||
99 | 6313 | fjp | * Revision 1.58 2006/07/06 08:31:29 fjp
|
100 | * Draft to add, remove and delete fields
|
||
101 | *
|
||
102 | 6212 | fjp | * Revision 1.57 2006/06/22 11:38:12 caballero
|
103 | 5987 | caballero | * soluci?n error al borrar geometr?as
|
104 | *
|
||
105 | * Revision 1.56 2006/06/16 10:44:01 fjp
|
||
106 | 5880 | fjp | * Por mandato de Vicente
|
107 | 5879 | caballero | *
|
108 | * Revision 1.54 2006/06/01 16:15:16 fjp
|
||
109 | 5595 | fjp | * Escritura que permite crear drivers de manera m?s sencilla.
|
110 | *
|
||
111 | * Revision 1.53 2006/05/30 13:03:41 fjp
|
||
112 | 5535 | fjp | * setFlatness solo se debe aplicar a bases de datos espaciales.
|
113 | *
|
||
114 | * Revision 1.52 2006/05/24 09:29:30 caballero
|
||
115 | 5389 | caballero | * a?adir flatness
|
116 | *
|
||
117 | * Revision 1.51 2006/05/16 16:07:19 fjp
|
||
118 | 5223 | fjp | * snapping. Revisar
|
119 | *
|
||
120 | * Revision 1.50 2006/05/16 07:07:46 caballero
|
||
121 | 5197 | caballero | * Modificar la geometr?a desde fuera
|
122 | *
|
||
123 | * Revision 1.49 2006/05/15 10:52:23 caballero
|
||
124 | 5184 | caballero | * Saber si se realiza una operaci?n desde la vista o desde la tabla.
|
125 | *
|
||
126 | * Revision 1.48 2006/05/09 15:58:37 caballero
|
||
127 | 5115 | caballero | * Para el IGN
|
128 | *
|
||
129 | * Revision 1.47 2006/05/09 10:28:28 caballero
|
||
130 | 5114 | caballero | * faltaba controlar undo y redo
|
131 | *
|
||
132 | * Revision 1.46 2006/04/27 06:44:56 caballero
|
||
133 | 4954 | caballero | * Soluci?n undo y redo de anotaciones
|
134 | *
|
||
135 | * Revision 1.45 2006/04/18 06:56:55 caballero
|
||
136 | 4847 | caballero | * Cambiar VectorialAdapter por ReadableVectorial
|
137 | *
|
||
138 | * Revision 1.44 2006/04/12 17:13:39 fjp
|
||
139 | 4835 | fjp | * *** empty log message ***
|
140 | *
|
||
141 | * Revision 1.43 2006/04/11 12:12:29 fjp
|
||
142 | 4799 | fjp | * Con edici?n en PostGIS y guardando pseudo-arcos en los shapes.
|
143 | *
|
||
144 | * Revision 1.42 2006/04/11 06:53:20 fjp
|
||
145 | 4792 | fjp | * Preparando el driver de escritura PostGIS
|
146 | *
|
||
147 | * Revision 1.41 2006/04/04 11:27:16 fjp
|
||
148 | 4727 | fjp | * Consola escuchando bien y selecci?n en tabla sincronizada cuando hay edici?n
|
149 | *
|
||
150 | * Revision 1.40 2006/04/03 11:04:48 caballero
|
||
151 | 4709 | caballero | * Posibilidad de a?adir una anotaci?n
|
152 | *
|
||
153 | * Revision 1.39 2006/03/29 06:26:37 caballero
|
||
154 | 4637 | caballero | * acelerar con una imagen las herramientas
|
155 | *
|
||
156 | * Revision 1.38 2006/03/23 16:20:52 fjp
|
||
157 | 4568 | fjp | * Un fallo un tanto inverosimil con el mapOverview
|
158 | *
|
||
159 | * Revision 1.37 2006/03/23 10:08:11 caballero
|
||
160 | 4554 | caballero | * calculo del fullExtent recorriendo todas las geometr?as
|
161 | *
|
||
162 | * Revision 1.36 2006/03/22 11:46:29 caballero
|
||
163 | 4523 | caballero | * Editar capa de anotaciones
|
164 | *
|
||
165 | * Revision 1.35 2006/02/28 18:15:22 fjp
|
||
166 | 4225 | fjp | * Consola de CAD
|
167 | *
|
||
168 | * Revision 1.34 2006/02/24 11:30:32 fjp
|
||
169 | 4193 | fjp | * FUNCIONA!!! (Creo)
|
170 | *
|
||
171 | 4195 | fjp | * Revision 1.33 2006/02/24 07:57:58 fjp
|
172 | * FUNCIONA!!! (Creo)
|
||
173 | *
|
||
174 | 4193 | fjp | * Revision 1.32 2006/02/23 17:55:45 fjp
|
175 | 4147 | fjp | * Preparando para poder editar con el EditionManager
|
176 | *
|
||
177 | 4191 | fjp | * Revision 1.31 2006/02/21 16:44:08 fjp
|
178 | * Preparando para poder editar con el EditionManager
|
||
179 | *
|
||
180 | 4181 | fjp | * Revision 1.30 2006/02/20 18:14:59 fjp
|
181 | * Preparando para poder editar con el EditionManager
|
||
182 | *
|
||
183 | 4171 | fjp | * Revision 1.29 2006/02/20 10:32:54 fjp
|
184 | * Preparando para poder editar con el EditionManager
|
||
185 | *
|
||
186 | 4159 | fjp | * Revision 1.28 2006/02/17 13:40:03 fjp
|
187 | * Preparando para poder editar con el EditionManager
|
||
188 | *
|
||
189 | 4147 | fjp | * Revision 1.27 2006/02/17 10:41:14 fjp
|
190 | 4144 | fjp | * Evento de edici?n lanzado cuando una capa se pone en edici?n
|
191 | *
|
||
192 | * Revision 1.26 2006/02/17 08:21:19 fjp
|
||
193 | 4135 | fjp | * *** empty log message ***
|
194 | *
|
||
195 | * Revision 1.25 2006/02/16 09:38:10 fjp
|
||
196 | 4123 | fjp | * Preparando compatibilidad para bases de datos (y de paso, acelerando :-)
|
197 | *
|
||
198 | * Revision 1.24 2006/02/16 09:06:28 caballero
|
||
199 | 4120 | caballero | * commandStack
|
200 | *
|
||
201 | * Revision 1.23 2006/02/15 18:16:02 fjp
|
||
202 | 4085 | fjp | * POR TERMINAR
|
203 | *
|
||
204 | 4115 | fjp | * Revision 1.22 2006/02/13 18:18:31 fjp
|
205 | * POR TERMINAR
|
||
206 | *
|
||
207 | 4085 | fjp | * Revision 1.21 2006/02/10 13:28:23 caballero
|
208 | 4061 | caballero | * poder cambiar la selecci?n
|
209 | *
|
||
210 | * Revision 1.20 2006/02/09 13:11:54 caballero
|
||
211 | 4026 | caballero | * *** empty log message ***
|
212 | *
|
||
213 | * Revision 1.19 2006/02/08 16:45:29 caballero
|
||
214 | 4000 | caballero | * elimnar c?dio no usado
|
215 | *
|
||
216 | * Revision 1.18 2006/02/08 15:18:45 caballero
|
||
217 | 3996 | caballero | * control de las rows eliminadas
|
218 | *
|
||
219 | * Revision 1.17 2006/02/07 10:18:44 caballero
|
||
220 | 3980 | caballero | * Con BoundedShape
|
221 | *
|
||
222 | * Revision 1.16 2006/02/06 12:01:41 caballero
|
||
223 | 3958 | caballero | * driver del ova
|
224 | *
|
||
225 | * Revision 1.15 2006/02/03 14:09:32 fjp
|
||
226 | 3943 | fjp | * Preparando edici?n
|
227 | *
|
||
228 | 3952 | fjp | * Revision 1.14 2006/02/03 12:16:33 fjp
|
229 | * Preparando edici?n
|
||
230 | *
|
||
231 | 3943 | fjp | * Revision 1.13 2006/02/03 11:54:12 caballero
|
232 | 3940 | caballero | * tablas con vectorialEditableAdapter en edici?n
|
233 | 3936 | fjp | *
|
234 | * Revision 1.11 2006/01/31 08:10:05 caballero
|
||
235 | 3849 | caballero | * cambio de feature a row
|
236 | *
|
||
237 | * Revision 1.10 2006/01/30 08:18:14 caballero
|
||
238 | 3836 | caballero | * m?todos para deshacer y rehacer
|
239 | *
|
||
240 | * Revision 1.9 2006/01/23 17:30:28 caballero
|
||
241 | 3728 | caballero | * coger los datos del ova
|
242 | *
|
||
243 | * Revision 1.8 2006/01/23 16:16:16 caballero
|
||
244 | 3722 | caballero | * getRowIndex
|
245 | *
|
||
246 | * Revision 1.7 2006/01/20 08:37:10 fjp
|
||
247 | 3695 | fjp | * Preparando la edici?n
|
248 | *
|
||
249 | * Revision 1.6 2006/01/19 12:48:20 caballero
|
||
250 | 3688 | caballero | * poder modificar su vectorial Adapter
|
251 | *
|
||
252 | * Revision 1.5 2006/01/19 09:28:11 fjp
|
||
253 | 3686 | fjp | * Preparando la edici?n
|
254 | *
|
||
255 | * Revision 1.4 2006/01/17 10:24:02 fjp
|
||
256 | 3651 | fjp | * Preparando edici?n
|
257 | *
|
||
258 | 3653 | fjp | * Revision 1.3 2006/01/16 12:47:38 fjp
|
259 | * Preparando edici?n
|
||
260 | *
|
||
261 | 3652 | fjp | * Revision 1.2 2006/01/16 11:23:00 fjp
|
262 | * Preparando edici?n
|
||
263 | *
|
||
264 | 3651 | fjp | * Revision 1.1 2006/01/12 13:39:14 fjp
|
265 | 3612 | fjp | * preaparar edicion
|
266 | *
|
||
267 | *
|
||
268 | */
|
||
269 | package com.iver.cit.gvsig.fmap.edition; |
||
270 | |||
271 | 4727 | fjp | import java.awt.Image; |
272 | 3612 | fjp | import java.awt.geom.Rectangle2D; |
273 | 4637 | caballero | import java.awt.image.BufferedImage; |
274 | 3612 | fjp | import java.io.IOException; |
275 | 3722 | caballero | import java.util.List; |
276 | 3612 | fjp | |
277 | 12779 | caballero | import org.cresques.cts.ICoordTrans; |
278 | 11287 | azabala | import org.cresques.cts.IProjection; |
279 | |||
280 | 5595 | fjp | import com.hardcode.driverManager.Driver; |
281 | 10627 | caballero | import com.hardcode.gdbms.driver.exceptions.InitializeDriverException; |
282 | import com.hardcode.gdbms.driver.exceptions.ReadDriverException; |
||
283 | 3943 | fjp | import com.hardcode.gdbms.engine.data.DataSource; |
284 | 10627 | caballero | import com.hardcode.gdbms.engine.data.driver.DriverException; |
285 | 3943 | fjp | import com.hardcode.gdbms.engine.values.Value; |
286 | 10627 | caballero | import com.iver.cit.gvsig.exceptions.commands.EditionCommandException; |
287 | import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException; |
||
288 | import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileWriteException; |
||
289 | import com.iver.cit.gvsig.exceptions.expansionfile.OpenExpansionFileException; |
||
290 | 11468 | caballero | import com.iver.cit.gvsig.exceptions.layers.CancelEditingLayerException; |
291 | 10627 | caballero | import com.iver.cit.gvsig.exceptions.layers.StartEditionLayerException; |
292 | import com.iver.cit.gvsig.exceptions.visitors.StartWriterVisitorException; |
||
293 | import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException; |
||
294 | 3940 | caballero | import com.iver.cit.gvsig.fmap.core.DefaultFeature; |
295 | 12779 | caballero | import com.iver.cit.gvsig.fmap.core.FNullGeometry; |
296 | 3612 | fjp | import com.iver.cit.gvsig.fmap.core.IFeature; |
297 | import com.iver.cit.gvsig.fmap.core.IGeometry; |
||
298 | 3652 | fjp | import com.iver.cit.gvsig.fmap.core.IRow; |
299 | 4159 | fjp | import com.iver.cit.gvsig.fmap.core.v02.FConverter; |
300 | 3980 | caballero | import com.iver.cit.gvsig.fmap.drivers.BoundedShapes; |
301 | 3940 | caballero | import com.iver.cit.gvsig.fmap.drivers.DriverAttributes; |
302 | 3612 | fjp | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
303 | 11287 | azabala | import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator; |
304 | 3940 | caballero | import com.iver.cit.gvsig.fmap.drivers.VectorialDriver; |
305 | 11880 | azabala | import com.iver.cit.gvsig.fmap.drivers.featureiterators.AttrQueryFeatureIterator; |
306 | import com.iver.cit.gvsig.fmap.drivers.featureiterators.DefaultFeatureIterator; |
||
307 | import com.iver.cit.gvsig.fmap.drivers.featureiterators.IndexedSptQueryFeatureIterator; |
||
308 | import com.iver.cit.gvsig.fmap.drivers.featureiterators.SpatialQueryFeatureIterator; |
||
309 | 4061 | caballero | import com.iver.cit.gvsig.fmap.layers.FBitSet; |
310 | 3940 | caballero | import com.iver.cit.gvsig.fmap.layers.ReadableVectorial; |
311 | 11287 | azabala | import com.iver.cit.gvsig.fmap.spatialindex.ISpatialIndex; |
312 | import com.iver.cit.gvsig.fmap.spatialindex.QuadtreeJts; |
||
313 | 3652 | fjp | import com.vividsolutions.jts.geom.Envelope; |
314 | 4523 | caballero | import com.vividsolutions.jts.index.SpatialIndex; |
315 | 3652 | fjp | import com.vividsolutions.jts.index.quadtree.Quadtree; |
316 | 3612 | fjp | |
317 | /**
|
||
318 | * @author fjp
|
||
319 | 5389 | caballero | *
|
320 | 3612 | fjp | */
|
321 | 5223 | fjp | public class VectorialEditableAdapter extends EditableAdapter implements |
322 | ReadableVectorial, BoundedShapes { |
||
323 | 4847 | caballero | protected ReadableVectorial ova;
|
324 | 5223 | fjp | |
325 | 4159 | fjp | protected Quadtree index;
|
326 | 4523 | caballero | |
327 | 4225 | fjp | protected Rectangle2D fullExtent; |
328 | 5223 | fjp | |
329 | 4792 | fjp | protected Image selectionImage; |
330 | 5223 | fjp | |
331 | 4792 | fjp | protected BufferedImage handlersImage; |
332 | 11468 | caballero | |
333 | |||
334 | 11287 | azabala | /*
|
335 | 11468 | caballero | * azo; ReadableVectorial implementations need a reference to
|
336 | 11287 | azabala | * IProjection (of the layer) and to ISpatialIndex (of the layer)
|
337 | * to allow iteration with different criteria
|
||
338 | * */
|
||
339 | protected IProjection projection;
|
||
340 | protected ISpatialIndex fmapSpatialIndex;
|
||
341 | 12779 | caballero | private ICoordTrans ct;
|
342 | 4523 | caballero | |
343 | 7461 | azabala | //private double flatness=0.8;
|
344 | /*
|
||
345 | * private class MyFeatureIterator implements IFeatureIterator { int numReg =
|
||
346 | * 0; Rectangle2D rect; String epsg; IFeatureIterator origFeatIt; boolean
|
||
347 | * bHasNext = true;
|
||
348 | *
|
||
349 | * public MyFeatureIterator(Rectangle2D r, String strEPSG) throws
|
||
350 | * DriverException { rect = r; epsg = strEPSG; origFeatIt =
|
||
351 | * ova.getFeatureIterator(r, epsg); } public boolean hasNext() throws
|
||
352 | * DriverException { return bHasNext; }
|
||
353 | *
|
||
354 | * public IFeature next() throws DriverException { IFeature aux =
|
||
355 | * origFeatIt.next(); return null; }
|
||
356 | *
|
||
357 | * public void closeIterator() throws DriverException {
|
||
358 | * }
|
||
359 | * }
|
||
360 | */
|
||
361 | |||
362 | 11468 | caballero | |
363 | |||
364 | 5223 | fjp | public VectorialEditableAdapter() {
|
365 | 3940 | caballero | super();
|
366 | 3652 | fjp | } |
367 | 5223 | fjp | |
368 | 10627 | caballero | public void setOriginalVectorialAdapter(ReadableVectorial rv) throws ReadDriverException { |
369 | 5223 | fjp | ova = rv; |
370 | 10627 | caballero | setOriginalDataSource(rv.getRecordset()); |
371 | 3652 | fjp | } |
372 | 5223 | fjp | |
373 | 3652 | fjp | /*
|
374 | * (non-Javadoc)
|
||
375 | 5389 | caballero | *
|
376 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#start()
|
377 | */
|
||
378 | 10627 | caballero | public void start() throws ReadDriverException, InitializeDriverException { |
379 | 3653 | fjp | ova.start(); |
380 | 3652 | fjp | } |
381 | |||
382 | 5595 | fjp | public IWriter getWriter() {
|
383 | if (ova.getDriver() instanceof IWriteable) |
||
384 | { |
||
385 | IWriter writer = ((IWriteable) ova.getDriver()).getWriter(); |
||
386 | if (writer instanceof ISpatialWriter) |
||
387 | return writer;
|
||
388 | } |
||
389 | return null; |
||
390 | } |
||
391 | |||
392 | 3652 | fjp | /*
|
393 | * (non-Javadoc)
|
||
394 | 5389 | caballero | *
|
395 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#stop()
|
396 | */
|
||
397 | 10627 | caballero | public void stop() throws ReadDriverException { |
398 | 3653 | fjp | ova.stop(); |
399 | 3652 | fjp | } |
400 | |||
401 | /*
|
||
402 | * (non-Javadoc)
|
||
403 | 5389 | caballero | *
|
404 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShape(int)
|
405 | */
|
||
406 | 10627 | caballero | public IGeometry getShape(int rowIndex) throws ReadDriverException, ExpansionFileReadException { |
407 | 3652 | fjp | // Si no est? en el fichero de expansi?n
|
408 | 5223 | fjp | int calculatedIndex = getCalculatedIndex(rowIndex);
|
409 | 3996 | caballero | Integer integer = new Integer(calculatedIndex); |
410 | 3652 | fjp | if (!relations.containsKey(integer)) {
|
411 | // Si ha sido eliminada
|
||
412 | 5223 | fjp | /*
|
413 | * if (delRows.get(integer.intValue())) { return null; } else {
|
||
414 | */
|
||
415 | return ova.getShape(calculatedIndex);
|
||
416 | // }
|
||
417 | 3652 | fjp | } |
418 | 10627 | caballero | int num = ((Integer) relations.get(integer)).intValue(); |
419 | DefaultRowEdited feat; |
||
420 | feat = (DefaultRowEdited) expansionFile.getRow(num); |
||
421 | return ((IFeature) feat.getLinkedRow()).getGeometry()
|
||
422 | .cloneGeometry();// getGeometry();
|
||
423 | 3652 | fjp | } |
424 | |||
425 | /*
|
||
426 | * (non-Javadoc)
|
||
427 | 5389 | caballero | *
|
428 | 3652 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShapeType()
|
429 | */
|
||
430 | 10627 | caballero | public int getShapeType() throws ReadDriverException { |
431 | 3653 | fjp | return ova.getShapeType();
|
432 | 3652 | fjp | } |
433 | 5223 | fjp | |
434 | public ReadableVectorial getOriginalAdapter() {
|
||
435 | 3940 | caballero | return ova;
|
436 | 3652 | fjp | } |
437 | 5223 | fjp | |
438 | 3940 | caballero | public VectorialDriver getDriver() {
|
439 | 3958 | caballero | return ova.getDriver();
|
440 | 3652 | fjp | } |
441 | 5223 | fjp | |
442 | 3940 | caballero | public void setDriver(VectorialDriver driver) { |
443 | 3958 | caballero | this.ova.setDriver(driver);
|
444 | 3652 | fjp | } |
445 | 5223 | fjp | |
446 | public DriverAttributes getDriverAttributes() {
|
||
447 | 3958 | caballero | return ova.getDriverAttributes();
|
448 | 3940 | caballero | } |
449 | 3652 | fjp | |
450 | 5223 | fjp | /**
|
451 | * DOCUMENT ME!
|
||
452 | 10627 | caballero | * @throws StartEditionLayerException
|
453 | * @throws StartWriterVisitorException
|
||
454 | 5389 | caballero | *
|
455 | 5223 | fjp | * @throws EditionException
|
456 | * DOCUMENT ME!
|
||
457 | */
|
||
458 | 10627 | caballero | public void startEdition(int sourceType) throws StartWriterVisitorException { |
459 | 5223 | fjp | super.startEdition(sourceType);
|
460 | 5595 | fjp | Driver drv = ova.getDriver();
|
461 | if (drv instanceof IWriteable) |
||
462 | { |
||
463 | setWriter(((IWriteable) drv).getWriter()); |
||
464 | } |
||
465 | 3652 | fjp | |
466 | 5595 | fjp | |
467 | 5223 | fjp | try {
|
468 | expansionFile.open(); |
||
469 | if (index == null || fullExtent == null) { |
||
470 | // TODO: Si la capa dispone de un ?ndice espacial, hacer
|
||
471 | // algo aqu? para que se use ese ?ndice espacial.
|
||
472 | index = new Quadtree();
|
||
473 | 3653 | fjp | |
474 | 5223 | fjp | for (int i = 0; i < ova.getShapeCount(); i++) { |
475 | 11361 | caballero | Rectangle2D r=null; |
476 | if (ova.getDriver() instanceof BoundedShapes) { |
||
477 | r = ((BoundedShapes) ova.getDriver()).getShapeBounds(i); |
||
478 | } else {
|
||
479 | IGeometry g = null;
|
||
480 | g = ((DefaultFeature) ova.getFeature(i)) |
||
481 | .getGeometry(); |
||
482 | if (g == null) { |
||
483 | continue;
|
||
484 | } |
||
485 | |||
486 | r = g.getBounds2D(); |
||
487 | 5223 | fjp | } |
488 | 12779 | caballero | if (ct != null) { |
489 | r = ct.convert(r); |
||
490 | } |
||
491 | 5223 | fjp | Envelope e = new Envelope(r.getX(),
|
492 | r.getX() + r.getWidth(), r.getY(), r.getY() |
||
493 | + r.getHeight()); |
||
494 | index.insert(e, new Integer(i)); |
||
495 | if (fullExtent == null) { |
||
496 | fullExtent = r; |
||
497 | } else {
|
||
498 | fullExtent = fullExtent.createUnion(r); |
||
499 | } |
||
500 | } |
||
501 | } |
||
502 | 10627 | caballero | } catch (ReadDriverException e) {
|
503 | throw new StartWriterVisitorException(writer.getName(),e); |
||
504 | 13882 | jaume | } |
505 | 3652 | fjp | |
506 | 5223 | fjp | System.err.println("Se han metido en el ?ndice " |
507 | + index.queryAll().size() + " geometr?as");
|
||
508 | } |
||
509 | 3652 | fjp | |
510 | 5223 | fjp | /*
|
511 | * (non-Javadoc)
|
||
512 | 5389 | caballero | *
|
513 | 5223 | fjp | * @see com.iver.cit.gvsig.fmap.edition.IEditableSource#getRow(int)
|
514 | */
|
||
515 | 10627 | caballero | public IRowEdited getRow(int index) throws ReadDriverException, ExpansionFileReadException { |
516 | 12300 | caballero | start(); |
517 | 5223 | fjp | int calculatedIndex = getCalculatedIndex(index);
|
518 | Integer integer = new Integer(calculatedIndex); |
||
519 | // Si no est? en el fichero de expansi?n
|
||
520 | DefaultRowEdited edRow = null;
|
||
521 | if (!relations.containsKey(integer)) {
|
||
522 | 10627 | caballero | edRow = new DefaultRowEdited(ova.getFeature(calculatedIndex),
|
523 | IRowEdited.STATUS_ORIGINAL, index); |
||
524 | 12300 | caballero | stop(); |
525 | return createExternalRow(edRow, 0); |
||
526 | 5223 | fjp | } |
527 | 10627 | caballero | int num = ((Integer) relations.get(integer)).intValue(); |
528 | IRowEdited aux = expansionFile.getRow(num); |
||
529 | edRow = new DefaultRowEdited(aux.getLinkedRow().cloneRow(), aux
|
||
530 | .getStatus(), index); |
||
531 | 12300 | caballero | stop(); |
532 | 10627 | caballero | return edRow;
|
533 | 5223 | fjp | } |
534 | |||
535 | /**
|
||
536 | * Elimina una geometria. Si es una geometr?a original de la capa en edici?n
|
||
537 | * se marca como eliminada (haya sido modificada o no). Si es una geometr?a
|
||
538 | * a?adida posteriormente se invalida en el fichero de expansi?n, para que
|
||
539 | * una futura compactaci?n termine con ella.
|
||
540 | 5389 | caballero | *
|
541 | 5223 | fjp | * @param index
|
542 | * ?ndice de la geometr?a.
|
||
543 | 10627 | caballero | * @throws ReadDriverException
|
544 | * @throws ExpansionFileReadException
|
||
545 | 5389 | caballero | *
|
546 | 5223 | fjp | * @throws DriverIOException
|
547 | * @throws IOException
|
||
548 | */
|
||
549 | 10627 | caballero | public IRow doRemoveRow(int index, int sourceType) throws ReadDriverException, ExpansionFileReadException{ |
550 | 5223 | fjp | boolean cancel = fireBeforeRemoveRow(index, sourceType);
|
551 | 5114 | caballero | if (cancel)
|
552 | return null; |
||
553 | 5223 | fjp | // Llega el calculatedIndex
|
554 | Integer integer = new Integer(index); |
||
555 | 3652 | fjp | |
556 | 5223 | fjp | IFeature feat = null;
|
557 | delRows.set(index, true);
|
||
558 | // Si la geometr?a no ha sido modificada
|
||
559 | if (!relations.containsKey(integer)) {
|
||
560 | 10627 | caballero | feat = (DefaultFeature) (ova.getFeature(index)); |
561 | 5223 | fjp | } else {
|
562 | 3940 | caballero | int num = ((Integer) relations.get(integer)).intValue(); |
563 | feat = (IFeature) expansionFile.getRow(num).getLinkedRow(); |
||
564 | 5223 | fjp | // expansionFile.invalidateRow(num);
|
565 | 3653 | fjp | } |
566 | 5223 | fjp | System.err.println("Elimina una Row en la posici?n: " + index); |
567 | // Se actualiza el ?ndice
|
||
568 | if (feat != null) { |
||
569 | Rectangle2D r = feat.getGeometry().getBounds2D();
|
||
570 | boolean borrado = this.index.remove(new Envelope(r.getX(), r.getX() |
||
571 | + r.getWidth(), r.getY(), r.getY() + r.getHeight()), |
||
572 | new Integer(index)); |
||
573 | System.out.println("Est? borrado : " + borrado); |
||
574 | System.out.println("Index.lenght : " + this.index.size()); |
||
575 | 7271 | jaume | isFullExtentDirty = true;
|
576 | 5223 | fjp | } |
577 | setSelection(new FBitSet());
|
||
578 | fireAfterRemoveRow(index, sourceType); |
||
579 | return feat;
|
||
580 | } |
||
581 | |||
582 | /**
|
||
583 | * Si se intenta modificar una geometr?a original de la capa en edici?n se
|
||
584 | * a?ade al fichero de expansi?n y se registra la posici?n en la que se
|
||
585 | * a?adi?. Si se intenta modificar una geometria que se encuentra en el
|
||
586 | * fichero de expansi?n (por ser nueva o original pero modificada) se invoca
|
||
587 | * el m?todo modifyGeometry y se actualiza el ?ndice de la geometria en el
|
||
588 | * fichero.
|
||
589 | 5389 | caballero | *
|
590 | 5223 | fjp | * @param calculatedIndex
|
591 | * DOCUMENT ME!
|
||
592 | * @param feat
|
||
593 | * DOCUMENT ME!
|
||
594 | 5389 | caballero | *
|
595 | 5223 | fjp | * @return position inside ExpansionFile
|
596 | 10627 | caballero | * @throws ReadDriverException
|
597 | * @throws ExpansionFileWriteException
|
||
598 | * @throws ExpansionFileReadException
|
||
599 | 5389 | caballero | *
|
600 | 5223 | fjp | * @throws IOException
|
601 | * @throws DriverIOException
|
||
602 | */
|
||
603 | 10627 | caballero | public int doModifyRow(int calculatedIndex, IRow feat, int sourceType) throws ReadDriverException, ExpansionFileWriteException, ExpansionFileReadException { |
604 | 5223 | fjp | boolean cancel = fireBeforeModifyRow(feat, calculatedIndex, sourceType);
|
605 | 5114 | caballero | if (cancel)
|
606 | return -1; |
||
607 | 5223 | fjp | int posAnteriorInExpansionFile = -1; |
608 | Integer integer = new Integer(calculatedIndex); |
||
609 | 3652 | fjp | |
610 | 5223 | fjp | IFeature featAnt = null;
|
611 | 10210 | caballero | // System.err.println("Modifica una Row en la posici?n: "
|
612 | // + calculatedIndex);
|
||
613 | 5223 | fjp | // Si la geometr?a no ha sido modificada
|
614 | if (!relations.containsKey(integer)) {
|
||
615 | int newPosition = expansionFile.addRow(feat,
|
||
616 | 6212 | fjp | IRowEdited.STATUS_MODIFIED, actualIndexFields); |
617 | 5223 | fjp | relations.put(integer, new Integer(newPosition)); |
618 | 3652 | fjp | |
619 | 10255 | caballero | if (sourceType == EditionEvent.GRAPHIC) {
|
620 | // Se actualiza el ?ndice espacial
|
||
621 | 10627 | caballero | featAnt = (DefaultFeature) (ova.getFeature(calculatedIndex)); |
622 | 10255 | caballero | IGeometry g = featAnt.getGeometry(); |
623 | Rectangle2D rAnt = g.getBounds2D();
|
||
624 | Rectangle2D r = ((IFeature) feat).getGeometry().getBounds2D();
|
||
625 | this.index.remove(new Envelope(rAnt.getX(), rAnt.getX() |
||
626 | + rAnt.getWidth(), rAnt.getY(), rAnt.getY() |
||
627 | + rAnt.getHeight()), new Integer(calculatedIndex)); |
||
628 | this.index.insert(new Envelope(r.getX(), r.getX() |
||
629 | + r.getWidth(), r.getY(), r.getY() + r.getHeight()), |
||
630 | new Integer(calculatedIndex)); |
||
631 | 3940 | caballero | } |
632 | 5223 | fjp | } else {
|
633 | // Obtenemos el ?ndice en el fichero de expansi?n
|
||
634 | int num = ((Integer) relations.get(integer)).intValue(); |
||
635 | posAnteriorInExpansionFile = num; |
||
636 | 3653 | fjp | |
637 | 5223 | fjp | // Obtenemos la geometr?a para actualiza el ?ndice
|
638 | // espacialposteriormente
|
||
639 | featAnt = (IFeature) expansionFile.getRow(num).getLinkedRow(); |
||
640 | 3652 | fjp | |
641 | 5223 | fjp | /*
|
642 | * Se modifica la geometr?a y nos guardamos el ?ndice dentro del
|
||
643 | * fichero de expansi?n en el que se encuentra la geometr?a
|
||
644 | * modificada
|
||
645 | */
|
||
646 | 6212 | fjp | num = expansionFile.modifyRow(num, feat, actualIndexFields); |
647 | 3652 | fjp | |
648 | 5223 | fjp | /*
|
649 | * Actualiza la relaci?n del ?ndice de la geometr?a al ?ndice en el
|
||
650 | * fichero de expansi?n.
|
||
651 | */
|
||
652 | relations.put(integer, new Integer(num)); |
||
653 | 10255 | caballero | if (sourceType == EditionEvent.GRAPHIC) {
|
654 | // Se modifica el ?ndice espacial
|
||
655 | Rectangle2D rAnt = featAnt.getGeometry().getBounds2D();
|
||
656 | Rectangle2D r = ((IFeature) feat).getGeometry().getBounds2D();
|
||
657 | this.index.remove(new Envelope(rAnt.getX(), rAnt.getX() |
||
658 | + rAnt.getWidth(), rAnt.getY(), rAnt.getY() |
||
659 | + rAnt.getHeight()), new Integer(calculatedIndex)); |
||
660 | this.index.insert(new Envelope(r.getX(), r.getX() |
||
661 | + r.getWidth(), r.getY(), r.getY() + r.getHeight()), |
||
662 | new Integer(calculatedIndex)); |
||
663 | } |
||
664 | 5223 | fjp | } |
665 | 7271 | jaume | isFullExtentDirty = true;
|
666 | 10394 | caballero | fireAfterModifyRow(calculatedIndex, sourceType); |
667 | 5223 | fjp | return posAnteriorInExpansionFile;
|
668 | } |
||
669 | 5197 | caballero | |
670 | 5223 | fjp | /**
|
671 | * Actualiza en el mapa de ?ndices, la posici?n en la que estaba la
|
||
672 | * geometr?a antes de ser modificada. Se marca como v?lida, en caso de que
|
||
673 | * fuera una modificaci?n de una geometr?a que estuviese en el fichero de
|
||
674 | * expansi?n antes de ser modificada y se pone el puntero de escritura del
|
||
675 | * expansion file a justo despues de la penultima geometr?a
|
||
676 | 5389 | caballero | *
|
677 | 5223 | fjp | * @param calculatedIndex
|
678 | * ?ndice de la geometr?a que se quiere deshacer su modificaci?n
|
||
679 | * @param previousExpansionFileIndex
|
||
680 | * ?ndice que ten?a antes la geometr?a en el expansionFile. Si
|
||
681 | * vale -1 quiere decir que es una modificaci?n de una geometr?a
|
||
682 | * original y por tanto no hay que actualizar el mapa de indices
|
||
683 | * sino eliminar su entrada.
|
||
684 | * @throws IOException
|
||
685 | * @throws DriverIOException
|
||
686 | */
|
||
687 | public void undoModifyRow(int calculatedIndex, |
||
688 | 10627 | caballero | int previousExpansionFileIndex, int sourceType) throws EditionCommandException{ |
689 | try {
|
||
690 | 13882 | jaume | // Llega el CalculatedIndex
|
691 | /*
|
||
692 | * Si la acci?n de modificar se realiz? sobre una geometr?a original
|
||
693 | */
|
||
694 | if (previousExpansionFileIndex == -1) { |
||
695 | 5223 | fjp | |
696 | 13882 | jaume | // Se obtiene la geometr?a para actualizar el ?ndice
|
697 | // IGeometry g = ((DefaultFeature)
|
||
698 | // getRow(calculatedIndex).getLinkedRow()).getGeometry();
|
||
699 | int inverse = getInversedIndex(calculatedIndex);
|
||
700 | DefaultFeature df; |
||
701 | 10627 | caballero | |
702 | df = (DefaultFeature) getRow(inverse).getLinkedRow(); |
||
703 | |||
704 | 13882 | jaume | boolean cancel = fireBeforeModifyRow(df, calculatedIndex,
|
705 | sourceType); |
||
706 | if (cancel)
|
||
707 | return;
|
||
708 | IGeometry g = df.getGeometry(); |
||
709 | // IGeometry g = ova.getShape(calculatedIndex);
|
||
710 | Rectangle2D r = g.getBounds2D();
|
||
711 | 3652 | fjp | |
712 | 13882 | jaume | // Se elimina de las relaciones y del fichero de expansi?n
|
713 | relations.remove(new Integer(calculatedIndex)); |
||
714 | expansionFile.deleteLastRow(); |
||
715 | if (sourceType == EditionEvent.GRAPHIC) {
|
||
716 | // Se actualizan los ?ndices
|
||
717 | IGeometry gAnt = ova.getShape(calculatedIndex); |
||
718 | /*
|
||
719 | * IGeometry gAnt = ((DefaultFeature) getRow(calculatedIndex)
|
||
720 | * .getLinkedRow()).getGeometry();
|
||
721 | */
|
||
722 | Rectangle2D rAnt = gAnt.getBounds2D();
|
||
723 | this.index.remove(new Envelope(r.getX(), r.getX() |
||
724 | + r.getWidth(), r.getY(), r.getY() + r.getHeight()), |
||
725 | new Integer(calculatedIndex)); |
||
726 | this.index.insert(new Envelope(rAnt.getX(), rAnt.getX() |
||
727 | + rAnt.getWidth(), rAnt.getY(), rAnt.getY() |
||
728 | + rAnt.getHeight()), new Integer(calculatedIndex)); |
||
729 | } |
||
730 | } else {
|
||
731 | // Se obtiene la geometr?a para actualizar el ?ndice
|
||
732 | IGeometry g = null;
|
||
733 | int inverse = getInversedIndex(calculatedIndex);
|
||
734 | DefaultFeature df = (DefaultFeature) getRow(inverse).getLinkedRow(); |
||
735 | boolean cancel = fireBeforeModifyRow(df, calculatedIndex,
|
||
736 | sourceType); |
||
737 | if (cancel)
|
||
738 | return;
|
||
739 | if (sourceType == EditionEvent.GRAPHIC) {
|
||
740 | g = df.getGeometry(); |
||
741 | System.out.println("Actual: " + g.toString()); |
||
742 | 3652 | fjp | |
743 | 13882 | jaume | Rectangle2D r = g.getBounds2D();
|
744 | this.index.remove(new Envelope(r.getX(), r.getX() |
||
745 | + r.getWidth(), r.getY(), r.getY() + r.getHeight()), |
||
746 | new Integer(calculatedIndex)); |
||
747 | 3652 | fjp | |
748 | 13882 | jaume | // Se recupera la geometr?a
|
749 | // expansionFile.validateRow(previousExpansionFileIndex);
|
||
750 | 10288 | caballero | |
751 | 13882 | jaume | // Se actualizan los ?ndices
|
752 | // g = ((IFeature)
|
||
753 | // (expansionFile.getRow(previousExpansionFileIndex).getLinkedRow())).getGeometry();
|
||
754 | // System.out.println("Anterior a la que volvemos : " +
|
||
755 | // g.toString());
|
||
756 | g = ((DefaultFeature) getRow(inverse).getLinkedRow()) |
||
757 | .getGeometry(); |
||
758 | r = g.getBounds2D(); |
||
759 | this.index.insert(new Envelope(r.getX(), r.getX() |
||
760 | + r.getWidth(), r.getY(), r.getY() + r.getHeight()), |
||
761 | new Integer(calculatedIndex)); |
||
762 | } |
||
763 | // Se actualiza la relaci?n de ?ndices
|
||
764 | // Integer integer = new Integer(geometryIndex);
|
||
765 | relations.put(new Integer(calculatedIndex), new Integer( |
||
766 | previousExpansionFileIndex)); |
||
767 | 3652 | fjp | |
768 | 13882 | jaume | } |
769 | 10627 | caballero | } catch (ReadDriverException e) {
|
770 | throw new EditionCommandException(writer.getName(),e); |
||
771 | } |
||
772 | 10288 | caballero | //fireAfterModifyRow(calculatedIndex, sourceType);
|
773 | 5223 | fjp | } |
774 | 3653 | fjp | |
775 | 5223 | fjp | /**
|
776 | * A?ade una geometria al fichero de expansi?n y guarda la correspondencia
|
||
777 | * en la tabla relations.
|
||
778 | 5389 | caballero | *
|
779 | 5223 | fjp | * @param feat
|
780 | * geometr?a a guardar.
|
||
781 | 5389 | caballero | *
|
782 | 5223 | fjp | * @return calculatedIndex
|
783 | 10627 | caballero | * @throws ExpansionFileWriteException
|
784 | 5223 | fjp | * @throws DriverIOException
|
785 | * @throws IOException
|
||
786 | */
|
||
787 | 10627 | caballero | public int doAddRow(IRow feat, int sourceType) throws ReadDriverException, ExpansionFileWriteException{ |
788 | 5223 | fjp | int calculatedIndex = super.doAddRow(feat, sourceType); |
789 | 3940 | caballero | // Actualiza el ?ndice espacial
|
790 | 5223 | fjp | IGeometry g = ((IFeature) feat).getGeometry(); |
791 | Rectangle2D r = g.getBounds2D();
|
||
792 | index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(),
|
||
793 | r.getY() + r.getHeight()), new Integer(calculatedIndex)); |
||
794 | 7271 | jaume | isFullExtentDirty = true;
|
795 | 5223 | fjp | return calculatedIndex;
|
796 | } |
||
797 | 3653 | fjp | |
798 | 5223 | fjp | /**
|
799 | * Se desmarca como invalidada en el fichero de expansion o como eliminada
|
||
800 | * en el fichero original
|
||
801 | 5389 | caballero | *
|
802 | 5223 | fjp | * @param index
|
803 | * DOCUMENT ME!
|
||
804 | * @throws IOException
|
||
805 | * @throws DriverIOException
|
||
806 | */
|
||
807 | 10627 | caballero | public void undoRemoveRow(int index, int sourceType) throws EditionCommandException { |
808 | 5223 | fjp | super.undoRemoveRow(index, sourceType);
|
809 | 3653 | fjp | |
810 | 5223 | fjp | IGeometry g = null;
|
811 | 10627 | caballero | try {
|
812 | g = ((IFeature) getRow(getInversedIndex(index)).getLinkedRow()).getGeometry(); |
||
813 | } catch (ReadDriverException e) {
|
||
814 | throw new EditionCommandException(writer.getName(),e); |
||
815 | 13882 | jaume | } |
816 | 3653 | fjp | |
817 | 5223 | fjp | Rectangle2D r = g.getBounds2D();
|
818 | this.index.insert(new Envelope(r.getX(), r.getX() + r.getWidth(), r |
||
819 | .getY(), r.getY() + r.getHeight()), new Integer(index)); |
||
820 | } |
||
821 | 3653 | fjp | |
822 | 5223 | fjp | /**
|
823 | * Se elimina del final del fichero de expansi?n poniendo el puntero de
|
||
824 | * escritura apuntando al final de la pen?ltima geometr?a. Deber? quitar la
|
||
825 | * relaci?n del mapa de relaciones
|
||
826 | 5389 | caballero | *
|
827 | 5223 | fjp | * @param index
|
828 | * ?ndice de la geometr?a que se a?adi?
|
||
829 | 10627 | caballero | * @throws EditionCommandException
|
830 | 5223 | fjp | * @throws DriverIOException
|
831 | * @throws IOException
|
||
832 | */
|
||
833 | 10627 | caballero | public void undoAddRow(int calculatedIndex, int sourceType) throws EditionCommandException{ |
834 | 5223 | fjp | int inverse = getInversedIndex(calculatedIndex);
|
835 | 10627 | caballero | IGeometry g; |
836 | try {
|
||
837 | g = ((IFeature) getRow(inverse).getLinkedRow()).getGeometry(); |
||
838 | Rectangle2D r = g.getBounds2D();
|
||
839 | this.index.remove(new Envelope(r.getX(), r.getX() + r.getWidth(), r |
||
840 | 5223 | fjp | .getY(), r.getY() + r.getHeight()), |
841 | new Integer(calculatedIndex)); |
||
842 | 3653 | fjp | |
843 | 10627 | caballero | super.undoAddRow(calculatedIndex, sourceType);
|
844 | setSelection(new FBitSet());
|
||
845 | } catch (ReadDriverException e) {
|
||
846 | throw new EditionCommandException(writer.getName(),e); |
||
847 | 13882 | jaume | } |
848 | 5223 | fjp | } |
849 | |||
850 | /**
|
||
851 | * Obtiene las geometr?as que se encuentran en el rect?ngulo que se pasa
|
||
852 | * como par?metro haciendo uso del ?ndice espacial
|
||
853 | 5389 | caballero | *
|
854 | 5223 | fjp | * @param r
|
855 | * Rect?ngulo indicando la porci?n del espacio para el cual se
|
||
856 | * quiere saber los ?ndices de las geometr?as que se encuentran
|
||
857 | * dentro de ?l
|
||
858 | 5389 | caballero | *
|
859 | 5223 | fjp | * @return Array de ?ndices para su uso con getGeometry, removeGeometry, ...
|
860 | */
|
||
861 | /*
|
||
862 | * public int[] getRowsIndexes_OL(Rectangle2D r) { Envelope e = new
|
||
863 | * Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() +
|
||
864 | * r.getHeight()); List l = index.query(e); int[] indexes = new
|
||
865 | * int[l.size()];
|
||
866 | 5389 | caballero | *
|
867 | 5223 | fjp | * for (int index = 0; index < l.size(); index++) { Integer i = (Integer)
|
868 | * l.get(index); indexes[index] = getInversedIndex(i.intValue()); }
|
||
869 | 5389 | caballero | *
|
870 | 5223 | fjp | * return indexes; }
|
871 | */
|
||
872 | /**
|
||
873 | 3940 | caballero | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShapeCount()
|
874 | 3836 | caballero | */
|
875 | 10627 | caballero | public int getShapeCount() throws ReadDriverException { |
876 | return getRowCount();
|
||
877 | 3836 | caballero | } |
878 | 3722 | caballero | |
879 | 3836 | caballero | /**
|
880 | 10627 | caballero | * @throws ExpansionFileReadException
|
881 | 3940 | caballero | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getFullExtent()
|
882 | 3836 | caballero | */
|
883 | 10627 | caballero | public Rectangle2D getFullExtent() throws ReadDriverException, ExpansionFileReadException { |
884 | 5223 | fjp | if (fullExtent == null) { |
885 | fullExtent = ova.getFullExtent(); |
||
886 | } |
||
887 | 7271 | jaume | |
888 | if (isFullExtentDirty) {
|
||
889 | fullExtent = reCalculateFullExtent(); |
||
890 | isFullExtentDirty = false;
|
||
891 | } |
||
892 | 5223 | fjp | return fullExtent;
|
893 | } |
||
894 | 4554 | caballero | |
895 | 5223 | fjp | /**
|
896 | * Use it BEFORE writing to a file.
|
||
897 | 5389 | caballero | *
|
898 | 5223 | fjp | * @return real full extent.
|
899 | 10627 | caballero | * @throws ExpansionFileReadException
|
900 | * @throws ReadDriverException
|
||
901 | 5223 | fjp | * @throws DriverIOException
|
902 | */
|
||
903 | 10627 | caballero | public Rectangle2D reCalculateFullExtent() throws ReadDriverException, ExpansionFileReadException { |
904 | 5223 | fjp | if (getShapeCount() > 0) { |
905 | fullExtent = getShape(0).getBounds2D();
|
||
906 | for (int i = 1; i < getShapeCount(); i++) { |
||
907 | 12779 | caballero | IGeometry geom=getShape(i); |
908 | if (fullExtent==null) { |
||
909 | fullExtent=geom.getBounds2D(); |
||
910 | continue;
|
||
911 | } |
||
912 | if (!(geom instanceof FNullGeometry)) { |
||
913 | fullExtent.add(geom.getBounds2D()); |
||
914 | } |
||
915 | 5223 | fjp | } |
916 | } else {
|
||
917 | fullExtent = ova.getFullExtent(); |
||
918 | } |
||
919 | return fullExtent;
|
||
920 | 3836 | caballero | } |
921 | 3958 | caballero | |
922 | 5223 | fjp | /**
|
923 | * En la implementaci?n por defecto podemos hacer que cada feature tenga ID =
|
||
924 | * numero de registro. En el DBAdapter podr?amos "overrride" este m?todo y
|
||
925 | * poner como ID de la Feature el campo ?nico escogido en la base de datos.
|
||
926 | 5389 | caballero | *
|
927 | 5223 | fjp | * @param numReg
|
928 | * @return
|
||
929 | 10627 | caballero | * @throws ExpansionFileReadException
|
930 | 5223 | fjp | */
|
931 | 10627 | caballero | public IFeature getFeature(int numReg) throws ReadDriverException, ExpansionFileReadException { |
932 | 5223 | fjp | IGeometry geom; |
933 | IFeature feat = null;
|
||
934 | geom = getShape(numReg); |
||
935 | DataSource rs = getRecordset();
|
||
936 | Value[] regAtt = new Value[rs.getFieldCount()]; |
||
937 | for (int fieldId = 0; fieldId < rs.getFieldCount(); fieldId++) { |
||
938 | regAtt[fieldId] = rs.getFieldValue(numReg, fieldId); |
||
939 | } |
||
940 | feat = new DefaultFeature(geom, regAtt, numReg + ""); |
||
941 | return feat;
|
||
942 | } |
||
943 | |||
944 | 10627 | caballero | public void stopEdition(IWriter writer, int sourceType) throws StopWriterVisitorException { |
945 | 11468 | caballero | // ISpatialWriter spatialWriter = (ISpatialWriter) writer;
|
946 | 6714 | caballero | // spatialWriter.setFlatness(FConverter.flatness);
|
947 | 5184 | caballero | super.stopEdition(writer, sourceType);
|
948 | 12779 | caballero | // try {
|
949 | // ova.getDriver().reload();
|
||
950 | // } catch (ReloadDriverException e) {
|
||
951 | // throw new StopWriterVisitorException(writer.getName(),e);
|
||
952 | // }
|
||
953 | 11468 | caballero | index=null;
|
954 | writer=null;
|
||
955 | 3952 | fjp | } |
956 | 5223 | fjp | |
957 | 10627 | caballero | public Rectangle2D getShapeBounds(int index) throws ReadDriverException, ExpansionFileReadException { |
958 | 5223 | fjp | // Solo se utiliza cuando el driver es BoundedShapes
|
959 | // Si no est? en el fichero de expansi?n
|
||
960 | 10627 | caballero | Integer integer = new Integer(index); |
961 | 3980 | caballero | if (!relations.containsKey(integer)) {
|
962 | 5223 | fjp | if (ova.getDriver() instanceof BoundedShapes) { |
963 | 3980 | caballero | BoundedShapes bs = (BoundedShapes) ova.getDriver(); |
964 | return bs.getShapeBounds(index);
|
||
965 | } |
||
966 | 10627 | caballero | return ova.getDriver().getShape(index).getBounds2D();
|
967 | 3980 | caballero | |
968 | } |
||
969 | 10627 | caballero | int num = ((Integer) relations.get(integer)).intValue(); |
970 | DefaultRowEdited feat; |
||
971 | feat = (DefaultRowEdited) expansionFile.getRow(num); |
||
972 | if (feat.getStatus() == IRowEdited.STATUS_DELETED)
|
||
973 | return null; |
||
974 | IGeometry geom = ((IFeature) feat.getLinkedRow()).getGeometry(); |
||
975 | return geom.getBounds2D();// getGeometry(); |
||
976 | 3980 | caballero | |
977 | } |
||
978 | 5223 | fjp | |
979 | 10627 | caballero | public int getShapeType(int index) throws ReadDriverException { |
980 | return ova.getShapeType();
|
||
981 | 3980 | caballero | } |
982 | 5223 | fjp | |
983 | 4115 | fjp | /**
|
984 | 5223 | fjp | * Usar solo cuando est?s seguro de que puedes gastar memoria. Nosotros lo
|
985 | * usamos para las b?squedas por ?ndice espacial con el handle. La idea es
|
||
986 | * usarlo una vez, guardar las geometr?as que necesitas en ese extent y
|
||
987 | * trabajar con ellas hasta el siguiente cambio de extent.
|
||
988 | 5389 | caballero | *
|
989 | 4115 | fjp | * @param r
|
990 | * @param strEPSG
|
||
991 | * @return
|
||
992 | 10627 | caballero | * @throws ExpansionFileReadException
|
993 | * @throws ReadDriverException
|
||
994 | 4115 | fjp | * @throws DriverException
|
995 | */
|
||
996 | 10627 | caballero | public IRowEdited[] getFeatures(Rectangle2D r, String strEPSG) throws ReadDriverException, ExpansionFileReadException{ |
997 | 4115 | fjp | // En esta clase suponemos random access.
|
998 | // Luego tendremos otra clase que sea VectorialEditableDBAdapter
|
||
999 | // que reescribir? este m?todo.
|
||
1000 | 5223 | fjp | Envelope e = FConverter.convertRectangle2DtoEnvelope(r); |
1001 | List l = index.query(e);
|
||
1002 | IRowEdited[] feats = new IRowEdited[l.size()]; |
||
1003 | 10627 | caballero | for (int index = 0; index < l.size(); index++) { |
1004 | Integer i = (Integer) l.get(index); |
||
1005 | int inverse = getInversedIndex(i.intValue());
|
||
1006 | feats[index] = getRow(inverse); |
||
1007 | 10210 | caballero | } |
1008 | 4115 | fjp | return feats;
|
1009 | 4085 | fjp | } |
1010 | 5223 | fjp | |
1011 | 4523 | caballero | public void setSpatialIndex(SpatialIndex spatialIndex) { |
1012 | 5223 | fjp | index = (Quadtree) spatialIndex; |
1013 | 11287 | azabala | QuadtreeJts fmapidx = new QuadtreeJts(index);
|
1014 | setSpatialIndex(fmapidx); |
||
1015 | 11468 | caballero | |
1016 | 4523 | caballero | } |
1017 | 5223 | fjp | |
1018 | 4523 | caballero | public void setFullExtent(Rectangle2D fullExtent2) { |
1019 | 5223 | fjp | fullExtent = fullExtent2; |
1020 | 4523 | caballero | } |
1021 | 5223 | fjp | |
1022 | 4727 | fjp | /**
|
1023 | * DOCUMENT ME!
|
||
1024 | 5389 | caballero | *
|
1025 | 4727 | fjp | * @return DOCUMENT ME!
|
1026 | */
|
||
1027 | public Image getSelectionImage() { |
||
1028 | 5223 | fjp | return selectionImage;
|
1029 | 4727 | fjp | } |
1030 | 5223 | fjp | |
1031 | 4727 | fjp | public Image getHandlersImage() { |
1032 | return handlersImage;
|
||
1033 | } |
||
1034 | 5223 | fjp | |
1035 | 4792 | fjp | /**
|
1036 | * DOCUMENT ME!
|
||
1037 | 5389 | caballero | *
|
1038 | 5223 | fjp | * @param i
|
1039 | * DOCUMENT ME!
|
||
1040 | 4792 | fjp | */
|
1041 | public void setSelectionImage(Image i) { |
||
1042 | 5223 | fjp | selectionImage = i; |
1043 | 4792 | fjp | } |
1044 | 5223 | fjp | |
1045 | 4792 | fjp | public void setHandlersImage(BufferedImage handlersImage) { |
1046 | 5223 | fjp | this.handlersImage = handlersImage;
|
1047 | 4792 | fjp | } |
1048 | 5389 | caballero | |
1049 | 11287 | azabala | public IFeatureIterator getFeatureIterator() throws ReadDriverException { |
1050 | return new DefaultFeatureIterator(this, projection, null, null); |
||
1051 | } |
||
1052 | 11468 | caballero | |
1053 | |||
1054 | public IFeatureIterator getFeatureIterator(String[] fields, IProjection newProjection) |
||
1055 | 11287 | azabala | throws ReadDriverException{
|
1056 | return new DefaultFeatureIterator(this, projection, newProjection, fields); |
||
1057 | } |
||
1058 | 11468 | caballero | |
1059 | 11287 | azabala | /**
|
1060 | * Return a feature iterator from a given sql statement.
|
||
1061 | * <br>
|
||
1062 | * In this case, the statement will have the "projection" operator
|
||
1063 | * (select campo1, campo2, ...etc) and the "selection" operator (where ....)
|
||
1064 | * @param sql statement which define a filter
|
||
1065 | * @return feature iterator
|
||
1066 | * */
|
||
1067 | 11468 | caballero | public IFeatureIterator getFeatureIterator(String sql, |
1068 | 11287 | azabala | IProjection newProjection) throws ReadDriverException{
|
1069 | 11468 | caballero | |
1070 | 11287 | azabala | return new AttrQueryFeatureIterator(this, projection, newProjection, sql); |
1071 | } |
||
1072 | 11468 | caballero | |
1073 | |||
1074 | 11287 | azabala | /**
|
1075 | * Makes an spatial query returning a feature iterator over the features which intersects
|
||
1076 | * or are contained in the rectangle query. Applies a restriction to the alphanumeric fields
|
||
1077 | * returned by the iterator.
|
||
1078 | * @param rect
|
||
1079 | * @param fields
|
||
1080 | * @return
|
||
1081 | 11468 | caballero | * @throws ReadDriverException
|
1082 | */
|
||
1083 | 12300 | caballero | public IFeatureIterator getFeatureIterator(Rectangle2D rect, String[] fields, |
1084 | 11880 | azabala | IProjection newProjection, boolean fastIteration) throws ReadDriverException{ |
1085 | 11287 | azabala | if(fmapSpatialIndex == null){ |
1086 | 11880 | azabala | return new SpatialQueryFeatureIterator(this, projection, newProjection, fields, rect, fastIteration); |
1087 | 11287 | azabala | }else{
|
1088 | 11880 | azabala | return new IndexedSptQueryFeatureIterator(this, projection, newProjection, fields, rect, fmapSpatialIndex, fastIteration); |
1089 | 11287 | azabala | } |
1090 | } |
||
1091 | |||
1092 | public ISpatialIndex getSpatialIndex() {
|
||
1093 | return fmapSpatialIndex;
|
||
1094 | } |
||
1095 | |||
1096 | public void setSpatialIndex(ISpatialIndex spatialIndex) { |
||
1097 | this.fmapSpatialIndex = spatialIndex;
|
||
1098 | } |
||
1099 | |||
1100 | public void setProjection(IProjection projection) { |
||
1101 | this.projection = projection;
|
||
1102 | } |
||
1103 | |||
1104 | public IProjection getProjection() {
|
||
1105 | return projection;
|
||
1106 | } |
||
1107 | |||
1108 | 11468 | caballero | public void cancelEdition(int sourceType) throws CancelEditingLayerException { |
1109 | super.cancelEdition(sourceType);
|
||
1110 | index=null;
|
||
1111 | setWriter(null);
|
||
1112 | System.gc();
|
||
1113 | } |
||
1114 | 11287 | azabala | |
1115 | 12779 | caballero | /**
|
1116 | * Inserta las coordenadas de transformaci?n.
|
||
1117 | *
|
||
1118 | * @param ct Coordenadas de transformaci?n.
|
||
1119 | */
|
||
1120 | public void setCoordTrans(ICoordTrans ct) { |
||
1121 | this.ct=ct;
|
||
1122 | } |
||
1123 | 5389 | caballero | |
1124 | 3612 | fjp | } |