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 @ 5141

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

    
76
public class DefaultUrbanHorizontalSignageManager implements UrbanHorizontalSignageManager {
77

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

    
80
    @Override
81
    public UrbanHorizontalSignageLegend create() {
82
        return new DefaultUrbanHorizontalSignageLegend();
83
    }
84

    
85
    @Override
86
    public Class<? extends UrbanHorizontalSignageLegend> getLegendClass() {
87
        return DefaultUrbanHorizontalSignageLegend.class;
88
    }
89

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

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

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

    
206
                }
207

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

    
218
    }
219

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

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

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

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

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

    
338
        return res;
339
    }
340

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

    
358
    /*friend*/ static class SplittedLine {
359

    
360
        List<Line> segments;
361
        List<Line> holes;
362

    
363
        public SplittedLine() {
364
            segments = new ArrayList<>();
365
            holes = new ArrayList<>();
366
        }
367

    
368
        public List<Line> getSegments() {
369
            return this.segments;
370
        }
371

    
372
        public List<Line> getHoles() {
373
            return this.holes;
374
        }
375

    
376
        public void addSegment(Line segment) {
377
            this.segments.add(segment);
378
        }
379

    
380
        public void addHole(Line hole) {
381
            this.holes.add(hole);
382
        }
383

    
384
    }
385
    
386
    public FeatureStore convertLinesToPolygons(FeatureSet sourceFeatureSet, UrbanHorizontalSignageConfig config, SimpleTaskStatus status) {
387
        
388
        //TODO: el status....
389
        UrbanHorizontalSignageManager uhsManager = UrbanHorizontalSignageLocator.getUrbanHorizontalSignageManager();
390
        EditableFeatureType targetFeatureType = createTargetFeatureType(sourceFeatureSet.getFeatureStore());
391
        FeatureStore targetStore = createTemporalStore(targetFeatureType);
392
        try {
393
            targetStore.edit(FeatureStore.MODE_APPEND);
394

    
395
            for (Feature feature : sourceFeatureSet) {
396

    
397
                Geometry originalGeometry = feature.getDefaultGeometry();
398

    
399
                UrbanHorizontalSignageData data = config.getValues(feature);
400

    
401
                uhsManager.calculateGeometries(originalGeometry, data);
402

    
403
                MultiPolygon multiGeom = data.getSegmentsGeometry();
404
                MultiLine multiLine = data.getLineSegmentsGeometry();
405
                fillTargetFeature(multiGeom, multiLine, targetStore, feature, config, config.getSegmentsColorFieldName());
406

    
407
                switch (data.getContinuity()) {
408
                    case CONTINUITY_MODE_CONT_DISC:
409
                    case CONTINUITY_MODE_DISC_CONT:
410
                    case CONTINUITY_MODE_DISC:
411
                    case CONTINUITY_MODE_DISC_DISC:
412
                        if (data.isPaintHoles()) {
413
                            multiGeom = data.getHolesGeometry();
414
                            multiLine = data.getLineHolesGeometry();
415
                            fillTargetFeature(multiGeom, multiLine, targetStore, feature, config, config.getHolesColorFieldName());
416
                        }
417
                }
418

    
419
            }
420

    
421
            targetStore.finishEditing();
422
            return targetStore;
423

    
424
        } catch (Exception e) {
425
            LOGGER.debug("Can't create temporary polygons store.", e);
426
        }
427

    
428
        return null;
429
    }
