Statistics
| Revision:

root / org.gvsig.legend.urbanhorizontalsignage / trunk / org.gvsig.legend.urbanhorizontalsignage / org.gvsig.legend.urbanhorizontalsignage.lib / org.gvsig.legend.urbanhorizontalsignage.lib.impl / src / main / java / org / gvsig / legend / urbanhorizontalsignage / lib / impl / DefaultUrbanHorizontalSignageManager.java @ 5143

History | View | Annotate | Download (24.5 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2015 gvSIG Association
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., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.legend.urbanhorizontalsignage.lib.impl;
24

    
25
import java.io.File;
26
import java.util.Iterator;
27
import java.util.List;
28
import java.util.UUID;
29
import org.apache.commons.lang3.StringUtils;
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataManager;
32
import org.gvsig.fmap.dal.DataStoreParameters;
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.EditableFeature;
35
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
36
import org.gvsig.fmap.dal.feature.EditableFeatureType;
37
import org.gvsig.fmap.dal.feature.Feature;
38
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
39
import org.gvsig.fmap.dal.feature.FeatureSet;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
42
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
43
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
44
import org.gvsig.fmap.geom.Geometry;
45
import static org.gvsig.fmap.geom.Geometry.JOIN_STYLE_MITRE;
46
import static org.gvsig.fmap.geom.Geometry.JOIN_STYLE_ROUND;
47
import org.gvsig.fmap.geom.GeometryLocator;
48
import org.gvsig.fmap.geom.GeometryManager;
49
import org.gvsig.fmap.geom.aggregate.MultiLine;
50
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
51
import org.gvsig.fmap.geom.exception.CreateGeometryException;
52
import org.gvsig.fmap.geom.operation.GeometryOperationException;
53
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
54
import org.gvsig.fmap.geom.primitive.Line;
55
import org.gvsig.fmap.geom.primitive.Point;
56
import org.gvsig.fmap.geom.primitive.Polygon;
57
import org.gvsig.fmap.geom.type.GeometryType;
58
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageConfig;
59
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData;
60
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_CONT;
61
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_CONT_CONT;
62
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_CONT_DISC;
63
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_DISC;
64
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_DISC_CONT;
65
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_DISC_DISC;
66
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageLegend;
67
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageLocator;
68
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageManager;
69
import org.gvsig.legend.urbanverticalsignage.lib.api.PictureMarkerSymbolTableLegend;
70
import org.gvsig.legend.urbanverticalsignage.lib.impl.DefaultPictureMarkerSymbolTableLegend;
71
import org.gvsig.tools.ToolsLocator;
72
import org.gvsig.tools.folders.FoldersManager;
73
import org.gvsig.tools.task.SimpleTaskStatus;
74
import org.gvsig.tools.util.HasAFile;
75
import org.slf4j.LoggerFactory;
76

    
77
@SuppressWarnings("UseSpecificCatch")
78
public class DefaultUrbanHorizontalSignageManager implements UrbanHorizontalSignageManager {
79

    
80
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DefaultUrbanHorizontalSignageManager.class);
81

    
82
    @Override
83
    public UrbanHorizontalSignageLegend createUrbanHorizontalSignageLegend() {
84
        return new DefaultUrbanHorizontalSignageLegend();
85
    }
86

    
87
    @Override
88
    public Class<? extends UrbanHorizontalSignageLegend> getUrbanHorizontalSignageLegendClass() {
89
        return DefaultUrbanHorizontalSignageLegend.class;
90
    }
91

    
92
    @Override
93
    public UrbanHorizontalSignageData createUrbanHorizontalSignageData() {
94
        return new DefaultUrbanHorizontalSignageData();
95
    }
96

    
97
    @Override
98
    public void calculateGeometries(Geometry originalGeometry, UrbanHorizontalSignageData data) {
99
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
100
        try {
101
            MultiPolygon segments = geomManager.createMultiPolygon(originalGeometry.getGeometryType().getSubType());
102
            MultiPolygon holes = geomManager.createMultiPolygon(originalGeometry.getGeometryType().getSubType());
103
            MultiLine lineSegments = geomManager.createMultiLine(originalGeometry.getGeometryType().getSubType());
104
            MultiLine lineHoles = geomManager.createMultiLine(originalGeometry.getGeometryType().getSubType());
105
            MultiLine lines = originalGeometry.toLines();
106
            final double offsetValueInMeters = Math.abs(data.getGapWidth()/2.0+data.getWidth()/2.0);
107
            final double bufferValueInMeters = Math.abs(data.getWidth() / 2.0);
108
            for (Geometry geom : lines) {
109
                Line line = (Line) geom;
110
                switch (data.getContinuity()) {
111
                    case CONTINUITY_MODE_CONT:
112
                    default:
113
                        Geometry buffer = line.buffer(
114
                                bufferValueInMeters,
115
                                data.isRoundVertex() ? JOIN_STYLE_ROUND : JOIN_STYLE_MITRE,
116
                                true
117
                        );
118
                        if(buffer != null){
119
                            segments.addPrimitives(buffer);
120
                            lineSegments.addPrimitives(line);
121
                        }
122
                        break;
123
                    
124
                    case CONTINUITY_MODE_DISC:
125
                        SplittedLine splittedLine = splitLine(line, data.getSegmentsLength(), data.getHolesLength());
126
                        List<Line> splittedSegments = splittedLine.getSegments();
127
                        List<Line> splittedHoles = splittedLine.getHoles();
128
                        for (Line segment : splittedSegments) {
129
                            buffer = segment.buffer(bufferValueInMeters,
130
                                    data.isRoundVertex() ? JOIN_STYLE_ROUND : JOIN_STYLE_MITRE,
131
                                    true
132
                            );
133
                            if(buffer != null){
134
                                segments.addPrimitives(buffer);
135
                                lineSegments.addPrimitives(segment);
136
                            }
137
                        }
138
                        for (Line hole : splittedHoles) {
139
                            buffer = hole.buffer(
140
                                    bufferValueInMeters,
141
                                    data.isRoundVertex() ? JOIN_STYLE_ROUND : JOIN_STYLE_MITRE,
142
                                    true
143
                            );
144
                            if(buffer != null){
145
                                holes.addPrimitives(buffer);
146
                                lineHoles.addPrimitives(hole);
147
                            }
148
                        }
149
                        break;
150
                        
151
                    case CONTINUITY_MODE_CONT_CONT:
152
                        //Left
153
                        addOffsetedAndBufferedSegment(segments, lineSegments, line, offsetValueInMeters, bufferValueInMeters, data.isRoundVertex());
154
                        //Right
155
                        addOffsetedAndBufferedSegment(segments, lineSegments, line, -offsetValueInMeters, bufferValueInMeters, data.isRoundVertex());
156
                        break;
157
                        
158
                    case CONTINUITY_MODE_CONT_DISC:
159
                        //Left
160
                        addOffsetedAndBufferedSegment(segments, lineSegments, line, offsetValueInMeters, bufferValueInMeters, data.isRoundVertex());
161
                        //Right
162
                        splittedLine = splitLine(line, data.getSegmentsLength(), data.getHolesLength());
163
                        splittedSegments = splittedLine.getSegments();
164
                        splittedHoles = splittedLine.getHoles();
165
                        for (Line segment : splittedSegments) {
166
                            addOffsetedAndBufferedSegment(segments, lineSegments, segment, -offsetValueInMeters, bufferValueInMeters, true);
167
                        }
168
                        for (Line hole : splittedHoles) {
169
                            addOffsetedAndBufferedSegment(holes, lineHoles, hole, -offsetValueInMeters, bufferValueInMeters, true);
170
                        }
171
                        break;
172

    
173
                    case CONTINUITY_MODE_DISC_CONT:
174
                        //Left
175
                        splittedLine = splitLine(line, data.getSegmentsLength(), data.getHolesLength());
176
                        splittedSegments = splittedLine.getSegments();
177
                        splittedHoles = splittedLine.getHoles();
178
                        for (Line segment : splittedSegments) {
179
                            addOffsetedAndBufferedSegment(segments, lineSegments, segment, offsetValueInMeters, bufferValueInMeters, true);
180
                        }
181
                        for (Line hole : splittedHoles) {
182
                            addOffsetedAndBufferedSegment(holes, lineHoles, hole, offsetValueInMeters, bufferValueInMeters, true);
183
                        }
184
                        //Right
185
                        addOffsetedAndBufferedSegment(segments, lineSegments, line, -offsetValueInMeters, bufferValueInMeters, data.isRoundVertex());
186
                        break;
187
                        
188
                    case CONTINUITY_MODE_DISC_DISC:
189
                        splittedLine = splitLine(line, data.getSegmentsLength(), data.getHolesLength());
190
                        splittedSegments = splittedLine.getSegments();
191
                        splittedHoles = splittedLine.getHoles();
192
                        //Left
193
                        for (Line segment : splittedSegments) {
194
                            addOffsetedAndBufferedSegment(segments, lineSegments, segment, offsetValueInMeters, bufferValueInMeters, true);
195
                        }
196
                        for (Line hole : splittedHoles) {
197
                            addOffsetedAndBufferedSegment(holes, lineHoles, hole, offsetValueInMeters, bufferValueInMeters, true);
198
                        }
199
                        //Right
200
                        for (Line segment : splittedSegments) {
201
                            addOffsetedAndBufferedSegment(segments, lineSegments, segment, -offsetValueInMeters, bufferValueInMeters, true);
202
                        }
203
                        for (Line hole : splittedHoles) {
204
                            addOffsetedAndBufferedSegment(holes, lineHoles, hole, -offsetValueInMeters, bufferValueInMeters, true);
205
                        }
206
                        break;
207

    
208
                }
209

    
210
            }
211
            data.setSegmentsGeometry(segments);
212
            data.setHolesGeometry(holes);
213
            data.setLineSegmentsGeometry(lineSegments);
214
            data.setLineHolesGeometry(lineHoles);
215
        } catch (Exception ex) {
216
            LOGGER.warn("Can't calculate geometries.", ex);
217
//            Logger.getLogger(DefaultUrbanHorizontalSignageManager.class.getName()).log(Level.SEVERE, null, ex);
218
        }
219

    
220
    }
221

    
222
    protected void addOffsetedAndBufferedSegment(MultiPolygon segments, MultiLine lineSegments, Line segment, final double offsetValueInMeters, final double bufferValueInMeters, boolean roundVertex) throws GeometryOperationException, GeometryOperationNotSupportedException {
223
        Geometry buffer;
224
        final int joinStyle = roundVertex ? JOIN_STYLE_ROUND : JOIN_STYLE_MITRE;
225

    
226
        Geometry segmentOffset;
227
        if (segment.isClosed() && segment.getNumVertices() > 2 && segment.isCCW()) {
228
            Line cloned = segment.cloneGeometry();
229
            cloned.flip();
230
            segmentOffset = cloned.offset(
231
                    joinStyle,
232
                    -offsetValueInMeters
233
            );
234
        } else {
235
            segmentOffset = segment.cloneGeometry().offset(
236
                    joinStyle,
237
                    offsetValueInMeters
238
            );
239
        }
240
        if(segmentOffset == null){
241
            return;
242
        }
243
        buffer = segmentOffset.buffer(bufferValueInMeters, joinStyle,
244
                true
245
        );
246
        if (buffer != null) {
247
            segments.addPrimitives(buffer);
248
            lineSegments.addPrimitives(segmentOffset);
249
        }
250
    }
251

    
252
    /*
253
        segmentLength & holesLenght in meters
254
    */
255
    /*friend*/SplittedLine splitLine(Line line, double segmentLength, double holesLength) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException, CloneNotSupportedException {
256
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
257
        SplittedLine res = new SplittedLine();
258

    
259
        Point previousPoint = null;
260
        double previousLength = 0;
261
        Line currentSegment = geomManager.createLine(line.getGeometryType().getSubType());
262
        boolean isHole = false;
263
        boolean advanceToNext = true;
264
        Iterator<Point> it = line.iterator();
265
        Point currentPoint = null;
266
        while (it.hasNext() || !advanceToNext) {
267
            if (advanceToNext) {
268
                currentPoint = it.next();
269
            }
270
            if (previousPoint == null) {
271
                previousPoint = currentPoint.clone();
272
                currentSegment.addVertex(previousPoint);
273
                advanceToNext = true;
274
                continue;
275
            }
276
            double distance = previousPoint.distance(currentPoint);
277
            if (!isHole) {
278
                if (previousLength + distance < segmentLength) {
279
                    previousLength += distance;
280
                    if(distance > 0.0){
281
                        currentSegment.addVertex(currentPoint);
282
                    }
283
                    previousPoint = currentPoint.cloneGeometry();
284
                    advanceToNext = true;
285
//                    continue;
286
                } else {
287
                    //buscar punto dentro del segmento a una distancia = segmentLengthMeters-previousLength
288
                    Point point = calculateIntermediatePoint(previousPoint, currentPoint, (segmentLength - previousLength) / distance);
289
                    //a?adirlo al currentSegment,
290
                    currentSegment.addVertex(point);
291
                    //a?adir  el currentSegment a la lista de segmentos
292
                    res.addSegment(currentSegment.cloneGeometry());
293
                    //crear un nuevo currentSegment y meter el punto como primero
294
                    currentSegment = geomManager.createLine(line.getGeometryType().getSubType());
295
                    currentSegment.addVertex(point);
296
                    //cambiar modo ==> isHole = true
297
                    isHole = !isHole;
298
                    previousPoint = point.clone();
299
                    previousLength = 0;
300
                    advanceToNext = false;
301
//                    continue;
302
                }
303
            } else {
304
                if (previousLength + distance < holesLength) {
305
                    previousLength += distance;
306
                    if(distance > 0.0){
307
                        currentSegment.addVertex(currentPoint);
308
                    }
309
                    previousPoint = currentPoint.cloneGeometry();
310
                    advanceToNext = true;
311
//                    continue;
312
                } else {
313
                    //buscar punto dentro del segmento a una distancia = segmentLengthMeters-previousLength
314
                    Point point = calculateIntermediatePoint(previousPoint, currentPoint, (holesLength - previousLength) / distance);
315
                    //a?adirlo al currentSegment,
316
                    currentSegment.addVertex(point);
317
                    //a?adir  el surrentSegment a la lista de segmentos
318
                    res.addHole(currentSegment.cloneGeometry());
319
                    //crear un nuevo currentSegment y meter el punto como primero
320
                    currentSegment = geomManager.createLine(line.getGeometryType().getSubType());
321
                    currentSegment.addVertex(point);
322
                    //Cambiar modo Segment <==> Hole
323
                    isHole = !isHole;
324
                    previousPoint = point.clone();
325
                    previousLength = 0;
326
                    advanceToNext = false;
327
//                    continue;
328
                }
329
            }
330
        }
331

    
332
        if (currentSegment.getNumVertices() > 1) {
333
            if (isHole) {
334
                res.addHole(currentSegment.cloneGeometry());
335
            } else {
336
                res.addSegment(currentSegment.cloneGeometry());
337
            }
338
        }
339

    
340
        return res;
341
    }
342

    
343
    Point calculateIntermediatePoint(Point p1, Point p2, double lambda) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
344
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
345
        GeometryType geomType = p1.getGeometryType();
346
        int subtype = geomType.getSubType();
347
        int dimension = geomType.getDimension();
348
        double[] coords = new double[dimension];
349
        Point p = geomManager.createPoint(0, 0, subtype);
350
        double distance = p1.distance(p2);
351
        for (int d = 0; d < dimension; d++) {
352
            p.setCoordinateAt(
353
                    d,
354
                    p1.getCoordinateAt(d) + (p2.getCoordinateAt(d) - p1.getCoordinateAt(d)) * lambda);
355
        }
356
        
357
        return p;
358
    }
