Skip to content

Commit d1a263f

Browse files
author
Cameron Mace
authored
Remove trailing zeros from coordinates (#424)
* added decimal formater * made formating into textUtik * fixed checkstyle * made changed recommended
1 parent fdfb5ba commit d1a263f

8 files changed

Lines changed: 88 additions & 39 deletions

File tree

mapbox/libjava-core/src/main/java/com/mapbox/services/commons/models/Position.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mapbox.services.commons.models;
22

33
import com.mapbox.services.Constants;
4+
import com.mapbox.services.commons.utils.TextUtils;
45

56
import java.util.logging.Logger;
67

@@ -27,24 +28,25 @@ public class Position {
2728
* @since 1.0.0
2829
*/
2930
private Position(double longitude, double latitude, double altitude) {
31+
3032
this.longitude = longitude;
3133
this.latitude = latitude;
3234
this.altitude = altitude;
3335

3436
if (latitude != Double.POSITIVE_INFINITY && (latitude < -90 || latitude > 90)) {
3537
// Checks the latitude value is within range or provide a warning otherwise
3638
logger.warning(String.format(Constants.DEFAULT_LOCALE,
37-
"Latitude value seems to be out of range (found: %f, expected: [-90, 90]). "
39+
"Latitude value seems to be out of range (found: %s, expected: [-90, 90]). "
3840
+ "Did you accidentally reverse the longitude/latitude order?",
39-
latitude));
41+
TextUtils.formatCoordinate(latitude)));
4042
}
4143

4244
if (longitude != Double.POSITIVE_INFINITY && (longitude < -180 || longitude > 180)) {
4345
// Checks the longitude value is within range or provide a warning otherwise
4446
logger.warning(String.format(Constants.DEFAULT_LOCALE,
45-
"Longitude value seems to be out of range (found: %f, expected: [-180, 180]). "
46-
+ "Did you accidentally reverse the longitude/latitude order?",
47-
longitude));
47+
"Longitude value seems to be out of range (found: %s, expected: [-180, 180]). "
48+
+ "Did you accidentally reverse the longitude/latitude order?",
49+
TextUtils.formatCoordinate(longitude)));
4850
}
4951
}
5052

mapbox/libjava-core/src/main/java/com/mapbox/services/commons/utils/TextUtils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package com.mapbox.services.commons.utils;
22

3+
import com.mapbox.services.Constants;
4+
5+
import java.text.DecimalFormat;
6+
import java.text.DecimalFormatSymbols;
7+
import java.util.Locale;
8+
39
/**
410
* We avoid including a full library like org.apache.commons:commons-lang3 to avoid an unnecessary
511
* large number of methods, which is inconvenient to Android devs.
@@ -47,4 +53,16 @@ public static String join(CharSequence delimiter, Object[] tokens) {
4753
return sb.toString();
4854
}
4955

56+
/**
57+
* Useful to remove any trailing zeros and prevent a coordinate being over 7 significant figures.
58+
*
59+
* @param coordinate a double value representing a coordinate.
60+
* @return a formatted string.
61+
* @since 2.0.1
62+
*/
63+
public static String formatCoordinate(double coordinate) {
64+
DecimalFormat decimalFormat = new DecimalFormat("0.######", new DecimalFormatSymbols(Locale.US));
65+
return String.format(Constants.DEFAULT_LOCALE, "%s",
66+
decimalFormat.format(coordinate));
67+
}
5068
}

mapbox/libjava-geojson/src/test/java/com/mapbox/services/commons/geojson/FeatureCollectionTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,4 @@ public void toJson() throws IOException {
3636
FeatureCollection geo = FeatureCollection.fromJson(geojson);
3737
compareJson(geojson, geo.toJson());
3838
}
39-
4039
}

mapbox/libjava-services/src/main/java/com/mapbox/services/api/directions/v5/MapboxDirections.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import com.mapbox.services.api.MapboxBuilder;
44
import com.mapbox.services.api.MapboxService;
55
import com.mapbox.services.api.ServicesException;
6+
import com.mapbox.services.api.directions.v5.models.DirectionsResponse;
67
import com.mapbox.services.commons.models.Position;
78
import com.mapbox.services.commons.utils.TextUtils;
8-
import com.mapbox.services.api.directions.v5.models.DirectionsResponse;
99

