]> git.argeo.org Git - gpl/argeo-suite.git/blob - argeo/app/geo/GeoJSon.java
Prepare next development cycle
[gpl/argeo-suite.git] / argeo / app / geo / GeoJSon.java
1 package org.argeo.app.geo;
2
3 import org.locationtech.jts.geom.Coordinate;
4 import org.locationtech.jts.geom.Envelope;
5 import org.locationtech.jts.geom.Geometry;
6 import org.locationtech.jts.geom.LineString;
7 import org.locationtech.jts.geom.LinearRing;
8 import org.locationtech.jts.geom.Point;
9 import org.locationtech.jts.geom.Polygon;
10
11 import jakarta.json.stream.JsonGenerator;
12
13 /**
14 * GeoJSon format.
15 *
16 * @see https://datatracker.ietf.org/doc/html/rfc7946
17 */
18 public class GeoJSon {
19 public static void writeBBox(JsonGenerator generator, Geometry geometry) {
20 generator.writeStartArray("bbox");
21 Envelope envelope = geometry.getEnvelopeInternal();
22 generator.write(envelope.getMinX());
23 generator.write(envelope.getMinY());
24 generator.write(envelope.getMaxX());
25 generator.write(envelope.getMaxY());
26 generator.writeEnd();
27 }
28
29 public static void writeGeometry(JsonGenerator generator, Geometry geometry) {
30 generator.writeStartObject("geometry");
31 if (geometry instanceof Point point) {
32 generator.write("type", "Point");
33 generator.writeStartArray("coordinates");
34 writeCoordinate(generator, point.getCoordinate());
35 generator.writeEnd();// coordinates array
36 } else if (geometry instanceof LineString lineString) {
37 generator.write("type", "LineString");
38 generator.writeStartArray("coordinates");
39 writeCoordinates(generator, lineString.getCoordinates());
40 generator.writeEnd();// coordinates array
41 } else if (geometry instanceof Polygon polygon) {
42 generator.write("type", "Polygon");
43 generator.writeStartArray("coordinates");
44 LinearRing exteriorRing = polygon.getExteriorRing();
45 generator.writeStartArray();
46 writeCoordinates(generator, exteriorRing.getCoordinates());
47 generator.writeEnd();
48 for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
49 LinearRing interiorRing = polygon.getInteriorRingN(i);
50 // TODO verify that holes are clockwise
51 generator.writeStartArray();
52 writeCoordinates(generator, interiorRing.getCoordinates());
53 generator.writeEnd();
54 }
55 generator.writeEnd();// coordinates array
56 }
57 generator.writeEnd();// geometry object
58 }
59
60 public static void writeCoordinates(JsonGenerator generator, Coordinate[] coordinates) {
61 for (Coordinate coordinate : coordinates) {
62 generator.writeStartArray();
63 writeCoordinate(generator, coordinate);
64 generator.writeEnd();
65 }
66 }
67
68 public static void writeCoordinate(JsonGenerator generator, Coordinate coordinate) {
69 generator.write(coordinate.getX());
70 generator.write(coordinate.getY());
71 double z = coordinate.getZ();
72 if (!Double.isNaN(z)) {
73 generator.write(z);
74 }
75 }
76
77 /** singleton */
78 private GeoJSon() {
79 }
80
81 }