359

    
360
    @Override
361
    public FeatureStore convertLinesToPolygons(FeatureSet sourceFeatureSet, UrbanHorizontalSignageConfig config, SimpleTaskStatus status) {
362
        
363
        //TODO: el status....
364
        UrbanHorizontalSignageManager uhsManager = UrbanHorizontalSignageLocator.getUrbanHorizontalSignageManager();
365
        EditableFeatureType targetFeatureType = createTargetFeatureType(sourceFeatureSet.getFeatureStore());
366
        FeatureStore targetStore = createTemporalStore(targetFeatureType);
367
        try {
368
            targetStore.edit(FeatureStore.MODE_APPEND);
369

    
370
            for (Feature feature : sourceFeatureSet) {
371

    
372
                Geometry originalGeometry = feature.getDefaultGeometry();
373

    
374
                UrbanHorizontalSignageData data = config.getValues(feature);
375

    
376
                uhsManager.calculateGeometries(originalGeometry, data);
377

    
378
                MultiPolygon multiGeom = data.getSegmentsGeometry();
379
                MultiLine multiLine = data.getLineSegmentsGeometry();
380
                fillTargetFeature(multiGeom, multiLine, targetStore, feature, config, config.getSegmentsColorFieldName());
381

    
382
                switch (data.getContinuity()) {
383
                    case CONTINUITY_MODE_CONT_DISC:
384
                    case CONTINUITY_MODE_DISC_CONT:
385
                    case CONTINUITY_MODE_DISC:
386
                    case CONTINUITY_MODE_DISC_DISC:
387
                        if (data.isPaintHoles()) {
388
                            multiGeom = data.getHolesGeometry();
389
                            multiLine = data.getLineHolesGeometry();
390
                            fillTargetFeature(multiGeom, multiLine, targetStore, feature, config, config.getHolesColorFieldName());
391
                        }
392
                }
393

    
394
            }
395

    
396
            targetStore.finishEditing();
397
            return targetStore;
398

    
399
        } catch (Exception e) {
400
            LOGGER.debug("Can't create temporary polygons store.", e);
401
        }
402

    
403
        return null;
404
    }
