Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions services-geojson/src/main/java/com/mapbox/geojson/Point.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
import com.mapbox.geojson.gson.BoundingBoxSerializer;
import com.mapbox.geojson.gson.CoordinateTypeAdapter;
import com.mapbox.geojson.gson.GeoJsonAdapterFactory;
import com.mapbox.geojson.shifter.CoordinateShifterManager;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

/**
Expand Down Expand Up @@ -97,7 +97,8 @@ public static Point fromLngLat(
@FloatRange(from = MIN_LONGITUDE, to = MAX_LONGITUDE) double longitude,
@FloatRange(from = MIN_LATITUDE, to = MAX_LATITUDE) double latitude) {

List<Double> coordinates = Arrays.asList(longitude, latitude);
List<Double> coordinates =
CoordinateShifterManager.getCoordinateShifter().shiftLonLat(longitude, latitude);
return new AutoValue_Point(TYPE, null, coordinates);
}

Expand All @@ -121,7 +122,8 @@ public static Point fromLngLat(
@FloatRange(from = MIN_LATITUDE, to = MAX_LATITUDE) double latitude,
@Nullable BoundingBox bbox) {

List<Double> coordinates = Arrays.asList(longitude, latitude);
List<Double> coordinates =
CoordinateShifterManager.getCoordinateShifter().shiftLonLat(longitude, latitude);
return new AutoValue_Point(TYPE, bbox, coordinates);
}

Expand All @@ -146,9 +148,9 @@ public static Point fromLngLat(
@FloatRange(from = MIN_LATITUDE, to = MAX_LATITUDE) double latitude,
double altitude) {

List<Double> coordinates = Double.isNaN(altitude)
? Arrays.asList(longitude, latitude) :
Arrays.asList(longitude, latitude, altitude);
List<Double> coordinates =
CoordinateShifterManager.getCoordinateShifter().shiftLonLatAlt(longitude, latitude, altitude);

return new AutoValue_Point(TYPE, null, coordinates);
}

Expand All @@ -174,9 +176,8 @@ public static Point fromLngLat(
@FloatRange(from = MIN_LATITUDE, to = MAX_LATITUDE) double latitude,
double altitude, @Nullable BoundingBox bbox) {

List<Double> coordinates = Double.isNaN(altitude)
? Arrays.asList(longitude, latitude) :
Arrays.asList(longitude, latitude, altitude);
List<Double> coordinates =
CoordinateShifterManager.getCoordinateShifter().shiftLonLatAlt(longitude, latitude, altitude);
return new AutoValue_Point(TYPE, bbox, coordinates);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import com.google.gson.JsonSerializer;
import com.mapbox.geojson.BoundingBox;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.shifter.CoordinateShifterManager;

import java.lang.reflect.Type;
import java.util.List;

/**
* Serializer used for converting the {@link BoundingBox} object inside a GeoJson object to a JSON
Expand Down Expand Up @@ -43,18 +45,23 @@ public JsonElement serialize(BoundingBox src, Type typeOfSrc, JsonSerializationC

// Southwest
Point point = src.southwest();
bbox.add(new JsonPrimitive(point.longitude()));
bbox.add(new JsonPrimitive(point.latitude()));
List<Double> unshiftedCoordinates =
CoordinateShifterManager.getCoordinateShifter().unshiftPoint(point);

bbox.add(new JsonPrimitive(unshiftedCoordinates.get(0)));
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(1)));
if (point.hasAltitude()) {
bbox.add(new JsonPrimitive(point.altitude()));
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(2)));
}

// Northeast
point = src.northeast();
bbox.add(new JsonPrimitive(point.longitude()));
bbox.add(new JsonPrimitive(point.latitude()));
unshiftedCoordinates =
CoordinateShifterManager.getCoordinateShifter().unshiftPoint(point);
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(0)));
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(1)));
if (point.hasAltitude()) {
bbox.add(new JsonPrimitive(point.altitude()));
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(2)));
}

return bbox;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import com.mapbox.geojson.shifter.CoordinateShifterManager;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
Expand All @@ -21,11 +23,15 @@ public void write(JsonWriter out, List<Double> value) throws IOException {

out.beginArray();

BigDecimal lon = BigDecimal.valueOf(value.get(0));
// Unshift coordinates
List<Double> unshiftedCoordinates =
CoordinateShifterManager.getCoordinateShifter().unshiftPoint(value);

BigDecimal lon = BigDecimal.valueOf(unshiftedCoordinates.get(0));
String lonString = lon.setScale(7, RoundingMode.HALF_UP)
.stripTrailingZeros().toPlainString();

BigDecimal lat = BigDecimal.valueOf(value.get(1));
BigDecimal lat = BigDecimal.valueOf(unshiftedCoordinates.get(1));
String latString = lat.setScale(7, RoundingMode.HALF_UP)
.stripTrailingZeros().toPlainString();

Expand All @@ -34,7 +40,7 @@ public void write(JsonWriter out, List<Double> value) throws IOException {

// Includes altitude
if (value.size() > 2) {
out.value(value.get(2));
out.value(unshiftedCoordinates.get(2));
}
out.endArray();
}
Expand All @@ -48,6 +54,11 @@ public List<Double> read(JsonReader in) throws IOException {
}
in.endArray();

return coordinates;
if (coordinates.size() > 2) {
return CoordinateShifterManager.getCoordinateShifter()
.shiftLonLatAlt(coordinates.get(0), coordinates.get(1), coordinates.get(2));
}
return CoordinateShifterManager.getCoordinateShifter()
.shiftLonLat(coordinates.get(0), coordinates.get(1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.shifter.CoordinateShifterManager;

import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

/**
* Required to handle the special case where the altitude might be a Double.NaN, which isn't a valid
Expand Down Expand Up @@ -44,11 +46,15 @@ public PointSerializer() {
public JsonElement serialize(Point src, Type typeOfSrc, JsonSerializationContext context) {
JsonArray rawCoordinates = new JsonArray();

BigDecimal lon = BigDecimal.valueOf(src.longitude());
// Unshift coordinates
List<Double> unshiftedCoordinates =
CoordinateShifterManager.getCoordinateShifter().unshiftPoint(src);

BigDecimal lon = BigDecimal.valueOf(unshiftedCoordinates.get(0));
String lonString = lon.setScale(7, RoundingMode.HALF_UP)
.stripTrailingZeros().toPlainString();

BigDecimal lat = BigDecimal.valueOf(src.latitude());
BigDecimal lat = BigDecimal.valueOf(unshiftedCoordinates.get(1));
String latString = lat.setScale(7, RoundingMode.HALF_UP)
.stripTrailingZeros().toPlainString();

Expand All @@ -57,7 +63,7 @@ public JsonElement serialize(Point src, Type typeOfSrc, JsonSerializationContext

// Includes altitude
if (src.hasAltitude()) {
rawCoordinates.add(new JsonPrimitive(src.altitude()));
rawCoordinates.add(new JsonPrimitive(unshiftedCoordinates.get(2)));
}

return rawCoordinates;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.mapbox.geojson.shifter;

import com.mapbox.geojson.Point;

import java.util.List;

/**
* ShifterManager allows the movement of all Point objects according to a custom algorithm.
* Once set, it will be applied to all Point objects created through this method.
*
* @since 4.2.0
*/
public interface CoordinateShifter {

/**
* Shifted coordinate values according to its algorithm.
*
* @param lon unshifted longitude
* @param lat unshifted latitude
* @return shifted longitude, shifted latitude in the form of a List of Double values
* @since 4.2.0
*/
List<Double> shiftLonLat(double lon, double lat);

/**
* Shifted coordinate values according to its algorithm.
*
* @param lon unshifted longitude
* @param lat unshifted latitude
* @param altitude unshifted altitude
* @return shifted longitude, shifted latitude, shifted altitude in the form of a
* List of Double values
* @since 4.2.0
*/
List<Double> shiftLonLatAlt(double lon, double lat, double altitude);

/**
* Unshifted coordinate values according to its algorithm.
*
* @param shiftedPoint shifted point
* @return unshifted longitude, shifted latitude,
* and altitude (if present) in the form of List of Double
* @since 4.2.0
*/
List<Double> unshiftPoint(Point shiftedPoint);


/**
* Unshifted coordinate values according to its algorithm.
*
* @param shiftedCoordinates shifted point
* @return unshifted longitude, shifted latitude,
* and altitude (if present) in the form of List of Double
* @since 4.2.0
*/
List<Double> unshiftPoint(List<Double> shiftedCoordinates);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.mapbox.geojson.shifter;

import com.mapbox.geojson.Point;

import java.util.Arrays;
import java.util.List;

/**
* CoordinateShifterManager keeps track of currently set CoordinateShifter.
*
* @since 4.2.0
*/
public final class CoordinateShifterManager {

private static final CoordinateShifter DEFAULT = new CoordinateShifter() {
@Override
public List<Double> shiftLonLat(double lon, double lat) {
return Arrays.asList(lon, lat);
}

@Override
public List<Double> shiftLonLatAlt(double lon, double lat, double alt) {
return Double.isNaN(alt)
? Arrays.asList(lon, lat) :
Arrays.asList(lon, lat, alt);
}

@Override
public List<Double> unshiftPoint(Point point) {
return point.coordinates();
}

@Override
public List<Double> unshiftPoint(List<Double> coordinates) {
return coordinates;
}
};

private static volatile CoordinateShifter coordinateShifter = DEFAULT;

/**
* Currently set CoordinateShifterManager.
*
* @return Currently set CoordinateShifterManager
* @since 4.2.0
*/
public static CoordinateShifter getCoordinateShifter() {
return coordinateShifter;
}

/**
* Sets CoordinateShifterManager.
*
* @param coordinateShifter CoordinateShifterManager to be set
* @since 4.2.0
*/
public static void setCoordinateShifter(CoordinateShifter coordinateShifter) {
CoordinateShifterManager.coordinateShifter =
coordinateShifter == null ? DEFAULT : coordinateShifter;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/**
* Contains Utility for universally applying a shifting algorithm to all Geometry types.
*/
package com.mapbox.geojson.shifter;
Loading