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