405

    
406
    private void fillTargetFeature(MultiPolygon multiGeom, MultiLine multiLine, FeatureStore targetStore, Feature feature, UrbanHorizontalSignageConfig config, String colorFieldName) throws GeometryOperationNotSupportedException, GeometryOperationException, DataException {
407
        if (multiGeom != null && multiGeom.getPrimitivesNumber() > 0) {
408
            for (int i = 0; i < multiGeom.getPrimitivesNumber(); i++) {
409
                Polygon geometry = (Polygon) multiGeom.getPrimitiveAt(i);
410
                Line line = (Line) multiLine.getPrimitiveAt(i);
411
                EditableFeature targetFeature = targetStore.createNewFeature();
412
                targetFeature.copyFrom(feature, (FeatureAttributeDescriptor t) -> !(t.isPrimaryKey() || (t.isIndexed() && !t.allowIndexDuplicateds()) || t.getType() == org.gvsig.fmap.geom.DataTypes.GEOMETRY));
413
                
414
                if(StringUtils.isNotBlank(config.getTargetColorFieldName())){
415
                    targetFeature.set(config.getTargetColorFieldName(), feature.get(colorFieldName));
416
                }
417
                
418
                if(StringUtils.isNotBlank(config.getTargetLenghtFieldName())){
419
                    targetFeature.set(config.getTargetLenghtFieldName(), line.perimeter());
420
                }
421
                
422
                if(StringUtils.isNotBlank(config.getTargetAreaLenghtFieldName())){
423
                    targetFeature.set(config.getTargetLenghtFieldName(), line.area());
424
                }
425
                
426
                targetFeature.setDefaultGeometry(geometry);
427
                targetStore.insert(targetFeature);
428
            }
429
        }
430
    }
