View Javadoc
1   /*
2    * Copyright 2022 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * The json to geometry converter.
31   *
32   * @author Christian Bremer
33   */
34  public class JsonToGeometryConverter extends AbstractJsonToGeometryConverter {
35  
36    @Serial
37    private static final long serialVersionUID = 1L;
38  
39    /**
40     * The Point converter.
41     */
42    private final JsonToPointConverter pointConverter;
43  
44    /**
45     * The Line string converter.
46     */
47    private final JsonToLineStringConverter lineStringConverter;
48  
49    /**
50     * The Polygon converter.
51     */
52    private final JsonToPolygonConverter polygonConverter;
53  
54    /**
55     * The Multi point converter.
56     */
57    private final JsonToMultiPointConverter multiPointConverter;
58  
59    /**
60     * The Multi line string converter.
61     */
62    private final JsonToMultiLineStringConverter multiLineStringConverter;
63  
64    /**
65     * The Multi polygon converter.
66     */
67    private final JsonToMultiPolygonConverter multiPolygonConverter;
68  
69    /**
70     * Instantiates a new json to geometry converter.
71     */
72    public JsonToGeometryConverter() {
73      this(new GeometryFactory());
74    }
75  
76    /**
77     * Instantiates a new json to geometry converter.
78     *
79     * @param geometryFactory the geometry factory
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    * Convert geometry.
107    *
108    * @param source the source
109    * @return the geometry
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         //noinspection unchecked
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 }