1010
import java.io.IOException;
1111
import java.util.ArrayList;
@@ -398,22 +398,22 @@ public String getCoordinates() {
398398
List<String> coordinatesFormatted = new ArrayList<>();
399399
// Insert origin at beginning of list if one is provided.
400400
if (origin != null) {
401-
coordinatesFormatted.add(String.format(Locale.US, "%f,%f",
402-
origin.getLongitude(),
403-
origin.getLatitude()));
401+
coordinatesFormatted.add(String.format(Locale.US, "%s,%s",
402+
TextUtils.formatCoordinate(origin.getLongitude()),
403+
TextUtils.formatCoordinate(origin.getLatitude())));
404404
}
405405
if (coordinates != null) {
406406
for (Position coordinate : coordinates) {
407-
coordinatesFormatted.add(String.format(Locale.US, "%f,%f",
408-
coordinate.getLongitude(),
409-
coordinate.getLatitude()));
407+
coordinatesFormatted.add(String.format(Locale.US, "%s,%s",
408+
TextUtils.formatCoordinate(coordinate.getLongitude()),
409+
TextUtils.formatCoordinate(coordinate.getLatitude())));
410410
}
411411
}
412412
// Insert destination at end of list if one is provided.
413413
if (destination != null) {
414-
coordinatesFormatted.add(String.format(Locale.US, "%f,%f",
415-
destination.getLongitude(),
416-
destination.getLatitude()));
414+
coordinatesFormatted.add(String.format(Locale.US, "%s,%s",
415+
TextUtils.formatCoordinate(destination.getLongitude()),
416+
TextUtils.formatCoordinate(destination.getLatitude())));
417417
}
418418

419419
return TextUtils.join(";", coordinatesFormatted.toArray());
@@ -468,7 +468,9 @@ public String getBearings() {
468468
if (bearings[i].length == 0) {
469469
bearingFormatted[i] = "";
470470
} else {
471-
bearingFormatted[i] = String.format(Locale.US, "%f,%f", bearings[i][0], bearings[i][1]);
471+
bearingFormatted[i] = String.format(Locale.US, "%s,%s",
472+
TextUtils.formatCoordinate(bearings[i][0]),
473+
TextUtils.formatCoordinate(bearings[i][1]));
472474
}
473475
}
474476
return TextUtils.join(";", bearingFormatted);
@@ -499,7 +501,7 @@ public String getRadiuses() {
499501
if (radiuses[i] == Double.POSITIVE_INFINITY) {
500502
radiusesFormatted[i] = "unlimited";
501503
} else {
502-
radiusesFormatted[i] = String.format(Locale.US, "%f", radiuses[i]);
504+
radiusesFormatted[i] = String.format(Locale.US, "%s", TextUtils.formatCoordinate(radiuses[i]));
503505
}
504506
}
505507

mapbox/libjava-services/src/main/java/com/mapbox/services/api/geocoding/v5/MapboxGeocoding.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,10 @@ public T setCoordinates(Position position) {
294294
if (position == null) {
295295
return (T) this;
296296
}
297-
query = String.format(Locale.US, "%f,%f",
298-
position.getLongitude(),
299-
position.getLatitude());
297+
298+
query = String.format(Locale.US, "%s,%s",
299+
TextUtils.formatCoordinate(position.getLongitude()),
300+
TextUtils.formatCoordinate(position.getLatitude()));
300301
return (T) this;
301302
}
302303

@@ -347,9 +348,9 @@ public T setProximity(Position position) {
347348
if (position == null) {
348349
return (T) this;
349350
}
350-
proximity = String.format(Locale.US, "%f,%f",
351-
position.getLongitude(),
352-
position.getLatitude());
351+
proximity = String.format(Locale.US, "%s,%s",
352+
TextUtils.formatCoordinate(position.getLongitude()),
353+
TextUtils.formatCoordinate(position.getLatitude()));
353354
return (T) this;
354355
}
355356

@@ -421,7 +422,11 @@ public T setBbox(double minX, double minY, double maxX, double maxY) throws Serv
421422
throw new ServicesException("You provided an empty bounding box");
422423
}
423424

