|
|
|
|
@ -24,6 +24,7 @@ import java.util.Map;
@@ -24,6 +24,7 @@ import java.util.Map;
|
|
|
|
|
import java.util.TreeMap; |
|
|
|
|
|
|
|
|
|
import org.bson.Document; |
|
|
|
|
|
|
|
|
|
import org.springframework.core.convert.converter.Converter; |
|
|
|
|
import org.springframework.data.convert.ReadingConverter; |
|
|
|
|
import org.springframework.data.convert.WritingConverter; |
|
|
|
|
@ -44,12 +45,10 @@ import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
@@ -44,12 +45,10 @@ import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
|
|
|
|
|
import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; |
|
|
|
|
import org.springframework.data.mongodb.core.geo.Sphere; |
|
|
|
|
import org.springframework.data.mongodb.core.query.GeoCommand; |
|
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
import org.springframework.util.NumberUtils; |
|
|
|
|
import org.springframework.util.ObjectUtils; |
|
|
|
|
|
|
|
|
|
import com.mongodb.BasicDBList; |
|
|
|
|
import com.mongodb.Function; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -61,9 +60,9 @@ import com.mongodb.Function;
@@ -61,9 +60,9 @@ import com.mongodb.Function;
|
|
|
|
|
* @author Thiago Diniz da Silveira |
|
|
|
|
* @since 1.5 |
|
|
|
|
*/ |
|
|
|
|
@SuppressWarnings("ConstantConditions") |
|
|
|
|
abstract class GeoConverters { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final static Map<String, Function<Document, GeoJson<?>>> converters; |
|
|
|
|
|
|
|
|
|
static { |
|
|
|
|
@ -93,7 +92,6 @@ abstract class GeoConverters {
@@ -93,7 +92,6 @@ abstract class GeoConverters {
|
|
|
|
|
* |
|
|
|
|
* @return never {@literal null}. |
|
|
|
|
*/ |
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
public static Collection<? extends Object> getConvertersToRegister() { |
|
|
|
|
return Arrays.asList( //
|
|
|
|
|
BoxToDocumentConverter.INSTANCE //
|
|
|
|
|
@ -464,7 +462,7 @@ abstract class GeoConverters {
@@ -464,7 +462,7 @@ abstract class GeoConverters {
|
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List argument = new ArrayList(); |
|
|
|
|
List<Object> argument = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
Shape shape = source.getShape(); |
|
|
|
|
|
|
|
|
|
@ -502,8 +500,7 @@ abstract class GeoConverters {
@@ -502,8 +500,7 @@ abstract class GeoConverters {
|
|
|
|
|
* @author Christoph Strobl |
|
|
|
|
* @since 1.7 |
|
|
|
|
*/ |
|
|
|
|
@SuppressWarnings("rawtypes") |
|
|
|
|
enum GeoJsonToDocumentConverter implements Converter<GeoJson, Document> { |
|
|
|
|
enum GeoJsonToDocumentConverter implements Converter<GeoJson<?>, Document> { |
|
|
|
|
|
|
|
|
|
INSTANCE; |
|
|
|
|
|
|
|
|
|
@ -512,7 +509,7 @@ abstract class GeoConverters {
@@ -512,7 +509,7 @@ abstract class GeoConverters {
|
|
|
|
|
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object) |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public Document convert(GeoJson source) { |
|
|
|
|
public Document convert(GeoJson<?> source) { |
|
|
|
|
|
|
|
|
|
if (source == null) { |
|
|
|
|
return null; |
|
|
|
|
@ -522,33 +519,33 @@ abstract class GeoConverters {
@@ -522,33 +519,33 @@ abstract class GeoConverters {
|
|
|
|
|
|
|
|
|
|
if (source instanceof GeoJsonGeometryCollection) { |
|
|
|
|
|
|
|
|
|
List dbl = new ArrayList(); |
|
|
|
|
List<Object> dbl = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
for (GeoJson geometry : ((GeoJsonGeometryCollection) source).getCoordinates()) { |
|
|
|
|
for (GeoJson<?> geometry : ((GeoJsonGeometryCollection) source).getCoordinates()) { |
|
|
|
|
dbl.add(convert(geometry)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dbo.put("geometries", dbl); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
dbo.put("coordinates", convertIfNecessarry(source.getCoordinates())); |
|
|
|
|
dbo.put("coordinates", convertIfNecessary(source.getCoordinates())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return dbo; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Object convertIfNecessarry(Object candidate) { |
|
|
|
|
private Object convertIfNecessary(Object candidate) { |
|
|
|
|
|
|
|
|
|
if (candidate instanceof GeoJson) { |
|
|
|
|
return convertIfNecessarry(((GeoJson) candidate).getCoordinates()); |
|
|
|
|
return convertIfNecessary(((GeoJson<?>) candidate).getCoordinates()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (candidate instanceof Iterable) { |
|
|
|
|
if (candidate instanceof Iterable<?>) { |
|
|
|
|
|
|
|
|
|
List dbl = new ArrayList(); |
|
|
|
|
List<Object> dbl = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
for (Object element : (Iterable) candidate) { |
|
|
|
|
dbl.add(convertIfNecessarry(element)); |
|
|
|
|
for (Object element : (Iterable<?>) candidate) { |
|
|
|
|
dbl.add(convertIfNecessary(element)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return dbl; |
|
|
|
|
@ -648,7 +645,7 @@ abstract class GeoConverters {
@@ -648,7 +645,7 @@ abstract class GeoConverters {
|
|
|
|
|
Assert.isTrue(ObjectUtils.nullSafeEquals(source.get("type"), "Polygon"), |
|
|
|
|
String.format("Cannot convert type '%s' to Polygon.", source.get("type"))); |
|
|
|
|
|
|
|
|
|
return toGeoJsonPolygon((List) source.get("coordinates")); |
|
|
|
|
return toGeoJsonPolygon((List<?>) source.get("coordinates")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -674,11 +671,11 @@ abstract class GeoConverters {
@@ -674,11 +671,11 @@ abstract class GeoConverters {
|
|
|
|
|
Assert.isTrue(ObjectUtils.nullSafeEquals(source.get("type"), "MultiPolygon"), |
|
|
|
|
String.format("Cannot convert type '%s' to MultiPolygon.", source.get("type"))); |
|
|
|
|
|
|
|
|
|
List dbl = (List) source.get("coordinates"); |
|
|
|
|
List<?> dbl = (List<?>) source.get("coordinates"); |
|
|
|
|
List<GeoJsonPolygon> polygones = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
for (Object polygon : dbl) { |
|
|
|
|
polygones.add(toGeoJsonPolygon((List) polygon)); |
|
|
|
|
polygones.add(toGeoJsonPolygon((List<?>) polygon)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return new GeoJsonMultiPolygon(polygones); |
|
|
|
|
@ -707,7 +704,7 @@ abstract class GeoConverters {
@@ -707,7 +704,7 @@ abstract class GeoConverters {
|
|
|
|
|
Assert.isTrue(ObjectUtils.nullSafeEquals(source.get("type"), "LineString"), |
|
|
|
|
String.format("Cannot convert type '%s' to LineString.", source.get("type"))); |
|
|
|
|
|
|
|
|
|
List cords = (List) source.get("coordinates"); |
|
|
|
|
List<?> cords = (List<?>) source.get("coordinates"); |
|
|
|
|
|
|
|
|
|
return new GeoJsonLineString(toListOfPoint(cords)); |
|
|
|
|
} |
|
|
|
|
@ -735,7 +732,7 @@ abstract class GeoConverters {
@@ -735,7 +732,7 @@ abstract class GeoConverters {
|
|
|
|
|
Assert.isTrue(ObjectUtils.nullSafeEquals(source.get("type"), "MultiPoint"), |
|
|
|
|
String.format("Cannot convert type '%s' to MultiPoint.", source.get("type"))); |
|
|
|
|
|
|
|
|
|
List cords = (List) source.get("coordinates"); |
|
|
|
|
List<?> cords = (List<?>) source.get("coordinates"); |
|
|
|
|
|
|
|
|
|
return new GeoJsonMultiPoint(toListOfPoint(cords)); |
|
|
|
|
} |
|
|
|
|
@ -763,11 +760,11 @@ abstract class GeoConverters {
@@ -763,11 +760,11 @@ abstract class GeoConverters {
|
|
|
|
|
Assert.isTrue(ObjectUtils.nullSafeEquals(source.get("type"), "MultiLineString"), |
|
|
|
|
String.format("Cannot convert type '%s' to MultiLineString.", source.get("type"))); |
|
|
|
|
|
|
|
|
|
List<GeoJsonLineString> lines = new ArrayList<GeoJsonLineString>(); |
|
|
|
|
List cords = (List) source.get("coordinates"); |
|
|
|
|
List<GeoJsonLineString> lines = new ArrayList<>(); |
|
|
|
|
List<?> cords = (List<?>) source.get("coordinates"); |
|
|
|
|
|
|
|
|
|
for (Object line : cords) { |
|
|
|
|
lines.add(new GeoJsonLineString(toListOfPoint((List) line))); |
|
|
|
|
lines.add(new GeoJsonLineString(toListOfPoint((List<?>) line))); |
|
|
|
|
} |
|
|
|
|
return new GeoJsonMultiLineString(lines); |
|
|
|
|
} |
|
|
|
|
@ -810,16 +807,16 @@ abstract class GeoConverters {
@@ -810,16 +807,16 @@ abstract class GeoConverters {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Converts a coordinate pairs nested in in {@link BasicDBList} into {@link GeoJsonPoint}s. |
|
|
|
|
* Converts a coordinate pairs nested in {@link List} into {@link GeoJsonPoint}s. |
|
|
|
|
* |
|
|
|
|
* @param listOfCoordinatePairs must not be {@literal null}. |
|
|
|
|
* @return never {@literal null}. |
|
|
|
|
* @since 1.7 |
|
|
|
|
*/ |
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
static List<Point> toListOfPoint(List listOfCoordinatePairs) { |
|
|
|
|
static List<Point> toListOfPoint(List<?> listOfCoordinatePairs) { |
|
|
|
|
|
|
|
|
|
List<Point> points = new ArrayList<>(); |
|
|
|
|
List<Point> points = new ArrayList<>(listOfCoordinatePairs.size()); |
|
|
|
|
|
|
|
|
|
for (Object point : listOfCoordinatePairs) { |
|
|
|
|
|
|
|
|
|
@ -834,16 +831,16 @@ abstract class GeoConverters {
@@ -834,16 +831,16 @@ abstract class GeoConverters {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Converts a coordinate pairs nested in in {@link BasicDBList} into {@link GeoJsonPolygon}. |
|
|
|
|
* Converts a coordinate pairs nested in {@link List} into {@link GeoJsonPolygon}. |
|
|
|
|
* |
|
|
|
|
* @param dbList must not be {@literal null}. |
|
|
|
|
* @return never {@literal null}. |
|
|
|
|
* @since 1.7 |
|
|
|
|
*/ |
|
|
|
|
static GeoJsonPolygon toGeoJsonPolygon(List dbList) { |
|
|
|
|
static GeoJsonPolygon toGeoJsonPolygon(List<?> dbList) { |
|
|
|
|
|
|
|
|
|
GeoJsonPolygon polygon = new GeoJsonPolygon(toListOfPoint((List) dbList.get(0))); |
|
|
|
|
return dbList.size() > 1 ? polygon.withInnerRing(toListOfPoint((List) dbList.get(1))) : polygon; |
|
|
|
|
GeoJsonPolygon polygon = new GeoJsonPolygon(toListOfPoint((List<?>) dbList.get(0))); |
|
|
|
|
return dbList.size() > 1 ? polygon.withInnerRing(toListOfPoint((List<?>) dbList.get(1))) : polygon; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -854,17 +851,11 @@ abstract class GeoConverters {
@@ -854,17 +851,11 @@ abstract class GeoConverters {
|
|
|
|
|
* @author Christoph Strobl |
|
|
|
|
*/ |
|
|
|
|
@ReadingConverter |
|
|
|
|
enum DocumentToGeoJsonConverter implements Converter<Document, GeoJson> { |
|
|
|
|
enum DocumentToGeoJsonConverter implements Converter<Document, GeoJson<?>> { |
|
|
|
|
INSTANCE; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* (non-Javadoc) |
|
|
|
|
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object) |
|
|
|
|
*/ |
|
|
|
|
@Nullable |
|
|
|
|
@Override |
|
|
|
|
public GeoJson convert(Document source) { |
|
|
|
|
public GeoJson<?> convert(Document source) { |
|
|
|
|
return toGenericGeoJson(source); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -873,22 +864,21 @@ abstract class GeoConverters {
@@ -873,22 +864,21 @@ abstract class GeoConverters {
|
|
|
|
|
|
|
|
|
|
String type = source.get("type", String.class); |
|
|
|
|
|
|
|
|
|
if(type != null) { |
|
|
|
|
if (type != null) { |
|
|
|
|
|
|
|
|
|
Function<Document, GeoJson<?>> converter = converters.get(type); |
|
|
|
|
|
|
|
|
|
if(converter != null){ |
|
|
|
|
if (converter != null) { |
|
|
|
|
return converter.apply(source); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
throw new IllegalArgumentException( |
|
|
|
|
String.format("No converter found capable of converting GeoJson type %s.", type)); |
|
|
|
|
throw new IllegalArgumentException(String.format("No converter found capable of converting GeoJson type %s.", type)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static double toPrimitiveDoubleValue(Object value) { |
|
|
|
|
|
|
|
|
|
Assert.isInstanceOf(Number.class, value, "Argument must be a Number."); |
|
|
|
|
return NumberUtils.convertNumberToTargetClass((Number) value, Double.class).doubleValue(); |
|
|
|
|
return NumberUtils.convertNumberToTargetClass((Number) value, Double.class); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|