Revision 45690 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.geometry/org.gvsig.fmap.geometry.jts/src/main/java/org/gvsig/fmap/geom/jts/coerce/CoerceToGeometry.java

View differences:

CoerceToGeometry.java
76 76
        Geometry sourcegeom = null;
77 77
        try {
78 78
//            TODO: descomentarizar para que tengan efecto los cambios.
79
//            if ( context instanceof GeometryCoercionContext) {
80
//                GeometryCoercionContext geomContext = (GeometryCoercionContext) context;
81
//                targetGeometryType = geomContext.getGeometryType();
82
//                mode = geomContext.getMode();
83
//            }
79
            if ( context instanceof GeometryCoercionContext) {
80
                GeometryCoercionContext geomContext = (GeometryCoercionContext) context;
81
                targetGeometryType = geomContext.getGeometryType();
82
                mode = geomContext.getMode();
83
            }
84 84
            
85 85
            if ( value instanceof Geometry ) {
86 86
                geom = (Geometry) value;
......
115 115
            }
116 116
            switch (targetGeometryType.getType()) {
117 117
                case Geometry.TYPES.MULTIPOINT:
118
                    geom = this.convertToMultipoint(targetGeometryType, geom);
118
                    geom = geom.toPoints();
119 119
                    break;
120 120
                case Geometry.TYPES.MULTILINE:
121
                    geom = this.convertToMultiline(targetGeometryType, geom);
121
                    geom = geom.toLines();
122 122
                    break;
123 123
                case Geometry.TYPES.MULTIPOLYGON:
124
                    geom = this.convertToMultipolygon(targetGeometryType, geom);
124
                    geom = geom.toPolygons();
125 125
                    break;
126 126
                case Geometry.TYPES.POINT:
127 127
                    geom = this.convertToPoint(targetGeometryType, geom);
......
133 133
                    geom = this.convertToPolygon(targetGeometryType, geom);
134 134
                    break;
135 135
                case Geometry.TYPES.GEOMETRY:
136
                    geom = this.convertToGeometry(targetGeometryType, geom);
136
                    //Do not convert
137 137
                    break;
138 138
                default:
139 139
                    geom = null;
......
172 172
        return manager;
173 173
    }
174 174

  
175
    private Geometry convertToMultipoint(GeometryType geometryType, Geometry geom) {
176
        try {
177
            MultiPoint target = null;
178
            switch (geom.getType()) {
179
                case Geometry.TYPES.POINT:
180
                    target = (MultiPoint) geometryType.create();
181
                    target.addPoint((Point) geom);
182
                    break;
183
                case Geometry.TYPES.LINE:
184
                    if( geometryType.getSubType() == geom.getGeometryType().getSubType() ) {
185
                        target = ((Line) geom).toPoints();
186
                    } else {
187
                        target = (MultiPoint) geometryType.create();
188
                        for (Point point : convertPoints(geometryType, ((Line) geom).toPoints().iterator())) {
189
                            
190
                        }
191
                        target.addPoint((Point) geom);
192
                    }
193
                    break;
194
                case Geometry.TYPES.POLYGON:
195
                    target = ((Polygon) geom).toPoints();
196
                    break;
197
                case Geometry.TYPES.MULTILINE:
198
                    target = ((MultiLine) geom).toPoints();
199
                    break;
200
                case Geometry.TYPES.MULTIPOLYGON:
201
                    target = ((MultiPolygon) geom).toPoints();
202
                    break;
203
            }
204
            return target;
205
        } catch (Exception ex) {
206
            return null;
207
        }
208
    }
209

  
210
    private Geometry convertToMultiline(GeometryType geometryType, Geometry geom) {
211
        try {
212
            MultiLine target = null;
213
            switch (geom.getType()) {
214
                case Geometry.TYPES.LINE:
215
                    target = (MultiLine) geometryType.create();
216
                    target.addPrimitive((Primitive) geom);
217
                    break;
218
                case Geometry.TYPES.POLYGON:
219
                    target = (MultiLine) geometryType.create();
220
                    target.addPrimitive((Primitive) ((Polygon) geom).toLines());
221
                    break;
222
                case Geometry.TYPES.MULTIPOLYGON:
223
                    target = (MultiLine) geometryType.create();
224
                    for (Geometry polygon : ((MultiPolygon) geom)) {
225
                        target.addPrimitive((Primitive) ((Polygon) polygon).toLines());
226
                    }
227
                    break;
228
            }
229
            return target;
230
        } catch (Exception ex) {
231
            return null;
232
        }
233
    }
234

  
235
    private Geometry convertToMultipolygon(GeometryType geometryType, Geometry geom) {
236
        try {
237
            MultiPolygon target = null;
238
            switch (geom.getType()) {
239
                case Geometry.TYPES.LINE:
240
                    target = (MultiPolygon) geometryType.create();
241
                    Polygon polygon = getManager().createPolygon(geometryType.getSubType());
242
                    for (Point point : (Line)geom ) {
243
                        polygon.addVertex(point);
244
                    }
245
                    if( !polygon.isClosed() )  {
246
                        polygon.addVertex(polygon.getVertex(0));
247
                    }
248
                    target.addPrimitive(polygon);
249
                    break;
250

  
251
                case Geometry.TYPES.POLYGON:
252
                    target = (MultiPolygon) geometryType.create();
253
                    target.addPrimitive((Primitive) ((Polygon) geom));
254
                    break;
255
            }
256
            return target;
257
        } catch (Exception ex) {
258
            return null;
259
        }
260
    }
261

  
262 175
    private Geometry convertToPoint(GeometryType geometryType, Geometry geom) {
263 176
        try {
264 177
            Point target = null;
265
            switch (geom.getType()) {
266
                case Geometry.TYPES.MULTIPOINT:
267
                    MultiPoint multi = (MultiPoint)geom;
268
                    if( multi.getPrimitivesNumber()==1 ) {
269
                        target = (Point) multi.getPrimitiveAt(0);
270
                    }
271
                    break;
272

  
178
            MultiPoint points = geom.toPoints();
179
            if(points.getPrimitivesNumber() == 1){
180
               target = (Point) points.getPrimitiveAt(0); 
273 181
            }
274 182
            return target;
275 183
        } catch (Exception ex) {
......
280 188
    private Geometry convertToLine(GeometryType geometryType, Geometry geom) {
281 189
        try {
282 190
            Line target = null;
283
            MultiLine multiline;
284
            MultiPolygon multipolygon;
285
            switch (geom.getType()) {
286
                case Geometry.TYPES.MULTILINE:
287
                    multiline = (MultiLine)geom;
288
                    if( multiline.getPrimitivesNumber()==1 ) {
289
                        target = (Line) multiline.getPrimitiveAt(0);
290
                    }
291
                    break;
292
                case Geometry.TYPES.POLYGON:
293
                    multiline = ((Polygon)geom).toLines();
294
                    if( multiline.getPrimitivesNumber()==1 ) {
295
                        target = (Line) multiline.getPrimitiveAt(0);
296
                    }
297
                    break;
298
                case Geometry.TYPES.MULTIPOLYGON:
299
                    multipolygon = (MultiPolygon)geom;
300
                    if( multipolygon.getPrimitivesNumber()==1 ) {
301
                        multiline = multipolygon.getPrimitiveAt(0).toLines();
302
                        if( multiline.getPrimitivesNumber()==1 ) {
303
                            target = (Line) multiline.getPrimitiveAt(0);
304
                        }
305
                    }
306
                    break;
191
            MultiLine lines = geom.toLines();
192
            if(lines.getPrimitivesNumber() == 1){
193
               target = (Line) lines.getPrimitiveAt(0); 
307 194
            }
308 195
            return target;
309 196
        } catch (Exception ex) {
......
314 201
    private Geometry convertToPolygon(GeometryType geometryType, Geometry geom) {
315 202
        try {
316 203
            Polygon target = null;
317
            switch (geom.getType()) {
318
                case Geometry.TYPES.LINE:
319
                    target = (Polygon) geometryType.create();
320
                    for (Point point : (Line)geom ) {
321
                        target.addVertex(point);
322
                    }
323
                    if( !target.isClosed() )  {
324
                        target.addVertex(target.getVertex(0));
325
                    }
326
                    break;
327
                case Geometry.TYPES.MULTILINE:
328
                    MultiLine multiline = (MultiLine)geom;
329
                    if( multiline.getPrimitivesNumber()==1 ) {
330
                        target = (Polygon) geometryType.create();
331
                        for (Point point : (Line) multiline.getPrimitiveAt(0) ) {
332
                            target.addVertex(point);
333
                        }
334
                        if( !target.isClosed() )  {
335
                            target.addVertex(target.getVertex(0));
336
                        }
337
                    }
338
                    break;
339
                case Geometry.TYPES.MULTIPOLYGON:
340
                    MultiPolygon multipolygon = (MultiPolygon)geom;
341
                    if( multipolygon.getPrimitivesNumber()==1 ) {
342
                        target = (Polygon) multipolygon.getPrimitiveAt(0);
343
                    }
344
                    break;
204
            MultiPolygon polygons = geom.toPolygons();
205
            if(polygons.getPrimitivesNumber() == 1){
206
               target = (Polygon) polygons.getPrimitiveAt(0); 
345 207
            }
346 208
            return target;
347 209
        } catch (Exception ex) {
......
349 211
        }
350 212
    }
351 213

  
352
    private Geometry convertToGeometry(GeometryType geometryType, Geometry geom) {
353
        try {
354
            if( geom instanceof AbstractGeometry ) {
355
                ((AbstractGeometry)geom).setGeometryType(geometryType);
356
                return geom;
357
            }
358
            return null;
359
        } catch (Exception ex) {
360
            return null;
361
        }
362
    }
363

  
364
    private Iterable<Point> convertPoints(GeometryType geometryType, Iterator<Geometry> pointIterator) {
365
        Iterable<Point> iterable = () -> {
366
            Iterator<Point> iterator = new Iterator<Point>() {
367
                @Override
368
                public boolean hasNext() {
369
                    return pointIterator.hasNext();
370
                }
371
                
372
                @Override
373
                public Point next() {
374
                    Point sourcePoint = (Point) pointIterator.next();
375
                    if( geometryType.hasZ() ) {
376
                        if( geometryType.hasM() ) {
377
                            return sourcePoint.force3DM();
378
                        } else {
379
                            return (Point) sourcePoint.force3D();
380
                        }
381
                    } else if( geometryType.hasM() ) {
382
                        return sourcePoint.force2DM();
383
                    } else {
384
                        try {
385
                            return (Point) sourcePoint.force2D();
386
                        } catch (Exception ex) {
387
                            throw new RuntimeException(ex);
388
                        }
389
                    }
390
                }
391
            };
392
            return iterator;
393
        };
394
        return iterable;
395
    }
396

  
397

  
398 214
}

Also available in: Unified diff