424-
this.bbox = String.format(Locale.US, "%f,%f,%f,%f", minX, minY, maxX, maxY);
425+
this.bbox = String.format(Locale.US, "%s,%s,%s,%s",
426+
TextUtils.formatCoordinate(minX),
427+
TextUtils.formatCoordinate(minY),
428+
TextUtils.formatCoordinate(maxX),
429+
TextUtils.formatCoordinate(maxY));
425430
return (T) this;
426431
}
427432

@@ -529,16 +534,16 @@ public String getLanguage() {
529534

530535
/**
531536
* The locale in which results should be returned.
532-
*
537+
* <p>
533538
* This property affects the language of returned results; generally speaking,
534539
* it does not determine which results are found. If the Geocoding API does not
535540
* recognize the language code, it may fall back to another language or the default
536541
* language. Components other than the language code, such as the country and
537542
* script codes, are ignored.
538-
*
543+
* <p>
539544
* By default, this property is set to `null`, causing results to be in the default
540545
* language.
541-
*
546+
* <p>
542547
* This option is experimental.
543548
*
544549
* @param language The locale in which results should be returned.

mapbox/libjava-services/src/main/java/com/mapbox/services/api/mapmatching/v5/MapboxMapMatching.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,9 @@ public T setAnnotations(String annotations) {
213213
public String getCoordinates() {
214214
List<String> coordinatesFormatted = new ArrayList<>();
215215
for (Position coordinate : coordinates) {
216-
coordinatesFormatted.add(String.format(Locale.US, "%f,%f",
217-
coordinate.getLongitude(),
218-
coordinate.getLatitude()));
216+
coordinatesFormatted.add(String.format(Locale.US, "%s,%s",
217+
TextUtils.formatCoordinate(coordinate.getLongitude()),
218+
TextUtils.formatCoordinate(coordinate.getLatitude())));
219219
}
220220

221221
return TextUtils.join(";", coordinatesFormatted.toArray());

mapbox/libjava-services/src/test/java/com/mapbox/services/api/directions/v5/MapboxDirectionsTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public void testRadius() throws ServicesException, IOException {
221221
.build();
222222

223223
assertTrue(client.executeCall().raw().request().url().toString()
224-
.contains("radiuses=100.000000;100.000000;100.000000"));
224+
.contains("radiuses=100;100;100"));
225225
}
226226

227227
@Test
@@ -241,7 +241,7 @@ public void testRadiusWithUnlimitedDistance() throws ServicesException, IOExcept
241241
.build();
242242

243243
assertTrue(client.executeCall().raw().request().url().toString()
244-
.contains("radiuses=100.000000;unlimited;100.000000"));
244+
.contains("radiuses=100;unlimited;100"));
245245
}
246246

247247
@Test
@@ -294,7 +294,7 @@ public void testBearing() throws ServicesException, IOException {
294294
.build();
295295

296296
assertTrue(client.executeCall().raw().request().url().toString()
297-
.contains("bearings=60.000000,45.000000;;45.000000,45.000000"));
297+
.contains("bearings=60,45;;45,45"));
298298
}
299299

300300
@Test
@@ -557,7 +557,7 @@ public void testSetCoordinates() {
557557
String coordinates = new MapboxDirections.Builder()
558558
.setCoordinates(test)
559559
.getCoordinates();
560-
assertEquals(coordinates, "2.100000,2.200000;3.100000,3.200000");
560+
assertEquals(coordinates, "2.1,2.2;3.1,3.2");
561561
}
562562

563563
@Test
@@ -566,7 +566,7 @@ public void setOriginDestination() {
566566
.setOrigin(Position.fromCoordinates(2.1, 2.2))
567567
.setDestination(Position.fromCoordinates(3.1, 3.2))
568568
.getCoordinates();
569-
assertEquals(coordinates, "2.100000,2.200000;3.100000,3.200000");
569+
assertEquals(coordinates, "2.1,2.2;3.1,3.2");
570570
}
571571

572572
@Test
@@ -581,7 +581,7 @@ public void testSetCoordinatesMixed() {
581581
.setOrigin(Position.fromCoordinates(1.1, 1.2))
582582
.setDestination(Position.fromCoordinates(4.1, 4.2))
583583
.getCoordinates();
584-
assertEquals(coordinates, "1.100000,1.200000;2.100000,2.200000;3.100000,3.200000;4.100000,4.200000");
584+
assertEquals(coordinates, "1.1,1.2;2.1,2.2;3.1,3.2;4.1,4.2");
585585
}
586586

587587
@Test
@@ -597,7 +597,7 @@ public void testLocale() {
597597
.setDestination(Position.fromCoordinates(4.1, 4.2))
598598
.setCoordinates(test)
599599
.getCoordinates();
600-
assertEquals(coordinates, "1.100000,1.200000;2.100000,2.200000;3.100000,3.200000;4.100000,4.200000");
600+
assertEquals(coordinates, "1.1,1.2;2.1,2.2;3.1,3.2;4.1,4.2");
601601
}
602602

603603
@Test
@@ -625,7 +625,7 @@ public void originDestinationCoordinatesListCorrectOrder() throws ServicesExcept
625625

626626
String callUrl = client.executeCall().raw().request().url().toString();
627627
assertTrue(
628-
callUrl.contains("-122.431300,37.778900;-122.416667,37.783333;-121.900000,37.333333;-121.800100,37.227500")
628+
callUrl.contains("-122.4313,37.7789;-122.416667,37.783333;-121.9,37.333333;-121.8001,37.2275")
629629
);
630630
}
631631
}

mapbox/libjava-services/src/test/java/com/mapbox/services/api/geocoding/v5/MapboxGeocodingTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.mapbox.services.api.geocoding.v5.models.CarmenFeature;
77
import com.mapbox.services.api.geocoding.v5.models.GeocodingResponse;
88
import com.mapbox.services.commons.geojson.Point;
9+
import com.mapbox.services.commons.models.Position;
910

1011
import org.junit.After;
1112
import org.junit.Before;
@@ -199,6 +200,28 @@ public void testCountryNotSupported() throws ServicesException, IOException {
199200
assertEquals(0, response.body().getFeatures().size());
200201
}
201202

203+
@Test
204+
public void testBbox() throws IOException, ServicesException {
205+
MapboxGeocoding clientNeSw = new MapboxGeocoding.Builder()
206+
.setAccessToken(ACCESS_TOKEN)
207+
.setLocation("1600 pennsylvania ave nw")
208+
.setBbox(Position.fromCoordinates(-77.0035, 38.9115), Position.fromCoordinates(-77.0702, 38.8561))
209+
.setBaseUrl(mockUrl.toString())
210+
.build();
211+
212+
MapboxGeocoding clientMinMax = new MapboxGeocoding.Builder()
213+
.setAccessToken(ACCESS_TOKEN)
214+
.setLocation("1600 pennsylvania ave nw")
215+
.setBbox(-77.0035, 38.9115, -77.0702, 38.8561)
216+
.setBaseUrl(mockUrl.toString())
217+
.build();
218+
219+
assertTrue(
220+
clientNeSw.executeCall().raw().request().url().toString().contains("bbox=-77.0702,38.8561,-77.0035,38.9115"));
221+
assertTrue(
222+
clientMinMax.executeCall().raw().request().url().toString().contains("bbox=-77.0035,38.9115,-77.0702,38.8561"));
223+
}
224+
202225
@Test
203226
public void testLanguage() throws IOException, ServicesException {
204227
MapboxGeocoding clientNoLanguage = new MapboxGeocoding.Builder()

0 commit comments

Comments
 (0)