in endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/jts/Wrapper.java [391:496]
protected Object operationSameCRS(final SQLMM operation, final GeometryWrapper other, final Object argument) {
/*
* For all operation producing a geometry, the result is collected for post-processing.
* For all other kinds of value, the result is returned directly in the switch statement.
*/
final Geometry result;
switch (operation) {
case ST_IsMeasured: return Boolean.FALSE;
case ST_Dimension: return geometry.getDimension();
case ST_SRID: return geometry.getSRID();
case ST_IsEmpty: return geometry.isEmpty();
case ST_IsSimple: return geometry.isSimple();
case ST_IsValid: return geometry.isValid();
case ST_Envelope: return getEnvelope();
case ST_Boundary: result = geometry.getBoundary(); break;
case ST_ConvexHull: result = geometry.convexHull(); break;
case ST_Buffer: result = geometry.buffer(((Number) argument).doubleValue()); break;
case ST_Intersection: result = geometry.intersection (((Wrapper) other).geometry); break;
case ST_Union: result = geometry.union (((Wrapper) other).geometry); break;
case ST_Difference: result = geometry.difference (((Wrapper) other).geometry); break;
case ST_SymDifference: result = geometry.symDifference(((Wrapper) other).geometry); break;
case ST_Distance: return geometry.distance (((Wrapper) other).geometry);
case ST_Equals: return geometry.equalsTopo (((Wrapper) other).geometry);
case ST_Relate: return geometry.relate (((Wrapper) other).geometry, argument.toString());
case ST_Disjoint: return geometry.disjoint (((Wrapper) other).geometry);
case ST_Intersects: return geometry.intersects (((Wrapper) other).geometry);
case ST_Touches: return geometry.touches (((Wrapper) other).geometry);
case ST_Crosses: return geometry.crosses (((Wrapper) other).geometry);
case ST_Within: return geometry.within (((Wrapper) other).geometry);
case ST_Contains: return geometry.contains (((Wrapper) other).geometry);
case ST_Overlaps: return geometry.overlaps (((Wrapper) other).geometry);
case ST_AsText: return new WKTWriter().write(geometry); // WKTWriter() constructor is cheap.
case ST_AsBinary: return FilteringContext.writeWKB(geometry);
case ST_X: return ((Point) geometry).getX();
case ST_Y: return ((Point) geometry).getY();
case ST_Z: return ((Point) geometry).getCoordinate().getZ();
case ST_ToLineString: return geometry; // JTS does not have curves.
case ST_NumGeometries: return geometry.getNumGeometries();
case ST_NumPoints: return geometry.getNumPoints();
case ST_PointN: result = ((LineString) geometry).getPointN(toIndex(argument)); break;
case ST_StartPoint: result = ((LineString) geometry).getStartPoint(); break;
case ST_EndPoint: result = ((LineString) geometry).getEndPoint(); break;
case ST_IsClosed: return ((LineString) geometry).isClosed();
case ST_IsRing: return ((LineString) geometry).isRing();
case ST_Perimeter: // Fallthrough: length is the perimeter for polygons.
case ST_Length: return geometry.getLength();
case ST_Area: return geometry.getArea();
case ST_Centroid: result = geometry.getCentroid(); break;
case ST_PointOnSurface: result = geometry.getInteriorPoint(); break;
case ST_ExteriorRing: result = ((Polygon) geometry).getExteriorRing(); break;
case ST_InteriorRingN: result = ((Polygon) geometry).getInteriorRingN(toIndex(argument)); break;
case ST_NumInteriorRings: return ((Polygon) geometry).getNumInteriorRing();
case ST_GeometryN: result = geometry.getGeometryN(toIndex(argument)); break;
case ST_ToPoint:
case ST_ToPolygon:
case ST_ToMultiPoint:
case ST_ToMultiLine:
case ST_ToMultiPolygon:
case ST_ToGeomColl: {
final GeometryType target = operation.getGeometryType().get();
final Class<?> type = getGeometryClass(target);
if (type.isInstance(geometry)) {
return geometry;
}
result = convert(target);
break;
}
case ST_Is3D: {
final Coordinate c = geometry.getCoordinate();
return (c != null) ? !Double.isNaN(c.z) : null;
}
case ST_CoordDim: {
final Coordinate c = geometry.getCoordinate();
return (c != null) ? Double.isNaN(c.z) ? Geometries.BIDIMENSIONAL : Geometries.TRIDIMENSIONAL : null;
}
case ST_GeometryType: {
for (int i=0; i < TYPES.length; i++) {
if (TYPES[i].isInstance(geometry)) {
return SQLMM_NAMES[i];
}
}
return null;
}
case ST_ExplicitPoint: {
final Coordinate c = ((Point) geometry).getCoordinate();
if (c == null) return ArraysExt.EMPTY_DOUBLE;
final double x = c.getX();
final double y = c.getY();
final double z = c.getZ();
return Double.isNaN(z) ? new double[] {x, y} : new double[] {x, y, z};
}
case ST_Simplify: {
final double distance = ((Number) argument).doubleValue();
result = DouglasPeuckerSimplifier.simplify(geometry, distance);
break;
}
case ST_SimplifyPreserveTopology: {
final double distance = ((Number) argument).doubleValue();
result = TopologyPreservingSimplifier.simplify(geometry, distance);
break;
}
default: return super.operationSameCRS(operation, other, argument);
}
JTS.copyMetadata(geometry, result);
return result;
}