From 585aefe69e95959e3634de701eeb6b6af79b467f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 12 May 2023 12:08:01 +0200 Subject: [PATCH] Convert from ODK geoshape to GPX --- .../src/org/argeo/app/geo/GpxUtils.java | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) 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() { } -- 2.30.2