430

    
431
    private void fillTargetFeature(MultiPolygon multiGeom, MultiLine multiLine, FeatureStore targetStore, Feature feature, UrbanHorizontalSignageConfig config, String colorFieldName) throws GeometryOperationNotSupportedException, GeometryOperationException, DataException {
432
        if (multiGeom != null && multiGeom.getPrimitivesNumber() > 0) {
433
            for (int i = 0; i < multiGeom.getPrimitivesNumber(); i++) {
434
                Polygon geometry = (Polygon) multiGeom.getPrimitiveAt(i);
435
                Line line = (Line) multiLine.getPrimitiveAt(i);
436
                EditableFeature targetFeature = targetStore.createNewFeature();
437
                targetFeature.copyFrom(feature, (FeatureAttributeDescriptor t) -> !(t.isPrimaryKey() || (t.isIndexed() && !t.allowIndexDuplicateds()) || t.getType() == org.gvsig.fmap.geom.DataTypes.GEOMETRY));
438
                
439
                if(StringUtils.isNotBlank(config.getTargetColorFieldName())){
440
                    targetFeature.set(config.getTargetColorFieldName(), feature.get(colorFieldName));
441
                }
442
                
443
                if(StringUtils.isNotBlank(config.getTargetLenghtFieldName())){
444
                    targetFeature.set(config.getTargetLenghtFieldName(), line.perimeter());
445
                }
446
                
447
                if(StringUtils.isNotBlank(config.getTargetAreaLenghtFieldName())){
448
                    targetFeature.set(config.getTargetLenghtFieldName(), line.area());
449
                }
450
                
451
                targetFeature.setDefaultGeometry(geometry);
452
                targetStore.insert(targetFeature);
453
            }
454
        }
455
    }
456

    
457
    private EditableFeatureType createTargetFeatureType(FeatureStore store) {
458
        DataManager dataManager = DALLocator.getDataManager();
459

    
460
        EditableFeatureType featureType = dataManager.createFeatureType();
461
        featureType.addAll(store.getDefaultFeatureTypeQuietly());
462
        for (FeatureAttributeDescriptor attr : featureType) {
463
            EditableFeatureAttributeDescriptor eattr = (EditableFeatureAttributeDescriptor)attr;
464
            eattr.setIsPrimaryKey(false);
465
            eattr.setIsIndexed(false);
466
            eattr.setAllowNull(true);
467
        }
468

    
469
        EditableFeatureAttributeDescriptor attr = (EditableFeatureAttributeDescriptor) featureType.getDefaultGeometryAttribute();
470
        attr.setGeometryType(Geometry.TYPES.POLYGON, Geometry.SUBTYPES.GEOM2D);
471

    
472
        return featureType;
473
    }
474

    
475
    private FeatureStore createTemporalStore(EditableFeatureType featType) {
476
        if (featType.getStore() != null) {
477
            throw new IllegalArgumentException("Can't create temporal store from a feature type of a already existent store.");
478
        }
479
        try {
480
            // crear ruta de archivo temporal
481
            FoldersManager foldersManager = ToolsLocator.getFoldersManager();
482
            File tempFile = foldersManager.getUniqueTemporaryFile("urbanHorizontalSignage_temporal_store_" + UUID.randomUUID().toString());
483

    
484
            // crear SERVER STORE
485
            DataManager dataManager = DALLocator.getDataManager();
486
            JDBCServerExplorerParameters serverParameters = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters("H2Spatial");
487
            ((HasAFile) serverParameters).setFile(tempFile);
488
            JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial", serverParameters);
489

    
490
            //Crear tablas en server store
491
            JDBCNewStoreParameters parametersResults = serverExplorer.getAddParameters();
492
            parametersResults.setDynValue("Table", "results");
493

    
494
            parametersResults.setDefaultFeatureType(featType);
495
            serverExplorer.add("H2Spatial", parametersResults, true);
496

    
497
            DataStoreParameters storeParametersResults = dataManager.createStoreParameters("H2Spatial");
498
            storeParametersResults.setDynValue("database_file", tempFile);
499
            storeParametersResults.setDynValue("Table", "results");
500

    
501
            //Creaci?n del store con los resultados
502
            FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial", storeParametersResults);
503

    
504
            return storeResults;
505
        } catch (Exception ex) {
506
            LOGGER.debug("Can't create temporal store.", ex);
507
            return null;
508
        }
509
    }
510

    
511

    
512

    
513
}