Skip to content
Snippets Groups Projects
Commit 66b5495a authored by Zhibin Mai's avatar Zhibin Mai
Browse files

Merge branch 'geoshape_decimation' of...

parents 7a1171a8 21051872
Branches
Tags
1 merge request!387Geoshape decimation
Showing
with 76 additions and 97 deletions
......@@ -17,7 +17,7 @@ package org.opengroup.osdu.indexer.model.geojson;
import java.util.ArrayList;
import java.util.List;
public abstract class Geometry<T> extends GeoJsonObject {
public abstract class Geometry<T> extends GeoJsonObject implements Positioned {
protected List<T> coordinates = new ArrayList<T>();
......
......@@ -27,7 +27,7 @@ import java.util.List;
@JsonSerialize(using = GeometryCollectionSerializer.class)
public class GeometryCollection extends GeoJsonObject implements Iterable<GeoJsonObject> {
private List<GeoJsonObject> geometries = new ArrayList<GeoJsonObject>();
private List<GeoJsonObject> geometries = new ArrayList<>();
@Override
public Iterator<GeoJsonObject> iterator() {
......
......@@ -15,9 +15,11 @@
package org.opengroup.osdu.indexer.model.geojson;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.util.List;
import lombok.NoArgsConstructor;
import org.opengroup.osdu.indexer.model.geojson.jackson.CoordinatesDeserializer;
import org.opengroup.osdu.indexer.model.geojson.jackson.GeoJsonConstants;
import java.util.List;
@NoArgsConstructor
public class LineString extends MultiPoint {
......@@ -31,4 +33,9 @@ public class LineString extends MultiPoint {
public void setCoordinates(List<Position> coordinates) {
super.setCoordinates(coordinates);
}
@Override
public String getType() {
return GeoJsonConstants.LINE_STRING;
}
}
......@@ -17,6 +17,7 @@ package org.opengroup.osdu.indexer.model.geojson;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.util.List;
import lombok.NoArgsConstructor;
import org.opengroup.osdu.indexer.model.geojson.jackson.GeoJsonConstants;
import org.opengroup.osdu.indexer.model.geojson.jackson.MultiLineStringDeserializer;
@NoArgsConstructor
......@@ -31,4 +32,9 @@ public class MultiLineString extends Geometry<List<Position>> {
public void setCoordinates(List<List<Position>> coordinates) {
super.setCoordinates(coordinates);
}
@Override
public String getType() {
return GeoJsonConstants.MULTI_LINE_STRING;
}
}
......@@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.util.List;
import lombok.NoArgsConstructor;
import org.opengroup.osdu.indexer.model.geojson.jackson.CoordinatesDeserializer;
import org.opengroup.osdu.indexer.model.geojson.jackson.GeoJsonConstants;
@NoArgsConstructor
public class MultiPoint extends Geometry<Position> {
......@@ -31,4 +32,9 @@ public class MultiPoint extends Geometry<Position> {
public void setCoordinates(List<Position> coordinates) {
super.setCoordinates(coordinates);
}
@Override
public String getType() {
return GeoJsonConstants.MULTI_POINT;
}
}
......@@ -17,6 +17,7 @@ package org.opengroup.osdu.indexer.model.geojson;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.util.List;
import lombok.NoArgsConstructor;
import org.opengroup.osdu.indexer.model.geojson.jackson.GeoJsonConstants;
import org.opengroup.osdu.indexer.model.geojson.jackson.MultiPolygonDeserializer;
@NoArgsConstructor
......@@ -36,4 +37,9 @@ public class MultiPolygon extends Geometry<List<List<Position>>> {
public void setCoordinates(List<List<List<Position>>> coordinates) {
super.setCoordinates(coordinates);
}
@Override
public String getType() {
return GeoJsonConstants.MULTI_POLYGON;
}
}
......@@ -18,13 +18,14 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.opengroup.osdu.indexer.model.geojson.jackson.GeoJsonConstants;
import org.opengroup.osdu.indexer.model.geojson.jackson.PointDeserializer;
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonDeserialize(using = PointDeserializer.class)
public class Point extends GeoJsonObject {
public class Point extends GeoJsonObject implements Positioned {
private Position coordinates;
......@@ -35,4 +36,9 @@ public class Point extends GeoJsonObject {
public Point(double longitude, double latitude, double altitude) {
coordinates = new Position(longitude, latitude, altitude);
}
@Override
public String getType() {
return GeoJsonConstants.POINT;
}
}
......@@ -16,6 +16,7 @@ package org.opengroup.osdu.indexer.model.geojson;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.NoArgsConstructor;
import org.opengroup.osdu.indexer.model.geojson.jackson.GeoJsonConstants;
import java.util.Arrays;
import java.util.List;
......@@ -31,6 +32,11 @@ public class Polygon extends Geometry<List<Position>> {
add(Arrays.asList(polygon));
}
@Override
public String getType() {
return GeoJsonConstants.POLYGON;
}
public void setExteriorRing(List<Position> points) {
if (coordinates.isEmpty()) {
coordinates.add(0, points);
......
package org.opengroup.osdu.indexer.model.geojson;
/**
* @author Andrei_Dalhikh
*/
public interface Positioned {
Object getCoordinates();
String getType();
}
......@@ -19,7 +19,10 @@ import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import org.opengroup.osdu.indexer.model.geojson.*;
import org.opengroup.osdu.indexer.model.geojson.GeoJsonObject;
import org.opengroup.osdu.indexer.model.geojson.GeometryCollection;
import org.opengroup.osdu.indexer.model.geojson.Positioned;
import java.io.IOException;
public class GeometryCollectionSerializer extends JsonSerializer<GeometryCollection> {
......@@ -38,41 +41,16 @@ public class GeometryCollectionSerializer extends JsonSerializer<GeometryCollect
@Override
public void serializeWithType(GeometryCollection value, JsonGenerator jsonGenerator, SerializerProvider provider, TypeSerializer typeSerializer)
throws IOException {
throws IOException {
serialize(value, jsonGenerator, provider);
}
private void serializeGeoShape(GeoJsonObject geoJsonObject, JsonGenerator jsonGenerator) throws IOException {
if (geoJsonObject instanceof Point) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, GeoJsonConstants.POINT);
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((Point) geoJsonObject).getCoordinates());
jsonGenerator.writeEndObject();
} else if (geoJsonObject instanceof LineString) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, GeoJsonConstants.LINE_STRING);
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((LineString) geoJsonObject).getCoordinates());
jsonGenerator.writeEndObject();
} else if (geoJsonObject instanceof Polygon) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, GeoJsonConstants.POLYGON);
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((Polygon) geoJsonObject).getCoordinates());
jsonGenerator.writeEndObject();
} else if (geoJsonObject instanceof MultiPoint) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, GeoJsonConstants.MULTI_POINT);
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((MultiPoint) geoJsonObject).getCoordinates());
jsonGenerator.writeEndObject();
} else if (geoJsonObject instanceof MultiLineString) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, GeoJsonConstants.MULTI_LINE_STRING);
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((MultiLineString) geoJsonObject).getCoordinates());
jsonGenerator.writeEndObject();
} else if (geoJsonObject instanceof MultiPolygon) {
if(geoJsonObject instanceof Positioned) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, GeoJsonConstants.MULTI_POLYGON);
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((MultiPolygon) geoJsonObject).getCoordinates());
jsonGenerator.writeStringField(GeoJsonConstants.TYPE, ((Positioned)geoJsonObject).getType());
jsonGenerator.writeObjectField(GeoJsonConstants.COORDINATES, ((Positioned)geoJsonObject).getCoordinates());
jsonGenerator.writeEndObject();
}
}
......
......@@ -15,8 +15,14 @@
package org.opengroup.osdu.indexer.util.geo.decimator;
import org.opengroup.osdu.indexer.model.geojson.*;
import org.apache.commons.collections.CollectionUtils;
import org.opengroup.osdu.indexer.model.geojson.GeoJsonObject;
import org.opengroup.osdu.indexer.model.geojson.Geometry;
import org.opengroup.osdu.indexer.model.geojson.GeometryCollection;
import org.opengroup.osdu.indexer.model.geojson.MultiPoint;
import org.opengroup.osdu.indexer.model.geojson.Position;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
......@@ -46,77 +52,25 @@ public class GeometryDecimator {
return decimated;
}
private boolean decimate(MultiLineString geometry, double epsilon) {
if(geometry == null || geometry.getCoordinates() == null)
@SuppressWarnings("unchecked")
private boolean decimate(List<?> coordinates, double epsilon) {
if(CollectionUtils.isEmpty(coordinates))
return false;
boolean decimated = false;
for(List<Position> coordinates : geometry.getCoordinates()) {
decimated |= decimateLine(coordinates, epsilon);
}
return decimated;
}
private boolean decimate(LineString geometry, double epsilon) {
if(geometry == null)
return false;
return decimateLine(geometry.getCoordinates(), epsilon);
}
private boolean decimate(MultiPolygon geometry, double epsilon) {
if(geometry == null || geometry.getCoordinates() == null)
return false;
boolean decimated = false;
for(List<List<Position>> polygon : geometry.getCoordinates()) {
for(List<Position> coordinates : polygon) {
decimated |= decimateLine(coordinates, epsilon);
Object firstElement = coordinates.get(0);
if(firstElement instanceof List){
for(Object coordinatesElement : coordinates) {
decimated |= decimate((List<?>) coordinatesElement, epsilon);
}
} else if(firstElement instanceof Position){
decimated = decimateLine((List<Position>) coordinates, epsilon);
}
return decimated;
}
private boolean decimate(Polygon geometry, double epsilon) {
if(geometry == null || geometry.getCoordinates() == null)
return false;
boolean decimated = false;
for(List<Position> coordinates : geometry.getCoordinates()) {
decimated |= decimateLine(coordinates, epsilon);
}
return decimated;
}
private boolean decimate(Point geometry, double epsilon) {
return false;
}
private boolean decimate(MultiPoint geometry, double epsilon) {
return false;
}
private boolean decimateBasicGeometry(GeoJsonObject geometry, double epsilon) {
if(geometry instanceof MultiLineString) {
return decimate((MultiLineString) geometry, epsilon);
}
else if(geometry instanceof LineString) {
return decimate((LineString)geometry, epsilon);
}
else if(geometry instanceof MultiPolygon) {
return decimate((MultiPolygon)geometry, epsilon);
}
else if(geometry instanceof Polygon) {
return decimate((Polygon)geometry, epsilon);
}
else if(geometry instanceof Point) {
return decimate((Point)geometry, epsilon);
}
else if(geometry instanceof MultiPoint) {
return decimate((MultiPoint)geometry, epsilon);
}
else
return false;
return geometry instanceof Geometry && !(geometry instanceof MultiPoint) && decimate(((Geometry<?>) geometry).getCoordinates(), epsilon);
}
private boolean decimateLine(List<Position> coordinates, double epsilon) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment