Work on geo to SVG.
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 28 Jan 2021 09:10:58 +0000 (10:10 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 28 Jan 2021 09:10:58 +0000 (10:10 +0100)
dep/org.argeo.suite.dep.ui.rap/pom.xml
environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java [deleted file]
environment/org.argeo.geo.ui/src/org/argeo/geo/GeoToSvg.java [new file with mode: 0644]

index ad52013171f097afefe255c285dd32951a418890..9fe9e6a4072cb4c028ae65c07c6f6eaf746c7fe6 100644 (file)
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.suite</groupId>
@@ -49,7 +51,7 @@
                        <artifactId>org.argeo.suite.ui.rap</artifactId>
                        <version>2.1.18-SNAPSHOT</version>
                </dependency>
-               
+
                <!-- Argeo People -->
                <dependency>
                        <groupId>org.argeo.suite</groupId>
                        <groupId>org.argeo.tp.javax</groupId>
                        <artifactId>javax.xml.bind</artifactId>
                </dependency>
-               
+
+               <!-- Jackson JSON processor -->
+               <dependency>
+                       <groupId>org.argeo.tp.jackson</groupId>
+                       <artifactId>com.fasterxml.jackson.core.jackson-core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.jackson</groupId>
+                       <artifactId>com.fasterxml.jackson.core.jackson-databind</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.jackson</groupId>
+                       <artifactId>com.fasterxml.jackson.core.jackson-annotations</artifactId>
+               </dependency>
+
                <!-- PDFBox -->
                <dependency>
                        <groupId>org.argeo.tp.apache</groupId>
                        <groupId>org.argeo.tp.apache</groupId>
                        <artifactId>org.apache.xerces</artifactId>
                </dependency>
-               
+
                <!-- POI (MS office documents) -->
                <dependency>
                        <groupId>org.argeo.tp.apache</groupId>
                </dependency>
 
                <!-- Argeo TP Extras -->
-<!--           <dependency> -->
-<!--                   <groupId>org.argeo.tp.payment</groupId> -->
-<!--                   <artifactId>com.stripe</artifactId> -->
-<!--           </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.payment</groupId> -->
+               <!-- <artifactId>com.stripe</artifactId> -->
+               <!-- </dependency> -->
 
        </dependencies>
        <profiles>
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java
deleted file mode 100644 (file)
index 6a45c0d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.argeo.geo;
-
-public class GeoJsonToSvg {
-
-}
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoToSvg.java b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoToSvg.java
new file mode 100644 (file)
index 0000000..4d593f2
--- /dev/null
@@ -0,0 +1,69 @@
+package org.argeo.geo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/** Converts a geographical feature to an SVG. */
+public class GeoToSvg {
+       public void convertGeoJsonToSvg(Path source, Path target) {
+               ObjectMapper objectMapper = new ObjectMapper();
+               try (InputStream in = Files.newInputStream(source);
+                               Writer out = Files.newBufferedWriter(target, StandardCharsets.UTF_8)) {
+                       JsonNode tree = objectMapper.readTree(in);
+                       JsonNode coord = tree.get("features").get(0).get("geometry").get("coordinates");
+                       double ratio = 100;
+                       double minX = Double.POSITIVE_INFINITY;
+                       double maxX = Double.NEGATIVE_INFINITY;
+                       double minY = Double.POSITIVE_INFINITY;
+                       double maxY = Double.NEGATIVE_INFINITY;
+                       List<String> shapes = new ArrayList<>();
+                       for (JsonNode shape : coord) {
+                               StringBuffer sb = new StringBuffer();
+                               sb.append("<polyline style=\"stroke-width:0.00000003;stroke:#000000;\" points=\"");
+                               for (JsonNode latlng : shape) {
+                                       double lat = latlng.get(0).asDouble();
+                                       double y = lat * ratio;
+                                       if (y < minY)
+                                               minY = y;
+                                       if (y > maxY)
+                                               maxY = y;
+                                       double lng = latlng.get(1).asDouble();
+                                       double x = lng * ratio;
+                                       if (x < minX)
+                                               minX = x;
+                                       if (x > maxX)
+                                               maxX = x;
+                                       sb.append(y + "," + x + " ");
+                               }
+                               sb.append("\">");
+                               sb.append("</polyline>\n");
+                               shapes.add(sb.toString());
+                       }
+
+                       double width = maxX - minX;
+                       double height = maxY - minY;
+                       out.write("<svg xmlns=\"http://www.w3.org/2000/svg\"\n");
+                       out.write(" width=\"" + (int) (width * 1000) + "\"\n");
+                       out.write(" height=\"" + (int) (height * 1000) + "\"\n");
+                       out.write(" viewBox=\"" + minX + "," + minY + "," + width + "," + height + "\"\n");
+                       out.write(">\n");
+                       for (String shape : shapes) {
+                               out.write(shape);
+                               out.write("\n");
+                       }
+                       out.write("</svg>");
+               } catch (IOException e) {
+                       throw new RuntimeException("Cannot convert " + source + " to " + target, e);
+               }
+       }
+
+}