Adapt to changes in GeoTools
[gpl/argeo-suite.git] / org.argeo.app.geo / src / org / argeo / app / geo / GpxUtils.java
index 15f6b89675e5a03cf16bc03882271baa36ce6f5b..dcd205ab39ab33d5f990f860db245e5407b55631 100644 (file)
@@ -15,6 +15,8 @@ import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
 import org.geotools.data.DataUtilities;
 import org.geotools.feature.SchemaException;
 import org.geotools.feature.simple.SimpleFeatureBuilder;
@@ -22,9 +24,8 @@ import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.MultiPoint;
 import org.locationtech.jts.geom.Polygon;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -52,7 +53,7 @@ public class GpxUtils {
         */
        @SuppressWarnings("unchecked")
        public static <T> T parseGpxTrackTo(InputStream in, Class<T> clss) throws IOException {
-               GeometryFactory geometryFactory = GeoTools.GEOMETRY_FACTORY;
+               GeometryFactory geometryFactory = JTS.GEOMETRY_FACTORY_WGS84;
                List<Coordinate> coordinates = new ArrayList<>();
                try {
                        SAXParserFactory factory = SAXParserFactory.newInstance();
@@ -81,14 +82,21 @@ public class GpxUtils {
                        LineString lineString = geometryFactory
                                        .createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
                        return (T) lineString;
+               } else if (MultiPoint.class.isAssignableFrom(clss)) {
+                       MultiPoint multiPoint = geometryFactory
+                                       .createMultiPointFromCoords(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       // multiPoint.normalize();
+                       return (T) multiPoint;
                } else if (Polygon.class.isAssignableFrom(clss)) {
-                       // close the line string
-                       coordinates.add(coordinates.get(0));
+                       Coordinate first = coordinates.get(0);
+                       Coordinate last = coordinates.get(coordinates.size() - 1);
+                       if (!(first.getX() == last.getX() && first.getY() == last.getY())) {
+                               // close the line string
+                               coordinates.add(first);
+                       }
                        Polygon polygon = geometryFactory.createPolygon(coordinates.toArray(new Coordinate[coordinates.size()]));
                        return (T) polygon;
-               }
-               // TODO MultiPoint? MultiLine? etc.
-               else if (SimpleFeature.class.isAssignableFrom(clss)) {
+               } else if (SimpleFeature.class.isAssignableFrom(clss)) {
                        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(LINESTRING_FEATURE_TYPE);
                        LineString lineString = geometryFactory
                                        .createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
@@ -99,7 +107,7 @@ public class GpxUtils {
                        throw new IllegalArgumentException("Unsupported format " + clss);
                }
        }
-
+       
        /** @deprecated Use {@link #parseGpxTrackTo(InputStream, Class)} instead. */
        @Deprecated
        public static SimpleFeature parseGpxToPolygon(InputStream in) throws IOException {
@@ -110,7 +118,7 @@ public class GpxUtils {
                return area;
        }
 
-       /** Write ODK GepShape as a GPX file. */
+       /** Write ODK GeoShape as a GPX file. */
        public static void writeGeoShapeAsGpx(String geoShape, OutputStream out) throws IOException {
                Objects.requireNonNull(geoShape);
                Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);