From eee8a2951a7f005c222c0a3361381128ed9e1c73 Mon Sep 17 00:00:00 2001 From: RafaelMiquelino Date: Fri, 26 Mar 2021 08:22:03 -0300 Subject: Implements MapboxGeocoder Add Mapbox reverser geocoder support --- src/main/java/org/traccar/MainModule.java | 3 + .../java/org/traccar/geocoder/MapboxGeocoder.java | 91 ++++++++++++++++++++++ .../java/org/traccar/geocoder/GeocoderTest.java | 8 ++ 3 files changed, 102 insertions(+) create mode 100644 src/main/java/org/traccar/geocoder/MapboxGeocoder.java (limited to 'src') diff --git a/src/main/java/org/traccar/MainModule.java b/src/main/java/org/traccar/MainModule.java index 77f0c89d1..2b7fa5c61 100644 --- a/src/main/java/org/traccar/MainModule.java +++ b/src/main/java/org/traccar/MainModule.java @@ -45,6 +45,7 @@ import org.traccar.geocoder.NominatimGeocoder; import org.traccar.geocoder.OpenCageGeocoder; import org.traccar.geocoder.PositionStackGeocoder; import org.traccar.geocoder.TomTomGeocoder; +import org.traccar.geocoder.MapboxGeocoder; import org.traccar.geolocation.GeolocationProvider; import org.traccar.geolocation.GoogleGeolocationProvider; import org.traccar.geolocation.MozillaGeolocationProvider; @@ -184,6 +185,8 @@ public class MainModule extends AbstractModule { return new TomTomGeocoder(url, key, cacheSize, addressFormat); case "positionstack": return new PositionStackGeocoder(key, cacheSize, addressFormat); + case "mapbox": + return new MapboxGeocoder(key, cacheSize, addressFormat); default: return new GoogleGeocoder(key, language, cacheSize, addressFormat); } diff --git a/src/main/java/org/traccar/geocoder/MapboxGeocoder.java b/src/main/java/org/traccar/geocoder/MapboxGeocoder.java new file mode 100644 index 000000000..77fa0c22f --- /dev/null +++ b/src/main/java/org/traccar/geocoder/MapboxGeocoder.java @@ -0,0 +1,91 @@ +/* + * Copyright 2020 Anton Tananaev (anton@traccar.org) + * Copyright 2021 Rafael Miquelino (rafaelmiquelino@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.geocoder; + +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonString; + +public class MapboxGeocoder extends JsonGeocoder { + + private static String formatUrl(String key) { + return "https://api.mapbox.com/geocoding/v5/mapbox.places/%2$f,%1$f.json?access_token=" + key; + } + + public MapboxGeocoder(String key, int cacheSize, AddressFormat addressFormat) { + super(formatUrl(key), cacheSize, addressFormat); + } + + @Override + public Address parseAddress(JsonObject json) { + JsonArray features = json.getJsonArray("features"); + + if (!features.isEmpty()) { + Address address = new Address(); + + JsonObject mostSpecificFeature = (JsonObject) features.get(0); + + if (mostSpecificFeature.containsKey("place_name")) { + address.setFormattedAddress(mostSpecificFeature.getString("place_name")); + } + + if (mostSpecificFeature.containsKey("address")) { + address.setHouse(mostSpecificFeature.getString("address")); + } + + for (JsonObject feature : features.getValuesAs(JsonObject.class)) { + + String value = feature.getString("text"); + + typesLoop: + for (JsonString type : feature.getJsonArray("place_type").getValuesAs(JsonString.class)) { + + switch (type.getString()) { + case "address": + address.setStreet(value); + break typesLoop; + case "neighborhood": + address.setSuburb(value); + break typesLoop; + case "postcode": + address.setPostcode(value); + break typesLoop; + case "locality": + address.setSettlement(value); + break typesLoop; + case "district": + case "place": + address.setDistrict(value); + break typesLoop; + case "region": + address.setState(value); + break typesLoop; + case "country": + address.setCountry(value); + break typesLoop; + default: + break; + } + } + } + + return address; + } + return null; + } + +} diff --git a/src/test/java/org/traccar/geocoder/GeocoderTest.java b/src/test/java/org/traccar/geocoder/GeocoderTest.java index d93a72a87..5f1748984 100644 --- a/src/test/java/org/traccar/geocoder/GeocoderTest.java +++ b/src/test/java/org/traccar/geocoder/GeocoderTest.java @@ -93,4 +93,12 @@ public class GeocoderTest { String address = geocoder.getAddress(28.6129602407977, 77.2294557094574, null); assertEquals("India Gate, New Delhi, India", address); } + + @Ignore + @Test + public void testMapbox() { + Geocoder geocoder = new MapboxGeocoder("", 0, new AddressFormat("%f")); + String address = geocoder.getAddress(40.733, -73.989, null); + assertEquals("120 East 13th Street, New York, New York 10003, United States", address); + } } -- cgit v1.2.3