svn-gvsig-desktop / tags / v1_0_2_Build_901 / libraries / libFMap / src / com / iver / cit / gvsig / fmap / rendering / VectorialUniqueValueLegend.java @ 10571
History | View | Annotate | Download (26.5 KB)
1 | 1100 | fjp | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | *
|
||
19 | * For more information, contact:
|
||
20 | *
|
||
21 | * Generalitat Valenciana
|
||
22 | * Conselleria d'Infraestructures i Transport
|
||
23 | * Av. Blasco Ib??ez, 50
|
||
24 | * 46010 VALENCIA
|
||
25 | * SPAIN
|
||
26 | *
|
||
27 | * +34 963862235
|
||
28 | * gvsig@gva.es
|
||
29 | * www.gvsig.gva.es
|
||
30 | *
|
||
31 | * or
|
||
32 | *
|
||
33 | * IVER T.I. S.A
|
||
34 | * Salamanca 50
|
||
35 | * 46005 Valencia
|
||
36 | * Spain
|
||
37 | *
|
||
38 | * +34 963163400
|
||
39 | * dac@iver.es
|
||
40 | */
|
||
41 | 322 | fernando | package com.iver.cit.gvsig.fmap.rendering; |
42 | |||
43 | 8765 | jjdelcerro | import java.sql.Types; |
44 | import java.text.ParseException; |
||
45 | import java.util.ArrayList; |
||
46 | import java.util.Comparator; |
||
47 | import java.util.TreeMap; |
||
48 | |||
49 | import org.geotools.filter.ExpressionBuilder; |
||
50 | import org.geotools.filter.Filter; |
||
51 | import org.geotools.styling.FeatureTypeStyle; |
||
52 | import org.geotools.styling.NamedLayer; |
||
53 | import org.geotools.styling.Rule; |
||
54 | import org.geotools.styling.SLDTransformer; |
||
55 | import org.geotools.styling.Style; |
||
56 | import org.geotools.styling.StyleBuilder; |
||
57 | import org.geotools.styling.StyleFactory; |
||
58 | import org.geotools.styling.StyledLayerDescriptor; |
||
59 | import org.geotools.styling.Symbolizer; |
||
60 | |||
61 | 470 | fjp | import com.hardcode.gdbms.engine.data.DataSource; |
62 | import com.hardcode.gdbms.engine.instruction.FieldNotFoundException; |
||
63 | import com.hardcode.gdbms.engine.instruction.IncompatibleTypesException; |
||
64 | 479 | fjp | import com.hardcode.gdbms.engine.instruction.SemanticException; |
65 | 470 | fjp | import com.hardcode.gdbms.engine.values.BooleanValue; |
66 | 2361 | vcaballero | import com.hardcode.gdbms.engine.values.NullValue; |
67 | 2415 | caballero | import com.hardcode.gdbms.engine.values.StringValue; |
68 | 470 | fjp | import com.hardcode.gdbms.engine.values.Value; |
69 | 479 | fjp | import com.hardcode.gdbms.engine.values.ValueFactory; |
70 | 651 | fernando | import com.iver.cit.gvsig.fmap.DriverException; |
71 | 470 | fjp | import com.iver.cit.gvsig.fmap.core.FShape; |
72 | 2183 | fernando | import com.iver.cit.gvsig.fmap.core.IFeature; |
73 | 8765 | jjdelcerro | import com.iver.cit.gvsig.fmap.core.ISLDCompatible; |
74 | import com.iver.cit.gvsig.fmap.core.ISymbol; |
||
75 | 4111 | ldiaz | import com.iver.cit.gvsig.fmap.core.SLDTags; |
76 | import com.iver.cit.gvsig.fmap.core.SLDUtils; |
||
77 | 470 | fjp | import com.iver.cit.gvsig.fmap.core.v02.FConstant; |
78 | 458 | fjp | import com.iver.cit.gvsig.fmap.core.v02.FSymbol; |
79 | 490 | fernando | import com.iver.cit.gvsig.fmap.layers.XMLException; |
80 | 435 | vcaballero | import com.iver.utiles.XMLEntity; |
81 | |||
82 | 322 | fernando | /**
|
83 | 1034 | vcaballero | * Leyenda vectorial por valores ?nicos.
|
84 | 322 | fernando | *
|
85 | * @author Vicente Caballero Navarro
|
||
86 | */
|
||
87 | 435 | vcaballero | public class VectorialUniqueValueLegend implements UniqueValueLegend, |
88 | 2796 | caballero | VectorialLegend { |
89 | 10465 | caballero | private boolean sorter=true; |
90 | 10499 | caballero | private TreeMap symbols = new TreeMap(new Comparator() { |
91 | public int compare(Object o1, Object o2) { |
||
92 | if ((o1 != null) && (o2 != null)) { |
||
93 | Value v2 = (Value) o2; |
||
94 | Value v1 = (Value) o1; |
||
95 | // TODO estas dos comprobaciones son por evitar un bug en el
|
||
96 | // gdbms, cuando se solucione se puede eliminar.
|
||
97 | if (v1 instanceof NullValue && v2 instanceof NullValue) { |
||
98 | return 0; |
||
99 | } |
||
100 | 1034 | vcaballero | |
101 | 10499 | caballero | if (v1 instanceof NullValue) { |
102 | return -1; |
||
103 | } |
||
104 | 1034 | vcaballero | |
105 | 10499 | caballero | if (v2 instanceof NullValue) { |
106 | return 1; |
||
107 | } |
||
108 | if (sorter) {
|
||
109 | 1034 | vcaballero | |
110 | 10499 | caballero | BooleanValue boolVal; |
111 | 1034 | vcaballero | |
112 | 10499 | caballero | try {
|
113 | boolVal = (BooleanValue) (v1.greater(v2)); |
||
114 | 2415 | caballero | |
115 | 10499 | caballero | if (boolVal.getValue()) {
|
116 | return 1; |
||
117 | } |
||
118 | 1034 | vcaballero | |
119 | 10499 | caballero | boolVal = (BooleanValue) (v1.less(v2)); |
120 | 1034 | vcaballero | |
121 | 10499 | caballero | if (boolVal.getValue()) {
|
122 | return -1; |
||
123 | } |
||
124 | } catch (IncompatibleTypesException e) {
|
||
125 | } |
||
126 | 1034 | vcaballero | |
127 | 10499 | caballero | try {
|
128 | if (((BooleanValue) v1.equals(v2)).getValue()) {
|
||
129 | return 0; |
||
130 | } |
||
131 | } catch (IncompatibleTypesException e) {
|
||
132 | } |
||
133 | 1034 | vcaballero | |
134 | 10499 | caballero | if (v1 instanceof StringValue) { |
135 | return -1; |
||
136 | } |
||
137 | 1034 | vcaballero | |
138 | 10499 | caballero | if (v2 instanceof StringValue) { |
139 | return 1; |
||
140 | } |
||
141 | |||
142 | } else {
|
||
143 | int indexV1 = keys.indexOf(v1);
|
||
144 | int indexV2 = keys.indexOf(v2);
|
||
145 | if (indexV1 > indexV2) {
|
||
146 | return -1; |
||
147 | } else if (indexV1 < indexV2) { |
||
148 | return 1; |
||
149 | } |
||
150 | return 0; |
||
151 | } |
||
152 | } |
||
153 | return 0; |
||
154 | } |
||
155 | }); // Para poder ordenar
|
||
156 | private ArrayList keys = new ArrayList(); // En lugar de un HashSet, para |
||
157 | // tener acceso por ?ndice
|
||
158 | 2796 | caballero | private String fieldName; |
159 | 8765 | jjdelcerro | protected int fieldId = -1; |
160 | 2796 | caballero | private String labelFieldName; |
161 | private String labelFieldHeight; |
||
162 | private String labelFieldRotation; |
||
163 | 8765 | jjdelcerro | private ISymbol defaultSymbol;
|
164 | 2796 | caballero | private DataSource dataSource; |
165 | private int shapeType; |
||
166 | private String valueType = NullValue.class.getName(); |
||
167 | private boolean useDefaultSymbol = false; |
||
168 | 3035 | fjp | // private boolean bWithHeightText = false;
|
169 | 322 | fernando | |
170 | 2796 | caballero | /**
|
171 | 10499 | caballero | * Crea un nuevo VectorialUniqueValueLegend.
|
172 | */
|
||
173 | 2796 | caballero | public VectorialUniqueValueLegend() {
|
174 | 10499 | caballero | // defaultSymbol = LegendFactory.DEFAULT_POLYGON_SYMBOL;
|
175 | 2796 | caballero | } |
176 | 1034 | vcaballero | |
177 | 2796 | caballero | /**
|
178 | 10499 | caballero | * Crea un nuevo VectorialUniqueValueLegend.
|
179 | *
|
||
180 | * @param shapeType
|
||
181 | * Tipo de shape.
|
||
182 | */
|
||
183 | 2796 | caballero | public VectorialUniqueValueLegend(int shapeType) { |
184 | setShapeType(shapeType); |
||
185 | } |
||
186 | 1034 | vcaballero | |
187 | 2796 | caballero | /**
|
188 | * Inserta el tipo de shape.
|
||
189 | *
|
||
190 | * @param shapeType Tipo de shape.
|
||
191 | */
|
||
192 | public void setShapeType(int shapeType) { |
||
193 | if (this.shapeType != shapeType) { |
||
194 | switch (shapeType) {
|
||
195 | case FShape.POINT:
|
||
196 | defaultSymbol = new FSymbol(FConstant.SYMBOL_TYPE_POINT);
|
||
197 | 1034 | vcaballero | |
198 | 2796 | caballero | break;
|
199 | 1034 | vcaballero | |
200 | 2796 | caballero | case FShape.LINE:
|
201 | defaultSymbol = new FSymbol(FConstant.SYMBOL_TYPE_LINE);
|
||
202 | 470 | fjp | |
203 | 2796 | caballero | break;
|
204 | 322 | fernando | |
205 | 2796 | caballero | case FShape.POLYGON:
|
206 | defaultSymbol = new FSymbol(FConstant.SYMBOL_TYPE_FILL);
|
||
207 | 470 | fjp | |
208 | 2796 | caballero | break;
|
209 | 435 | vcaballero | |
210 | 2796 | caballero | default:
|
211 | defaultSymbol = new FSymbol(shapeType);
|
||
212 | } |
||
213 | 435 | vcaballero | |
214 | 2796 | caballero | this.shapeType = shapeType;
|
215 | } |
||
216 | } |
||
217 | 322 | fernando | |
218 | 2796 | caballero | /**
|
219 | * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#setValueSymbolByID(int,
|
||
220 | 8765 | jjdelcerro | * ISymbol)
|
221 | 2796 | caballero | */
|
222 | 8765 | jjdelcerro | public void setValueSymbolByID(int id, ISymbol symbol) { |
223 | 2796 | caballero | symbols.put(keys.get(id), symbol); |
224 | } |
||
225 | 322 | fernando | |
226 | 2796 | caballero | /**
|
227 | * Devuelve un s?mbolo a partir del ID. Mira en el m_ArrayKeys el elemento
|
||
228 | * ID, y con esa clave recupera el FSymbol por valor
|
||
229 | *
|
||
230 | * @param id ID.
|
||
231 | * @param symbol DOCUMENT ME!
|
||
232 | */
|
||
233 | 322 | fernando | |
234 | 2796 | caballero | /*
|
235 | public FSymbol getSymbolByID(int ID) {
|
||
236 | return (FSymbol) symbols.get(keys.get(ID));
|
||
237 | }
|
||
238 | */
|
||
239 | 322 | fernando | |
240 | 2796 | caballero | /**
|
241 | * Se usa en la tabla que muestra una leyenda.
|
||
242 | 8765 | jjdelcerro | * @deprecated use setValueSymbolByID(int id, ISymbol symbol);
|
243 | 2796 | caballero | * @param id
|
244 | * @param symbol
|
||
245 | */
|
||
246 | 8765 | jjdelcerro | public void setValueSymbol(int id, ISymbol symbol) { |
247 | 2796 | caballero | symbols.put(keys.get(id), symbol); |
248 | } |
||
249 | 322 | fernando | |
250 | 2796 | caballero | /**
|
251 | * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#getValues()
|
||
252 | */
|
||
253 | public Object[] getValues() { |
||
254 | return symbols.keySet().toArray(new Object[0]); |
||
255 | } |
||
256 | 322 | fernando | |
257 | 2796 | caballero | /**
|
258 | * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#addSymbol(java.lang.Object,
|
||
259 | 8765 | jjdelcerro | * ISymbol)
|
260 | 2796 | caballero | */
|
261 | 8765 | jjdelcerro | public void addSymbol(Object key, ISymbol symbol) { |
262 | 2796 | caballero | Object resul;
|
263 | resul = symbols.put(key, symbol); |
||
264 | 322 | fernando | |
265 | 2796 | caballero | if (resul != null) { |
266 | System.err.println("Error: la clave " + key + |
||
267 | " ya exist?a. Resul = " + resul);
|
||
268 | System.err.println("symbol nuevo:" + symbol.getDescription() + |
||
269 | 8765 | jjdelcerro | " Sviejo= " + ((ISymbol) resul).getDescription());
|
270 | 2796 | caballero | } else {
|
271 | keys.add(key); |
||
272 | 10499 | caballero | if (!key.getClass().equals(NullValue.class)) {
|
273 | 2796 | caballero | valueType = key.getClass().getName(); |
274 | } |
||
275 | } |
||
276 | } |
||
277 | |||
278 | /**
|
||
279 | * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#clear()
|
||
280 | */
|
||
281 | public void clear() { |
||
282 | keys.clear(); |
||
283 | symbols.clear(); |
||
284 | } |
||
285 | |||
286 | /**
|
||
287 | * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#getDescriptions()
|
||
288 | */
|
||
289 | public String[] getDescriptions() { |
||
290 | String[] descriptions = new String[symbols.size()]; |
||
291 | 8765 | jjdelcerro | ISymbol[] auxSym = getSymbols();
|
292 | 2796 | caballero | |
293 | for (int i = 0; i < descriptions.length; i++) |
||
294 | descriptions[i] = auxSym[i].getDescription(); |
||
295 | |||
296 | return descriptions;
|
||
297 | } |
||
298 | |||
299 | /**
|
||
300 | * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#getSymbols()
|
||
301 | */
|
||
302 | 8765 | jjdelcerro | public ISymbol[] getSymbols() { |
303 | 10499 | caballero | return (ISymbol[]) symbols.values().toArray(new ISymbol[0]); |
304 | 2796 | caballero | } |
305 | |||
306 | /**
|
||
307 | * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#getFieldName()
|
||
308 | */
|
||
309 | public String getFieldName() { |
||
310 | return fieldName;
|
||
311 | } |
||
312 | |||
313 | /**
|
||
314 | 8765 | jjdelcerro | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#setDefaultSymbol(ISymbol)
|
315 | 2796 | caballero | */
|
316 | 8765 | jjdelcerro | public void setDefaultSymbol(ISymbol s) { |
317 | 2796 | caballero | defaultSymbol = s; |
318 | } |
||
319 | |||
320 | /* (non-Javadoc)
|
||
321 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getLabelField()
|
||
322 | */
|
||
323 | public String getLabelField() { |
||
324 | return labelFieldName;
|
||
325 | } |
||
326 | |||
327 | /**
|
||
328 | * @see com.iver.cit.gvsig.fmap.rendering.Legend#setLabelField(int)
|
||
329 | */
|
||
330 | public void setLabelField(String fieldName) { |
||
331 | labelFieldName = fieldName; |
||
332 | } |
||
333 | |||
334 | /**
|
||
335 | * @see com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend#setField()
|
||
336 | */
|
||
337 | public void setFieldName(String str) { |
||
338 | fieldName = str; |
||
339 | } |
||
340 | |||
341 | /**
|
||
342 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getSymbol(int)
|
||
343 | */
|
||
344 | 8765 | jjdelcerro | public ISymbol getSymbol(int recordIndex) throws DriverException { |
345 | 2796 | caballero | try {
|
346 | 8765 | jjdelcerro | Value val = dataSource.getFieldValue(recordIndex, fieldId); |
347 | ISymbol theSymbol = getSymbolByValue(val); |
||
348 | 2796 | caballero | |
349 | //if (theSymbol != null) {
|
||
350 | return theSymbol;
|
||
351 | |||
352 | //} else {
|
||
353 | // return getDefaultSymbol();
|
||
354 | //}
|
||
355 | } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
|
||
356 | throw new DriverException(e); |
||
357 | } |
||
358 | } |
||
359 | |||
360 | /**
|
||
361 | * Devuelve un s?mbolo a partir de una IFeature.
|
||
362 | 3347 | fjp | * OJO!! Cuando usamos un feature iterator de base de datos
|
363 | * el ?nico campo que vendr? rellenado es el de fieldID.
|
||
364 | * Los dem?s vendr?n a nulos para ahorra tiempo de creaci?n.
|
||
365 | 2796 | caballero | * @param feat IFeature
|
366 | *
|
||
367 | * @return S?mbolo.
|
||
368 | */
|
||
369 | 8765 | jjdelcerro | public ISymbol getSymbolByFeature(IFeature feat) {
|
370 | 3347 | fjp | Value val = feat.getAttribute(fieldId); |
371 | // Value val = feat.getAttribute(0);
|
||
372 | 8765 | jjdelcerro | ISymbol theSymbol = getSymbolByValue(val); |
373 | 2183 | fernando | |
374 | 2415 | caballero | //if (theSymbol != null) {
|
375 | 2796 | caballero | return theSymbol;
|
376 | |||
377 | 2415 | caballero | //} else {
|
378 | // return getDefaultSymbol();
|
||
379 | //}
|
||
380 | 2183 | fernando | } |
381 | 322 | fernando | |
382 | 2796 | caballero | /**
|
383 | * @see com.iver.cit.gvsig.fmap.rendering.Legend#getDefaultSymbol()
|
||
384 | */
|
||
385 | 8765 | jjdelcerro | public ISymbol getDefaultSymbol() {
|
386 | 9886 | caballero | NullUniqueValue nuv=new NullUniqueValue();
|
387 | if (symbols.containsKey(nuv))
|
||
388 | return (ISymbol)symbols.get(nuv);
|
||
389 | 2796 | caballero | return defaultSymbol;
|
390 | } |
||
391 | 1034 | vcaballero | |
392 | 3771 | ldiaz | /**
|
393 | 4575 | ldiaz | * @deprecated
|
394 | 4111 | ldiaz | * Writes and SLD using GEOTOOLS objetcs.
|
395 | 3771 | ldiaz | * @see com.iver.cit.gvsig.fmap.rendering.Legend#getSLDString()
|
396 | */
|
||
397 | 4111 | ldiaz | public String getSLDString_() |
398 | 6368 | caballero | { |
399 | 3771 | ldiaz | try{
|
400 | 4111 | ldiaz | StyledLayerDescriptor sld = new StyledLayerDescriptor();
|
401 | 6368 | caballero | StyleFactory styleFactory = StyleFactory.createStyleFactory(); |
402 | 4111 | ldiaz | StyleBuilder sb = new StyleBuilder();
|
403 | Style style = sb.createStyle();
|
||
404 | style.setName("default");
|
||
405 | Filter filter = null; |
||
406 | 6368 | caballero | Rule rule = null;
|
407 | |||
408 | 3771 | ldiaz | FeatureTypeStyle featStyle = styleFactory.createFeatureTypeStyle(); |
409 | featStyle.setFeatureTypeName(fieldName); |
||
410 | 6368 | caballero | |
411 | 8765 | jjdelcerro | ISymbol[] symbols = this.getSymbols(); |
412 | 3771 | ldiaz | Symbolizer[] theSymbolizers = new Symbolizer[symbols.length]; |
413 | 6368 | caballero | Object[] values = this.getValues(); |
414 | 4111 | ldiaz | String valueStr = null; |
415 | String condition = null; |
||
416 | 6368 | caballero | |
417 | 3771 | ldiaz | for(int i = 0; i < symbols.length; i++ ) |
418 | { |
||
419 | 4111 | ldiaz | valueStr = values[i].toString(); |
420 | //if(this.valueType == "")
|
||
421 | condition = fieldName +"='"+valueStr+"'"; |
||
422 | //else
|
||
423 | // condition = fieldName +"="+values[i];
|
||
424 | filter = (Filter)ExpressionBuilder.parse(condition);
|
||
425 | theSymbolizers[0] = SLDUtils.toGeotoolsSymbol(symbols[i]);
|
||
426 | rule = styleFactory.createRule(); |
||
427 | rule.setName(valueStr); |
||
428 | rule.setTitle(valueStr); |
||
429 | rule.setFilter(filter); |
||
430 | rule.setSymbolizers((Symbolizer[])theSymbolizers.clone());
|
||
431 | featStyle.addRule(rule); |
||
432 | 3771 | ldiaz | } |
433 | 4111 | ldiaz | style.addFeatureTypeStyle(featStyle); |
434 | SLDTransformer st = new SLDTransformer();
|
||
435 | NamedLayer namedLayer = new NamedLayer();
|
||
436 | namedLayer.setName("comunidades");
|
||
437 | namedLayer.addStyle(style); |
||
438 | sld.addStyledLayer(namedLayer); |
||
439 | 6368 | caballero | return st.transform(style);
|
440 | |||
441 | 4111 | ldiaz | }catch(Exception e) |
442 | { |
||
443 | 6368 | caballero | e.printStackTrace(); |
444 | 4111 | ldiaz | return null; |
445 | } |
||
446 | } |
||
447 | 8765 | jjdelcerro | /**
|
448 | * creates the SLD String that defines this legend type.
|
||
449 | */
|
||
450 | 4567 | ldiaz | public String getSLDString(String name) |
451 | 6368 | caballero | { |
452 | 4111 | ldiaz | try{
|
453 | 6368 | caballero | |
454 | 4111 | ldiaz | XmlBuilder xmlBuilder = new XmlBuilder();
|
455 | xmlBuilder.writeHeader(); |
||
456 | xmlBuilder.openTag(SLDTags.SLD_ROOT, SLDTags.VERSION_ATTR, SLDTags.VERSION_1_0_0); |
||
457 | xmlBuilder.openTag(SLDTags.NAMEDLAYER); |
||
458 | 4567 | ldiaz | xmlBuilder.writeTag(SLDTags.NAME,name); |
459 | 4111 | ldiaz | xmlBuilder.openTag(SLDTags.USERSTYLE); |
460 | xmlBuilder.openTag(SLDTags.FEATURETYPESTYLE); |
||
461 | 4697 | ldiaz | //xmlBuilder.writeTag(SLDTags.FEATURETYPENAME,"fieldName");
|
462 | 6368 | caballero | |
463 | 8765 | jjdelcerro | ISymbol[] symbols = this.getSymbols(); |
464 | 6368 | caballero | Object[] values = this.getValues(); |
465 | 4111 | ldiaz | String valueStr = null; |
466 | 6368 | caballero | |
467 | 4111 | ldiaz | for(int i = 0; i < symbols.length; i++ ) |
468 | { |
||
469 | valueStr = values[i].toString(); |
||
470 | xmlBuilder.openTag(SLDTags.RULE); |
||
471 | 8765 | jjdelcerro | xmlBuilder.writeTag(SLDTags.NAME, valueStr); |
472 | 4111 | ldiaz | xmlBuilder.openTag(SLDTags.FILTER); |
473 | xmlBuilder.openTag(SLDTags.PROPERTYISEQUALTO); |
||
474 | xmlBuilder.writeTag(SLDTags.PROPERTYNAME,fieldName); |
||
475 | xmlBuilder.writeTag(SLDTags.LITERAL, valueStr); |
||
476 | xmlBuilder.closeTag(); |
||
477 | 6368 | caballero | xmlBuilder.closeTag(); |
478 | 8765 | jjdelcerro | if (symbols[i] instanceof ISLDCompatible) |
479 | { |
||
480 | ISLDCompatible symSLD = (ISLDCompatible) symbols[i]; |
||
481 | xmlBuilder.writeRaw(symSLD.toSLD()); |
||
482 | } |
||
483 | else
|
||
484 | throw new RuntimeException("Cannot convert Symbol " + i + " " + symbols[i].getDescription() + " to SLD"); |
||
485 | 6368 | caballero | |
486 | 4111 | ldiaz | xmlBuilder.closeTag(); |
487 | } |
||
488 | 6368 | caballero | |
489 | 4111 | ldiaz | xmlBuilder.closeTag(); |
490 | xmlBuilder.closeTag(); |
||
491 | xmlBuilder.closeTag(); |
||
492 | 6368 | caballero | xmlBuilder.closeTag(); |
493 | return xmlBuilder.getXML();
|
||
494 | |||
495 | 3771 | ldiaz | }catch(Exception e) |
496 | { |
||
497 | 6368 | caballero | e.printStackTrace(); |
498 | 3771 | ldiaz | return null; |
499 | } |
||
500 | } |
||
501 | 3632 | ldiaz | /**
|
502 | 2796 | caballero | * @see com.iver.cit.gvsig.fmap.rendering.Legend#getXMLEntity()
|
503 | */
|
||
504 | public XMLEntity getXMLEntity() {
|
||
505 | XMLEntity xml = new XMLEntity();
|
||
506 | xml.putProperty("className", this.getClass().getName()); |
||
507 | xml.putProperty("fieldName", fieldName);
|
||
508 | xml.putProperty("labelfield", labelFieldName);
|
||
509 | xml.putProperty("labelFieldHeight", labelFieldHeight);
|
||
510 | xml.putProperty("labelFieldRotation", labelFieldRotation);
|
||
511 | 1034 | vcaballero | |
512 | 2796 | caballero | xml.putProperty("useDefaultSymbol", useDefaultSymbol);
|
513 | 10465 | caballero | xml.putProperty("sorter",sorter);
|
514 | 2796 | caballero | xml.addChild(getDefaultSymbol().getXMLEntity()); |
515 | 3035 | fjp | // xml.putProperty("isBWithHeightText", isBWithHeightText());
|
516 | 2796 | caballero | xml.putProperty("numKeys", keys.size());
|
517 | 435 | vcaballero | |
518 | 2796 | caballero | if (keys.size() > 0) { |
519 | xml.putProperty("tipoValueKeys", valueType);
|
||
520 | 1034 | vcaballero | |
521 | 2796 | caballero | String[] sk = new String[keys.size()]; |
522 | String[] sv = new String[keys.size()]; |
||
523 | 6631 | caballero | int[] stk = new int[keys.size()]; |
524 | int[] stv = new int[keys.size()]; |
||
525 | 8765 | jjdelcerro | ISymbol[] fsymbols = getSymbols();
|
526 | 6631 | caballero | Object[] values = getValues(); |
527 | 1034 | vcaballero | |
528 | 2796 | caballero | for (int i = 0; i < keys.size(); i++) { |
529 | 6368 | caballero | if (((Value) keys.get(i)).toString().equals("")) { |
530 | sk[i] =" ";
|
||
531 | }else {
|
||
532 | sk[i] = ((Value) keys.get(i)).toString(); |
||
533 | } |
||
534 | if (((Value) values[i]).toString().equals("")) { |
||
535 | sv[i] =" ";
|
||
536 | }else {
|
||
537 | sv[i] = ((Value) values[i]).toString(); |
||
538 | } |
||
539 | 6631 | caballero | stk[i]= ((Value)keys.get(i)).getSQLType(); |
540 | stv[i]= ((Value)values[i]).getSQLType(); |
||
541 | 2796 | caballero | xml.addChild(fsymbols[i].getXMLEntity()); |
542 | 1034 | vcaballero | |
543 | 2796 | caballero | ///System.out.println("get-----------"+sk[i]+"--"+fsymbols[i].getDescription()+"---"+fsymbols[i].getColor());
|
544 | } |
||
545 | 1034 | vcaballero | |
546 | 2796 | caballero | xml.putProperty("keys", sk);
|
547 | xml.putProperty("values", sv);
|
||
548 | 6631 | caballero | xml.putProperty("typeKeys",stk);
|
549 | xml.putProperty("typeValues",stv);
|
||
550 | 2796 | caballero | } |
551 | 1034 | vcaballero | |
552 | 2796 | caballero | return xml;
|
553 | } |
||
554 | 2183 | fernando | |
555 | 2796 | caballero | /**
|
556 | * Inserta el XMLEntity.
|
||
557 | *
|
||
558 | * @param xml XMLEntity.
|
||
559 | */
|
||
560 | public void setXMLEntity03(XMLEntity xml) { |
||
561 | clear(); |
||
562 | setFieldName(xml.getStringProperty("fieldName"));
|
||
563 | setLabelField(xml.getStringProperty("labelfield"));
|
||
564 | 2183 | fernando | |
565 | 2796 | caballero | int useDefaultSymbol = xml.getIntProperty("useDefaultSymbol"); |
566 | 2183 | fernando | |
567 | 2796 | caballero | if (useDefaultSymbol == 1) { |
568 | setDefaultSymbol(FSymbol.createFromXML03(xml.getChild(0)));
|
||
569 | } else {
|
||
570 | setDefaultSymbol(null);
|
||
571 | } |
||
572 | 2183 | fernando | |
573 | 2796 | caballero | int numKeys = xml.getIntProperty("numKeys"); |
574 | 2183 | fernando | |
575 | 2796 | caballero | if (numKeys > 0) { |
576 | String className = xml.getStringProperty("tipoValueKeys"); |
||
577 | String[] sk = xml.getStringArrayProperty("keys"); |
||
578 | String[] sv = xml.getStringArrayProperty("values"); |
||
579 | Value auxValue; |
||
580 | Value auxValue2; |
||
581 | 2183 | fernando | |
582 | 2796 | caballero | for (int i = 0; i < numKeys; i++) { |
583 | try {
|
||
584 | auxValue = ValueFactory.createValue(sk[i], className); |
||
585 | auxValue2 = ValueFactory.createValue(sv[i], className); |
||
586 | 2183 | fernando | |
587 | 8765 | jjdelcerro | ISymbol sym = FSymbol.createFromXML03(xml.getChild(i + |
588 | 2796 | caballero | useDefaultSymbol)); |
589 | 2183 | fernando | |
590 | 2796 | caballero | ///addSymbol(auxValue, sym);
|
591 | symbols.put(auxValue2, sym); |
||
592 | keys.add(auxValue); |
||
593 | 2183 | fernando | |
594 | 2796 | caballero | ///System.out.println("---set------"+auxValue.toString());
|
595 | /// System.out.println("set-----------"+sk[i]+"--"+sym.getDescription()+"---"+sym.getColor());
|
||
596 | } catch (SemanticException e) {
|
||
597 | // TODO Auto-generated catch block
|
||
598 | e.printStackTrace(); |
||
599 | } |
||
600 | } |
||
601 | } |
||
602 | } |
||
603 | 2183 | fernando | |
604 | 2796 | caballero | /**
|
605 | * Inserta el XMLEntity.
|
||
606 | *
|
||
607 | * @param xml XMLEntity.
|
||
608 | */
|
||
609 | public void setXMLEntity(XMLEntity xml) { |
||
610 | clear(); |
||
611 | setFieldName(xml.getStringProperty("fieldName"));
|
||
612 | setLabelField(xml.getStringProperty("labelfield"));
|
||
613 | |||
614 | if (xml.contains("labelFieldHeight")) { |
||
615 | 2673 | fjp | setLabelHeightField(xml.getStringProperty("labelFieldHeight"));
|
616 | 2796 | caballero | } |
617 | |||
618 | if (xml.contains("labelFieldRotation")) { |
||
619 | 2673 | fjp | setLabelRotationField(xml.getStringProperty("labelFieldRotation"));
|
620 | 2796 | caballero | } |
621 | |||
622 | useDefaultSymbol = xml.getBooleanProperty("useDefaultSymbol");
|
||
623 | 10465 | caballero | if (xml.contains("sorter")) |
624 | sorter = xml.getBooleanProperty("sorter");
|
||
625 | 2796 | caballero | setDefaultSymbol(FSymbol.createFromXML(xml.getChild(0)));
|
626 | |||
627 | 3035 | fjp | // FJP: Esto no es necesario ya. Para comprobar si tenemos un campo de altura, miramos
|
628 | // si getLabelHeightField devuelve null o no.
|
||
629 | /* if (xml.contains("isBWithHeightText")) {
|
||
630 | 2673 | fjp | setBWithHeightText(xml.getBooleanProperty("isBWithHeightText"));
|
631 | 3035 | fjp | } */
|
632 | 1034 | vcaballero | |
633 | 2796 | caballero | //addSymbol(new NullUniqueValue(),getDefaultSymbol());
|
634 | int numKeys = xml.getIntProperty("numKeys"); |
||
635 | 1034 | vcaballero | |
636 | 2796 | caballero | if (numKeys > 0) { |
637 | String className = xml.getStringProperty("tipoValueKeys"); |
||
638 | String[] sk = xml.getStringArrayProperty("keys"); |
||
639 | String[] sv = xml.getStringArrayProperty("values"); |
||
640 | Value auxValue = null;
|
||
641 | Value auxValue2 = null;
|
||
642 | 6631 | caballero | int[] stk=null; |
643 | if (xml.contains("typeKeys")) { |
||
644 | stk = xml.getIntArrayProperty("typeKeys");
|
||
645 | int[] stv = xml.getIntArrayProperty("typeValues"); |
||
646 | for (int i = 0; i < numKeys; i++) { |
||
647 | boolean isDefault = false; |
||
648 | if (getValue(sk[i], stk[i]) == null) { |
||
649 | isDefault = true;
|
||
650 | } |
||
651 | 1034 | vcaballero | |
652 | 6631 | caballero | if (className
|
653 | .equals("com.hardcode.gdbms.engine.values.NullUniqueValue")
|
||
654 | || isDefault) { |
||
655 | auxValue = new NullUniqueValue();
|
||
656 | auxValue2 = ValueFactory.createNullValue(); |
||
657 | } else {
|
||
658 | auxValue = getValue(sk[i], stk[i]); // ValueFactory.createValue(sk[i],
|
||
659 | // className);
|
||
660 | auxValue2 = getValue(sv[i], stv[i]); // ValueFactory.createValue(sv[i],
|
||
661 | // className);
|
||
662 | } |
||
663 | 8765 | jjdelcerro | ISymbol sym = FSymbol.createFromXML(xml.getChild(i + 1));
|
664 | 6631 | caballero | symbols.put(auxValue2, sym); |
665 | keys.add(auxValue); |
||
666 | } |
||
667 | } else {
|
||
668 | for (int i = 0; i < numKeys; i++) { |
||
669 | boolean isDefault = false; |
||
670 | if (getValue(sk[i]) == null) { |
||
671 | isDefault = true;
|
||
672 | } |
||
673 | if (className
|
||
674 | .equals("com.hardcode.gdbms.engine.values.NullUniqueValue")
|
||
675 | || isDefault) { |
||
676 | auxValue = new NullUniqueValue();
|
||
677 | auxValue2 = ValueFactory.createNullValue(); |
||
678 | } else {
|
||
679 | auxValue = getValue(sk[i]); // ValueFactory.createValue(sk[i],
|
||
680 | // className);
|
||
681 | auxValue2 = getValue(sv[i]); // ValueFactory.createValue(sv[i],
|
||
682 | // className);
|
||
683 | } |
||
684 | 8765 | jjdelcerro | ISymbol sym = FSymbol.createFromXML(xml.getChild(i + 1));
|
685 | 6631 | caballero | symbols.put(auxValue2, sym); |
686 | keys.add(auxValue); |
||
687 | } |
||
688 | } |
||
689 | 2796 | caballero | } |
690 | } |
||
691 | 2415 | caballero | |
692 | 2796 | caballero | /**
|
693 | 6631 | caballero | * Devuelve el valor a partir de su valor en un string.
|
694 | *
|
||
695 | * @param s
|
||
696 | * String con el valor.
|
||
697 | * @deprecated M?todo utilizado hasta la 1.0 alpha 855 Debes utilizar a partir de ahora getValue(String s,int type);
|
||
698 | * @return Value.
|
||
699 | */
|
||
700 | 2796 | caballero | private Value getValue(String s) { |
701 | Value val = new NullUniqueValue();
|
||
702 | if (s.equals("Resto de Valores"))return val; |
||
703 | try {
|
||
704 | try {
|
||
705 | val = ValueFactory.createValueByType(s, Types.INTEGER);
|
||
706 | 2415 | caballero | |
707 | 2796 | caballero | return val;
|
708 | } catch (NumberFormatException e) { |
||
709 | } |
||
710 | 2415 | caballero | |
711 | 2796 | caballero | try {
|
712 | val = ValueFactory.createValueByType(s, Types.BIGINT);
|
||
713 | 2415 | caballero | |
714 | 2796 | caballero | return val;
|
715 | } catch (NumberFormatException e) { |
||
716 | } |
||
717 | 2415 | caballero | |
718 | 2796 | caballero | try {
|
719 | val = ValueFactory.createValueByType(s, Types.FLOAT);
|
||
720 | 1034 | vcaballero | |
721 | 2796 | caballero | return val;
|
722 | } catch (NumberFormatException e) { |
||
723 | } |
||
724 | 470 | fjp | |
725 | 2796 | caballero | try {
|
726 | val = ValueFactory.createValueByType(s, Types.DOUBLE);
|
||
727 | 1034 | vcaballero | |
728 | 2796 | caballero | return val;
|
729 | } catch (NumberFormatException e) { |
||
730 | } |
||
731 | 6368 | caballero | |
732 | 2796 | caballero | val = ValueFactory.createValueByType(s, Types.LONGVARCHAR);
|
733 | 6368 | caballero | |
734 | 2796 | caballero | } catch (ParseException e) { |
735 | e.printStackTrace(); |
||
736 | } |
||
737 | 1034 | vcaballero | |
738 | 2796 | caballero | return val;
|
739 | } |
||
740 | 6631 | caballero | /**
|
741 | * Devuelve el valor a partir de su valor en un string.
|
||
742 | *
|
||
743 | * @param s String con el valor.
|
||
744 | *
|
||
745 | * @return Value.
|
||
746 | */
|
||
747 | private Value getValue(String s,int type) { |
||
748 | Value val = new NullUniqueValue();
|
||
749 | if (type==Types.OTHER) |
||
750 | return val;
|
||
751 | try {
|
||
752 | val = ValueFactory.createValueByType(s, type); |
||
753 | } catch (ParseException e) { |
||
754 | e.printStackTrace(); |
||
755 | } |
||
756 | return val;
|
||
757 | } |
||
758 | 1034 | vcaballero | |
759 | 2796 | caballero | /**
|
760 | * @see com.iver.cit.gvsig.fmap.rendering.Legend#cloneLegend()
|
||
761 | */
|
||
762 | public Legend cloneLegend() throws XMLException { |
||
763 | 6631 | caballero | return LegendFactory.createFromXML(getXMLEntity());
|
764 | 2796 | caballero | } |
765 | 1034 | vcaballero | |
766 | 2796 | caballero | /* (non-Javadoc)
|
767 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#setDataSource(com.hardcode.gdbms.engine.data.DataSource)
|
||
768 | */
|
||
769 | public void setDataSource(DataSource ds) |
||
770 | throws FieldNotFoundException, DriverException {
|
||
771 | try {
|
||
772 | dataSource = ds; |
||
773 | ds.start(); |
||
774 | fieldId = ds.getFieldIndexByName(fieldName); |
||
775 | ds.stop(); |
||
776 | } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
|
||
777 | throw new DriverException(e); |
||
778 | } |
||
779 | } |
||
780 | 801 | fjp | |
781 | 2796 | caballero | /* (non-Javadoc)
|
782 | * @see com.iver.cit.gvsig.fmap.rendering.UniqueValueLegend#getSymbolByValue(com.hardcode.gdbms.engine.values.Value)
|
||
783 | */
|
||
784 | 8765 | jjdelcerro | public ISymbol getSymbolByValue(Value key) {
|
785 | 10499 | caballero | boolean auxSorted=sorter;
|
786 | sorter=true;
|
||
787 | ISymbol symbol=(ISymbol) symbols.get(key); |
||
788 | sorter=auxSorted; |
||
789 | if (symbol!=null) { |
||
790 | return symbol;
|
||
791 | 2796 | caballero | } else if (useDefaultSymbol) { |
792 | return getDefaultSymbol();
|
||
793 | } |
||
794 | 10499 | caballero | return null; |
795 | 2415 | caballero | |
796 | 2796 | caballero | } |
797 | 2600 | caballero | |
798 | 2796 | caballero | /* (non-Javadoc)
|
799 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getShapeType()
|
||
800 | */
|
||
801 | public int getShapeType() { |
||
802 | return shapeType;
|
||
803 | } |
||
804 | 2600 | caballero | |
805 | 2796 | caballero | /* (non-Javadoc)
|
806 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getLabelHeightField()
|
||
807 | */
|
||
808 | public String getLabelHeightField() { |
||
809 | return labelFieldHeight;
|
||
810 | } |
||
811 | |||
812 | /**
|
||
813 | * Inserta el alto de campo.
|
||
814 | *
|
||
815 | * @param str alto.
|
||
816 | */
|
||
817 | public void setLabelHeightField(String str) { |
||
818 | labelFieldHeight = str; |
||
819 | } |
||
820 | |||
821 | /* (non-Javadoc)
|
||
822 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getLabelRotationField()
|
||
823 | */
|
||
824 | public String getLabelRotationField() { |
||
825 | return labelFieldRotation;
|
||
826 | } |
||
827 | |||
828 | /**
|
||
829 | * Inserta rotaci?n.
|
||
830 | *
|
||
831 | * @param str Rotaci?n.
|
||
832 | */
|
||
833 | public void setLabelRotationField(String str) { |
||
834 | labelFieldRotation = str; |
||
835 | } |
||
836 | |||
837 | /**
|
||
838 | * Introduce si se tiene que representar el resto de valores o no.
|
||
839 | *
|
||
840 | * @param b True si se utiliza el resto de valores.
|
||
841 | */
|
||
842 | public void useDefaultSymbol(boolean b) { |
||
843 | useDefaultSymbol = b; |
||
844 | } |
||
845 | /**
|
||
846 | * Devuelve si se utiliza o no el resto de valores para representarse.
|
||
847 | *
|
||
848 | * @return True si se utiliza el resto de valores.
|
||
849 | */
|
||
850 | public boolean isUseDefaultSymbol() { |
||
851 | return useDefaultSymbol;
|
||
852 | } |
||
853 | /**
|
||
854 | * Devuelve true si el etiquetado de la capa se ha modificado.
|
||
855 | *
|
||
856 | * @return True si se ha modificado el etiquetado de la capa.
|
||
857 | */
|
||
858 | 3035 | fjp | /* public boolean isBWithHeightText() {
|
859 | 2796 | caballero | return bWithHeightText;
|
860 | 3035 | fjp | } */
|
861 | 2796 | caballero | |
862 | /**
|
||
863 | * Introduce si se ha modificado el etiquetado de la capa.
|
||
864 | *
|
||
865 | * @param withHeightText True si se ha modificado el etiquetado de la capa.
|
||
866 | */
|
||
867 | 3035 | fjp | /* public void setBWithHeightText(boolean withHeightText) {
|
868 | 2796 | caballero | bWithHeightText = withHeightText;
|
869 | 3035 | fjp | } */
|
870 | 2796 | caballero | |
871 | /**
|
||
872 | * Elimina el s?mbolo que tiene como clave el valor que se pasa como par?metro.
|
||
873 | *
|
||
874 | * @param key clave.
|
||
875 | */
|
||
876 | public void delSymbol(Object key) { |
||
877 | keys.remove(key); |
||
878 | symbols.remove(key); |
||
879 | } |
||
880 | 3268 | fjp | |
881 | /* (non-Javadoc)
|
||
882 | * @see com.iver.cit.gvsig.fmap.rendering.VectorialLegend#getUsedFields()
|
||
883 | */
|
||
884 | public String[] getUsedFields() { |
||
885 | ArrayList usedFields = new ArrayList(); |
||
886 | if (getFieldName() != null) |
||
887 | 6368 | caballero | usedFields.add(getFieldName()); |
888 | 3268 | fjp | if (getLabelField() != null) |
889 | usedFields.add(getLabelField()); |
||
890 | if (getLabelHeightField() != null) |
||
891 | usedFields.add(getLabelHeightField()); |
||
892 | if (getLabelRotationField() != null) |
||
893 | usedFields.add(getLabelRotationField()); |
||
894 | 6368 | caballero | |
895 | 3268 | fjp | return (String[]) usedFields.toArray(new String[0]); |
896 | |||
897 | } |
||
898 | 10465 | caballero | |
899 | public void setSorter(boolean b) { |
||
900 | sorter=b; |
||
901 | } |
||
902 | |||
903 | public boolean isSorter() { |
||
904 | return sorter;
|
||
905 | } |
||
906 | 322 | fernando | } |