431

    
432
    private EditableFeatureType createTargetFeatureType(FeatureStore store) {
433
        DataManager dataManager = DALLocator.getDataManager();
434

    
435
        EditableFeatureType featureType = dataManager.createFeatureType();
436
        featureType.addAll(store.getDefaultFeatureTypeQuietly());
437
        for (FeatureAttributeDescriptor attr : featureType) {
438
            EditableFeatureAttributeDescriptor eattr = (EditableFeatureAttributeDescriptor)attr;
439
            eattr.setIsPrimaryKey(false);
440
            eattr.setIsIndexed(false);
441
            eattr.setAllowNull(true);
442
        }
443

    
444
        EditableFeatureAttributeDescriptor attr = (EditableFeatureAttributeDescriptor) featureType.getDefaultGeometryAttribute();
445
        attr.setGeometryType(Geometry.TYPES.POLYGON, Geometry.SUBTYPES.GEOM2D);
446

    
447
        return featureType;
448
    }
449

    
450
    private FeatureStore createTemporalStore(EditableFeatureType featType) {
451
        if (featType.getStore() != null) {
452
            throw new IllegalArgumentException("Can't create temporal store from a feature type of a already existent store.");
453
        }
454
        try {
455
            // crear ruta de archivo temporal
456
            FoldersManager foldersManager = ToolsLocator.getFoldersManager();
457
            File tempFile = foldersManager.getUniqueTemporaryFile("urbanHorizontalSignage_temporal_store_" + UUID.randomUUID().toString());
458

    
459
            // crear SERVER STORE
460
            DataManager dataManager = DALLocator.getDataManager();
461
            JDBCServerExplorerParameters serverParameters = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters("H2Spatial");
462
            ((HasAFile) serverParameters).setFile(tempFile);
463
            JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial", serverParameters);
464

    
465
            //Crear tablas en server store
466
            JDBCNewStoreParameters parametersResults = serverExplorer.getAddParameters();
467
            parametersResults.setDynValue("Table", "results");
468

    
469
            parametersResults.setDefaultFeatureType(featType);
470
            serverExplorer.add("H2Spatial", parametersResults, true);
471

    
472
            DataStoreParameters storeParametersResults = dataManager.createStoreParameters("H2Spatial");
473
            storeParametersResults.setDynValue("database_file", tempFile);
474
            storeParametersResults.setDynValue("Table", "results");
475

    
476
            //Creaci?n del store con los resultados
477
            FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial", storeParametersResults);
478

    
479
            return storeResults;
480
        } catch (Exception ex) {
481
            LOGGER.debug("Can't create temporal store.", ex);
482
            return null;
483
        }
484
    }
485

    
486
    @Override
487
    public PictureMarkerSymbolTableLegend createPictureMarkerSymbolTableLegend() {
488
        return new DefaultPictureMarkerSymbolTableLegend();
489
    }
490

    
491
    @Override
492
    public Class<? extends PictureMarkerSymbolTableLegend> getPictureMarkerSymbolTableLegendClass() {
493
        return DefaultPictureMarkerSymbolTableLegend.class;
494
    }
495
    
496
    
497

    
498
}