From: Mathieu Baudier Date: Fri, 12 May 2023 10:08:01 +0000 (+0200) Subject: Convert from ODK geoshape to GPX X-Git-Tag: v2.3.14~6 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=585aefe69e95959e3634de701eeb6b6af79b467f Convert from ODK geoshape to GPX --- diff --git a/org.argeo.app.core/src/org/argeo/app/geo/GpxUtils.java b/org.argeo.app.core/src/org/argeo/app/geo/GpxUtils.java index 5bb7d5c..645b08b 100644 --- a/org.argeo.app.core/src/org/argeo/app/geo/GpxUtils.java +++ b/org.argeo.app.core/src/org/argeo/app/geo/GpxUtils.java @@ -2,8 +2,14 @@ package org.argeo.app.geo; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.StringTokenizer; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -25,7 +31,7 @@ import org.xml.sax.helpers.DefaultHandler; /** Utilities around the GPX format. */ public class GpxUtils { - public static SimpleFeature parseGpxToPolygon(InputStream in) { + public static SimpleFeature parseGpxToPolygon(InputStream in) throws IOException { try { final SimpleFeatureType TYPE = DataUtilities.createType("Area", "the_geom:Polygon:srid=4326"); SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE); @@ -56,11 +62,37 @@ public class GpxUtils { featureBuilder.add(polygon); SimpleFeature area = featureBuilder.buildFeature(null); return area; - } catch (ParserConfigurationException | SAXException | IOException | SchemaException e) { + } catch (ParserConfigurationException | SAXException | SchemaException e) { throw new RuntimeException("Cannot convert GPX", e); } } + public static void writeGeoShapeAsGpx(String geoShape, OutputStream out) throws IOException { + Objects.requireNonNull(geoShape); + Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); + writer.append(""); + StringTokenizer stSeg = new StringTokenizer(geoShape.trim(), ";"); + while (stSeg.hasMoreTokens()) { + StringTokenizer stPt = new StringTokenizer(stSeg.nextToken().trim(), " "); + String lat = stPt.nextToken(); + String lng = stPt.nextToken(); + String alt = stPt.nextToken(); + // String precision = stPt.nextToken(); + writer.append("'); + writer.append("").append(alt).append(""); + writer.append(""); + } else { + writer.append("/>"); + } + } + writer.append(""); + writer.flush(); + } + /** Singleton. */ private GpxUtils() { }