1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.bremersee.geojson.converter.deserialization;
18
19 import static java.util.Objects.isNull;
20
21 import java.io.Serial;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Objects;
25 import org.bremersee.geojson.GeoJsonConstants;
26 import org.locationtech.jts.geom.Geometry;
27 import org.locationtech.jts.geom.GeometryFactory;
28
29
30
31
32
33
34 public class JsonToGeometryConverter extends AbstractJsonToGeometryConverter {
35
36 @Serial
37 private static final long serialVersionUID = 1L;
38
39
40
41
42 private final JsonToPointConverter pointConverter;
43
44
45
46
47 private final JsonToLineStringConverter lineStringConverter;
48
49
50
51
52 private final JsonToPolygonConverter polygonConverter;
53
54
55
56
57 private final JsonToMultiPointConverter multiPointConverter;
58
59
60
61
62 private final JsonToMultiLineStringConverter multiLineStringConverter;
63
64
65
66
67 private final JsonToMultiPolygonConverter multiPolygonConverter;
68
69
70
71
72 public JsonToGeometryConverter() {
73 this(new GeometryFactory());
74 }
75
76
77
78
79
80
81 public JsonToGeometryConverter(GeometryFactory geometryFactory) {
82 super(geometryFactory);
83 ObjectToCoordinateConverter coordinateConverter = new ObjectToCoordinateConverter();
84 ObjectToCoordinateSequenceConverter coordinateSequenceConverter
85 = new ObjectToCoordinateSequenceConverter(coordinateConverter);
86
87 pointConverter = new JsonToPointConverter(getGeometryFactory(), coordinateConverter);
88 lineStringConverter = new JsonToLineStringConverter(
89 getGeometryFactory(),
90 coordinateSequenceConverter);
91 polygonConverter = new JsonToPolygonConverter(
92 getGeometryFactory(),
93 coordinateSequenceConverter);
94 multiPointConverter = new JsonToMultiPointConverter(
95 getGeometryFactory(),
96 pointConverter);
97 multiLineStringConverter = new JsonToMultiLineStringConverter(
98 getGeometryFactory(),
99 lineStringConverter);
100 multiPolygonConverter = new JsonToMultiPolygonConverter(
101 getGeometryFactory(),
102 polygonConverter);
103 }
104
105
106
107
108
109
110
111 public Geometry convert(Map<String, Object> source) {
112 if (isNull(source)) {
113 return null;
114 }
115 String type = String.valueOf(source.get(GeoJsonConstants.TYPE));
116 if (GeoJsonConstants.POINT.equals(type)) {
117 return pointConverter.convert(source);
118
119 } else if (GeoJsonConstants.LINESTRING.equals(type)) {
120 return lineStringConverter.convert(source);
121
122 } else if (GeoJsonConstants.POLYGON.equals(type)) {
123 return polygonConverter.convert(source);
124
125 } else if (GeoJsonConstants.MULTI_POINT.equals(type)) {
126 return multiPointConverter.convert(source);
127
128 } else if (GeoJsonConstants.MULTI_LINESTRING.equals(type)) {
129 return multiLineStringConverter.convert(source);
130
131 } else if (GeoJsonConstants.MULTI_POLYGON.equals(type)) {
132 return multiPolygonConverter.convert(source);
133
134 } else if (GeoJsonConstants.GEOMETRY_COLLECTION.equals(type)) {
135 Geometry[] geometries;
136 Object value = source.get(GeoJsonConstants.GEOMETRIES);
137 if (isNull(value)) {
138 geometries = new Geometry[0];
139 } else {
140
141 geometries = ((List<Map<String, Object>>) value)
142 .stream()
143 .map(this::convert)
144 .filter(Objects::nonNull)
145 .toArray(Geometry[]::new);
146 }
147 return getGeometryFactory().createGeometryCollection(geometries);
148 }
149
150 throw new IllegalArgumentException(String.format("Illegal geometry: %s", source));
151 }
152
153 }