use of org.geotoolkit.gml.xml.MultiGeometry in project geotoolkit by Geomatys.
the class LinearReferencing method project.
/**
* Project the geometry on the segments.
* The result can be a Point/MultiPoint/LineString/MultiLinestring over the segments.
*/
public static Geometry project(SegmentInfo[] segments, Geometry geometry) {
ArgumentChecks.ensureNonNull("geometry", geometry);
Geometry geom;
if (geometry instanceof MultiGeometry) {
final int nbGeom = geometry.getNumGeometries();
final List<Geometry> geometries = new ArrayList<>();
for (int i = 0; i < nbGeom; i++) {
final Geometry geometryN = geometry.getGeometryN(i);
geometries.add(project(segments, geometryN));
}
geom = GO2Utilities.JTS_FACTORY.buildGeometry(geometries);
} else if (geometry instanceof Point) {
final ProjectedPoint pf = projectReference(segments, (Point) geometry);
geom = GO2Utilities.JTS_FACTORY.createPoint(pf.projected);
} else if (geometry instanceof LineString || geometry instanceof Polygon) {
final Coordinate[] coordinates = geometry.getCoordinates();
final Point pt = GO2Utilities.JTS_FACTORY.createPoint(coordinates[0]);
final TreeMap<Double, Coordinate> map = new TreeMap<>();
for (Coordinate crd : coordinates) {
pt.getCoordinate().setCoordinate(crd);
final ProjectedPoint pf = projectReference(segments, pt);
map.put(pf.distanceAlongLinear, pf.projected);
}
geom = GO2Utilities.JTS_FACTORY.createLineString(map.values().toArray(new Coordinate[0]));
} else {
throw new IllegalArgumentException("Unsupported geometry type : " + geometry);
}
geom.setSRID(geometry.getSRID());
geom.setUserData(geometry.getUserData());
return geom;
}
use of org.geotoolkit.gml.xml.MultiGeometry in project geotoolkit by Geomatys.
the class GeometryTransformer method get.
/**
* Procede to conversion from GML to JTS.
* @return Created JTS geometry. Never null, but can be an emptry geometry.
* @throws UnconvertibleObjectException If we don't know how to process
* source GML geometry.
*/
@Override
public Geometry get() throws UnconvertibleObjectException {
Geometry geometry;
/*
* SIMPLE CASES
*/
if (source instanceof org.geotoolkit.gml.xml.Point) {
geometry = accumulateAndBuild(coords -> (coords.length > 0 ? GF.createPoint(coords[0]) : GF.createPoint((Coordinate) null)));
} else if (source instanceof org.geotoolkit.gml.xml.LineString) {
geometry = accumulateAndBuild(GF::createLineString);
} else if (source instanceof org.geotoolkit.gml.xml.LinearRing) {
geometry = accumulateAndBuild(GF::createLinearRing);
} else if (source instanceof Curve) {
geometry = convertCurve((Curve) source);
} else if (source instanceof Envelope) {
geometry = convertEnvelope((Envelope) source);
/*
* COMPOSED GEOMETRIES
*/
} else if (source instanceof org.geotoolkit.gml.xml.Ring) {
geometry = convertRing((Ring) source);
} else if (source instanceof org.geotoolkit.gml.xml.Polygon) {
geometry = convertPolygon((org.geotoolkit.gml.xml.Polygon) source);
if (isForceMultiPolygon()) {
Polygon[] polys = { (Polygon) geometry };
final MultiPolygon result = GF.createMultiPolygon(polys);
applyCRS(result);
geometry = result;
}
} else if (source instanceof AbstractSurface) {
if (source instanceof SurfaceType) {
geometry = convertSurface((SurfaceType) source);
} else if (source instanceof org.geotoolkit.gml.xml.v311.SurfaceType) {
geometry = convertSurface((org.geotoolkit.gml.xml.v311.SurfaceType) source);
} else // TODO : complex case
{
throw new IllegalArgumentException("Unsupported geometry type : " + source.getClass());
}
/*
* GEOMETRY COLLECTIONS
*/
} else if (source instanceof org.geotoolkit.gml.xml.MultiPoint) {
geometry = convertMultiPoint((org.geotoolkit.gml.xml.MultiPoint) source);
} else if (source instanceof org.geotoolkit.gml.xml.MultiLineString) {
geometry = convertMultiLineString((org.geotoolkit.gml.xml.MultiLineString) source);
} else if (source instanceof MultiCurve) {
geometry = convertMultiCurve((MultiCurve) source);
} else if (source instanceof org.geotoolkit.gml.xml.MultiPolygon) {
geometry = convertMultiPolygon((org.geotoolkit.gml.xml.MultiPolygon) source);
} else if (source instanceof MultiSurface) {
geometry = convertMultiSurface((MultiSurface) source);
} else if (source instanceof MultiGeometry) {
geometry = convertMultiGeometry((MultiGeometry) source);
} else {
throw new IllegalArgumentException("Unsupported geometry type : " + source.getClass());
}
// store identifier in user map
final String id = source.getId();
if (id != null && !id.isEmpty()) {
Object userData = geometry.getUserData();
Map values;
if (userData instanceof Map) {
values = (Map) userData;
} else if (userData instanceof CoordinateReferenceSystem) {
values = new HashMap();
values.put(org.apache.sis.internal.feature.jts.JTS.CRS_KEY, userData);
} else if (userData == null) {
values = new HashMap();
} else {
throw new IllegalArgumentException("Unexpected user data object : " + userData);
}
values.put("@id", id);
geometry.setUserData(values);
}
return geometry;
}
use of org.geotoolkit.gml.xml.MultiGeometry in project geotoolkit by Geomatys.
the class GeometryTransformer method convertMultiGeometry.
private GeometryCollection convertMultiGeometry(MultiGeometry mg) {
Geometry[] geometries = mg.getGeometryMember().stream().map(GeometryProperty::getAbstractGeometry).map(geom -> new GeometryTransformer(geom, this).get()).toArray(size -> new Geometry[size]);
final GeometryCollection result = GF.createGeometryCollection(geometries);
applyCRS(result);
return result;
}
Aggregations