--- /dev/null
+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);
+ }
+ }
+
+}