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
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.mapbox.geojson.BoundingBox;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.shifter.CoordinateShifterManager;
import com.mapbox.geojson.utils.GeoJsonUtils;

import java.lang.reflect.Type;
import java.util.List;
Expand Down Expand Up @@ -48,8 +49,8 @@ public JsonElement serialize(BoundingBox src, Type typeOfSrc, JsonSerializationC
List<Double> unshiftedCoordinates =
CoordinateShifterManager.getCoordinateShifter().unshiftPoint(point);

bbox.add(new JsonPrimitive(unshiftedCoordinates.get(0)));
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(1)));
bbox.add(new JsonPrimitive(GeoJsonUtils.trim(unshiftedCoordinates.get(0))));
bbox.add(new JsonPrimitive(GeoJsonUtils.trim(unshiftedCoordinates.get(1))));
if (point.hasAltitude()) {
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(2)));
}
Expand All @@ -58,8 +59,8 @@ public JsonElement serialize(BoundingBox src, Type typeOfSrc, JsonSerializationC
point = src.northeast();
unshiftedCoordinates =
CoordinateShifterManager.getCoordinateShifter().unshiftPoint(point);
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(0)));
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(1)));
bbox.add(new JsonPrimitive(GeoJsonUtils.trim(unshiftedCoordinates.get(0))));
bbox.add(new JsonPrimitive(GeoJsonUtils.trim(unshiftedCoordinates.get(1))));
if (point.hasAltitude()) {
bbox.add(new JsonPrimitive(unshiftedCoordinates.get(2)));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@
import com.google.gson.stream.JsonWriter;

import com.mapbox.geojson.shifter.CoordinateShifterManager;
import com.mapbox.geojson.utils.GeoJsonUtils;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -27,16 +26,8 @@ public void write(JsonWriter out, List<Double> value) throws IOException {
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(unshiftedCoordinates.get(1));
String latString = lat.setScale(7, RoundingMode.HALF_UP)
.stripTrailingZeros().toPlainString();

out.value(Double.valueOf(lonString));
out.value(Double.valueOf(latString));
out.value(GeoJsonUtils.trim(unshiftedCoordinates.get(0)));
out.value(GeoJsonUtils.trim(unshiftedCoordinates.get(1)));

// Includes altitude
if (value.size() > 2) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@
import com.google.gson.JsonSerializer;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.shifter.CoordinateShifterManager;
import com.mapbox.geojson.utils.GeoJsonUtils;

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

/**
Expand Down Expand Up @@ -50,16 +49,8 @@ public JsonElement serialize(Point src, Type typeOfSrc, JsonSerializationContext
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(unshiftedCoordinates.get(1));
String latString = lat.setScale(7, RoundingMode.HALF_UP)
.stripTrailingZeros().toPlainString();

rawCoordinates.add(new JsonPrimitive(Double.valueOf(lonString)));
rawCoordinates.add(new JsonPrimitive(Double.valueOf(latString)));
rawCoordinates.add(new JsonPrimitive(GeoJsonUtils.trim(unshiftedCoordinates.get(0))));
rawCoordinates.add(new JsonPrimitive(GeoJsonUtils.trim(unshiftedCoordinates.get(1))));

// Includes altitude
if (src.hasAltitude()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.mapbox.geojson.utils;

/**
* GeoJson utils class contains method that can be used throughout geojson package.
*
* @since 4.3.0
*/
public class GeoJsonUtils {

private static double ROUND_PRECISION = 10000000.0;
private static long MAX_DOUBLE_TO_ROUND = (long) (Long.MAX_VALUE / ROUND_PRECISION);

/**
* Trims a double value to have only 7 digits after period.
*
* @param value to be trimed
* @return trimmed value
*/
public static double trim(double value) {
if (value > MAX_DOUBLE_TO_ROUND || value < -MAX_DOUBLE_TO_ROUND) {
return value;
}
return Math.round(value * ROUND_PRECISION) / ROUND_PRECISION;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.mapbox.geojson.utils;

import static org.junit.Assert.assertEquals;

import com.mapbox.core.TestUtils;
import org.junit.Test;


public class GeoJsonUtilsTest extends TestUtils {


@Test
public void trimPositiveRoundUp() {
double trimmedValue = GeoJsonUtils.trim(3.123456789);
double expected = 3.1234568;
assertEquals("trim to 7 digits after period", expected, trimmedValue, 1e-8);
}

@Test
public void trimPositiveRoundDown() {
double trimmedValue = GeoJsonUtils.trim(3.123456712);
double expected = 3.1234567;
assertEquals("trim to 7 digits after period", expected, trimmedValue, 1e-8);
}

@Test
public void trimNegative() {
double trimmedValue = GeoJsonUtils.trim(-3.123456789);
double expected = -3.1234568;
assertEquals("trim to 7 digits after period", expected, trimmedValue, 1e-8);
}

@Test
public void trimZero() {
double trimmedValue = GeoJsonUtils.trim(0);
double expected = 0;
assertEquals("trim to 7 digits after period", expected, trimmedValue, 1e-8);
}

@Test
public void trimInt() {
double trimmedValue = GeoJsonUtils.trim(8);
double expected = 8;
assertEquals("trim to 7 digits after period", expected, trimmedValue, 1e-8);
}

@Test
public void trimMaxLong() {
double trimmedValue = GeoJsonUtils.trim(Long.MAX_VALUE + 0.1);
double expected = Long.MAX_VALUE;
assertEquals("trim to 7 digits after period", expected, trimmedValue, 1e-8);
}
}