aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2017-11-11 09:21:45 +1300
committerGitHub <noreply@github.com>2017-11-11 09:21:45 +1300
commit204b1074ee57960775066c7c483d54bab8ebf279 (patch)
treebfec39fe84b547dac991f0d38cd69e9c64c688a6
parent92f00d0da0dafd08ccf2a623406963e61fcde276 (diff)
parent96d89e2e352f5cba70a346b1f71bfb3bd399556b (diff)
downloadtraccar-server-204b1074ee57960775066c7c483d54bab8ebf279.tar.gz
traccar-server-204b1074ee57960775066c7c483d54bab8ebf279.tar.bz2
traccar-server-204b1074ee57960775066c7c483d54bab8ebf279.zip
Merge pull request #3632 from Abyss777/retry_geocoding
Retry geocoding for trips/stops
-rw-r--r--src/org/traccar/BasePipelineFactory.java2
-rw-r--r--src/org/traccar/Context.java69
-rw-r--r--src/org/traccar/GeocoderHandler.java11
-rw-r--r--src/org/traccar/api/resource/ServerResource.java9
-rw-r--r--src/org/traccar/geocoder/BingMapsGeocoder.java5
-rw-r--r--src/org/traccar/geocoder/FactualGeocoder.java5
-rw-r--r--src/org/traccar/geocoder/GeocodeFarmGeocoder.java6
-rw-r--r--src/org/traccar/geocoder/Geocoder.java4
-rw-r--r--src/org/traccar/geocoder/GisgraphyGeocoder.java10
-rw-r--r--src/org/traccar/geocoder/GoogleGeocoder.java6
-rw-r--r--src/org/traccar/geocoder/JsonGeocoder.java85
-rw-r--r--src/org/traccar/geocoder/MapQuestGeocoder.java5
-rw-r--r--src/org/traccar/geocoder/NominatimGeocoder.java6
-rw-r--r--src/org/traccar/geocoder/OpenCageGeocoder.java6
-rw-r--r--src/org/traccar/reports/ReportUtils.java22
-rw-r--r--test/org/traccar/geocoder/GeocoderTest.java46
16 files changed, 182 insertions, 115 deletions
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index 771ab8acb..aa188d209 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -141,7 +141,7 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
filterHandler = new FilterHandler();
}
- if (Context.getGeocoder() != null) {
+ if (Context.getGeocoder() != null && !Context.getConfig().getBoolean("geocoder.ignorePositions")) {
geocoderHandler = new GeocoderHandler(
Context.getGeocoder(),
Context.getConfig().getBoolean("geocoder.processInvalidPositions"));
diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java
index 3b24c6460..237da40c8 100644
--- a/src/org/traccar/Context.java
+++ b/src/org/traccar/Context.java
@@ -43,6 +43,7 @@ import org.traccar.database.StatisticsManager;
import org.traccar.database.UsersManager;
import org.traccar.events.MotionEventHandler;
import org.traccar.events.OverspeedEventHandler;
+import org.traccar.geocoder.AddressFormat;
import org.traccar.geocoder.BingMapsGeocoder;
import org.traccar.geocoder.FactualGeocoder;
import org.traccar.geocoder.GeocodeFarmGeocoder;
@@ -263,6 +264,41 @@ public final class Context {
config.getDouble("event.motion.speedThreshold", 0.01));
}
+ public static Geocoder initGeocoder() {
+ String type = config.getString("geocoder.type", "google");
+ String url = config.getString("geocoder.url");
+ String key = config.getString("geocoder.key");
+ String language = config.getString("geocoder.language");
+
+ String formatString = config.getString("geocoder.format");
+ AddressFormat addressFormat;
+ if (formatString != null) {
+ addressFormat = new AddressFormat(formatString);
+ } else {
+ addressFormat = new AddressFormat();
+ }
+
+ int cacheSize = config.getInteger("geocoder.cacheSize");
+ switch (type) {
+ case "nominatim":
+ return new NominatimGeocoder(url, key, language, cacheSize, addressFormat);
+ case "gisgraphy":
+ return new GisgraphyGeocoder(url, cacheSize, addressFormat);
+ case "mapquest":
+ return new MapQuestGeocoder(url, key, cacheSize, addressFormat);
+ case "opencage":
+ return new OpenCageGeocoder(url, key, cacheSize, addressFormat);
+ case "bingmaps":
+ return new BingMapsGeocoder(url, key, cacheSize, addressFormat);
+ case "factual":
+ return new FactualGeocoder(url, key, cacheSize, addressFormat);
+ case "geocodefarm":
+ return new GeocodeFarmGeocoder(key, language, cacheSize, addressFormat);
+ default:
+ return new GoogleGeocoder(key, language, cacheSize, addressFormat);
+ }
+ }
+
public static void init(String[] arguments) throws Exception {
config = new Config();
@@ -298,38 +334,7 @@ public final class Context {
identityManager = deviceManager;
if (config.getBoolean("geocoder.enable")) {
- String type = config.getString("geocoder.type", "google");
- String url = config.getString("geocoder.url");
- String key = config.getString("geocoder.key");
- String language = config.getString("geocoder.language");
-
- int cacheSize = config.getInteger("geocoder.cacheSize");
- switch (type) {
- case "nominatim":
- geocoder = new NominatimGeocoder(url, key, language, cacheSize);
- break;
- case "gisgraphy":
- geocoder = new GisgraphyGeocoder(url, cacheSize);
- break;
- case "mapquest":
- geocoder = new MapQuestGeocoder(url, key, cacheSize);
- break;
- case "opencage":
- geocoder = new OpenCageGeocoder(url, key, cacheSize);
- break;
- case "bingmaps":
- geocoder = new BingMapsGeocoder(url, key, cacheSize);
- break;
- case "factual":
- geocoder = new FactualGeocoder(url, key, cacheSize);
- break;
- case "geocodefarm":
- geocoder = new GeocodeFarmGeocoder(key, language, cacheSize);
- break;
- default:
- geocoder = new GoogleGeocoder(key, language, cacheSize);
- break;
- }
+ geocoder = initGeocoder();
}
if (config.getBoolean("geolocation.enable")) {
diff --git a/src/org/traccar/GeocoderHandler.java b/src/org/traccar/GeocoderHandler.java
index a211d1a23..6b55e8162 100644
--- a/src/org/traccar/GeocoderHandler.java
+++ b/src/org/traccar/GeocoderHandler.java
@@ -20,7 +20,6 @@ import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelUpstreamHandler;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.MessageEvent;
-import org.traccar.geocoder.AddressFormat;
import org.traccar.geocoder.Geocoder;
import org.traccar.helper.Log;
import org.traccar.model.Position;
@@ -29,20 +28,12 @@ public class GeocoderHandler implements ChannelUpstreamHandler {
private final Geocoder geocoder;
private final boolean processInvalidPositions;
- private final AddressFormat addressFormat;
private final int geocoderReuseDistance;
public GeocoderHandler(Geocoder geocoder, boolean processInvalidPositions) {
this.geocoder = geocoder;
this.processInvalidPositions = processInvalidPositions;
- String formatString = Context.getConfig().getString("geocoder.format");
- if (formatString != null) {
- addressFormat = new AddressFormat(formatString);
- } else {
- addressFormat = new AddressFormat();
- }
-
geocoderReuseDistance = Context.getConfig().getInteger("geocoder.reuseDistance", 0);
}
@@ -70,7 +61,7 @@ public class GeocoderHandler implements ChannelUpstreamHandler {
Context.getStatisticsManager().registerGeocoderRequest();
- geocoder.getAddress(addressFormat, position.getLatitude(), position.getLongitude(),
+ geocoder.getAddress(position.getLatitude(), position.getLongitude(),
new Geocoder.ReverseGeocoderCallback() {
@Override
public void onSuccess(String address) {
diff --git a/src/org/traccar/api/resource/ServerResource.java b/src/org/traccar/api/resource/ServerResource.java
index 034a5c492..c0914995b 100644
--- a/src/org/traccar/api/resource/ServerResource.java
+++ b/src/org/traccar/api/resource/ServerResource.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@ import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.sql.SQLException;
@@ -47,4 +48,10 @@ public class ServerResource extends BaseResource {
return Response.ok(entity).build();
}
+ @Path("geocode")
+ @GET
+ public String geocode(@QueryParam("latitude") double latitude, @QueryParam("longitude") double longitude) {
+ return Context.getGeocoder().getAddress(latitude, longitude, null);
+ }
+
}
diff --git a/src/org/traccar/geocoder/BingMapsGeocoder.java b/src/org/traccar/geocoder/BingMapsGeocoder.java
index a9b36219a..fbfb5394a 100644
--- a/src/org/traccar/geocoder/BingMapsGeocoder.java
+++ b/src/org/traccar/geocoder/BingMapsGeocoder.java
@@ -1,5 +1,6 @@
/*
* Copyright 2014 - 2015 Stefaan Van Dooren (stefaan.vandooren@gmail.com)
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,8 +21,8 @@ import javax.json.JsonObject;
public class BingMapsGeocoder extends JsonGeocoder {
- public BingMapsGeocoder(String url, String key, int cacheSize) {
- super(url + "/Locations/%f,%f?key=" + key + "&include=ciso2", cacheSize);
+ public BingMapsGeocoder(String url, String key, int cacheSize, AddressFormat addressFormat) {
+ super(url + "/Locations/%f,%f?key=" + key + "&include=ciso2", cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/FactualGeocoder.java b/src/org/traccar/geocoder/FactualGeocoder.java
index 0c76e4625..c7a68c293 100644
--- a/src/org/traccar/geocoder/FactualGeocoder.java
+++ b/src/org/traccar/geocoder/FactualGeocoder.java
@@ -1,5 +1,6 @@
/*
* Copyright 2014 - 2015 Stefaan Van Dooren (stefaan.vandooren@gmail.com)
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,8 +20,8 @@ import javax.json.JsonObject;
public class FactualGeocoder extends JsonGeocoder {
- public FactualGeocoder(String url, String key, int cacheSize) {
- super(url + "?latitude=%f&longitude=%f&KEY=" + key, cacheSize);
+ public FactualGeocoder(String url, String key, int cacheSize, AddressFormat addressFormat) {
+ super(url + "?latitude=%f&longitude=%f&KEY=" + key, cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/GeocodeFarmGeocoder.java b/src/org/traccar/geocoder/GeocodeFarmGeocoder.java
index 73ff85aa4..4fb956af9 100644
--- a/src/org/traccar/geocoder/GeocodeFarmGeocoder.java
+++ b/src/org/traccar/geocoder/GeocodeFarmGeocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,8 +30,8 @@ public class GeocodeFarmGeocoder extends JsonGeocoder {
}
return url;
}
- public GeocodeFarmGeocoder(String key, String language, int cacheSize) {
- super(formatUrl(key, language), cacheSize);
+ public GeocodeFarmGeocoder(String key, String language, int cacheSize, AddressFormat addressFormat) {
+ super(formatUrl(key, language), cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/Geocoder.java b/src/org/traccar/geocoder/Geocoder.java
index 3ce3fb67f..587a27520 100644
--- a/src/org/traccar/geocoder/Geocoder.java
+++ b/src/org/traccar/geocoder/Geocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 - 2013 Anton Tananaev (anton@traccar.org)
+ * Copyright 2012 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,6 +25,6 @@ public interface Geocoder {
}
- void getAddress(AddressFormat format, double latitude, double longitude, ReverseGeocoderCallback callback);
+ String getAddress(double latitude, double longitude, ReverseGeocoderCallback callback);
}
diff --git a/src/org/traccar/geocoder/GisgraphyGeocoder.java b/src/org/traccar/geocoder/GisgraphyGeocoder.java
index 1432166e9..a0c831966 100644
--- a/src/org/traccar/geocoder/GisgraphyGeocoder.java
+++ b/src/org/traccar/geocoder/GisgraphyGeocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,12 +19,12 @@ import javax.json.JsonObject;
public class GisgraphyGeocoder extends JsonGeocoder {
- public GisgraphyGeocoder() {
- this("http://services.gisgraphy.com/reversegeocoding/search", 0);
+ public GisgraphyGeocoder(AddressFormat addressFormat) {
+ this("http://services.gisgraphy.com/reversegeocoding/search", 0, addressFormat);
}
- public GisgraphyGeocoder(String url, int cacheSize) {
- super(url + "?format=json&lat=%f&lng=%f&from=1&to=1", cacheSize);
+ public GisgraphyGeocoder(String url, int cacheSize, AddressFormat addressFormat) {
+ super(url + "?format=json&lat=%f&lng=%f&from=1&to=1", cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/GoogleGeocoder.java b/src/org/traccar/geocoder/GoogleGeocoder.java
index b38870c8f..235ea9ea9 100644
--- a/src/org/traccar/geocoder/GoogleGeocoder.java
+++ b/src/org/traccar/geocoder/GoogleGeocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 - 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2012 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,8 +32,8 @@ public class GoogleGeocoder extends JsonGeocoder {
return url;
}
- public GoogleGeocoder(String key, String language, int cacheSize) {
- super(formatUrl(key, language), cacheSize);
+ public GoogleGeocoder(String key, String language, int cacheSize, AddressFormat addressFormat) {
+ super(formatUrl(key, language), cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/JsonGeocoder.java b/src/org/traccar/geocoder/JsonGeocoder.java
index 6d1380729..82a6ee604 100644
--- a/src/org/traccar/geocoder/JsonGeocoder.java
+++ b/src/org/traccar/geocoder/JsonGeocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,23 +18,29 @@ package org.traccar.geocoder;
import com.ning.http.client.AsyncCompletionHandler;
import com.ning.http.client.Response;
import org.traccar.Context;
+import org.traccar.helper.Log;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
+
+import java.io.IOException;
import java.util.AbstractMap;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.concurrent.ExecutionException;
public abstract class JsonGeocoder implements Geocoder {
private final String url;
+ private final AddressFormat addressFormat;
private Map<Map.Entry<Double, Double>, String> cache;
- public JsonGeocoder(String url, final int cacheSize) {
+ public JsonGeocoder(String url, final int cacheSize, AddressFormat addressFormat) {
this.url = url;
+ this.addressFormat = addressFormat;
if (cacheSize > 0) {
this.cache = Collections.synchronizedMap(new LinkedHashMap<Map.Entry<Double, Double>, String>() {
@Override
@@ -45,43 +51,66 @@ public abstract class JsonGeocoder implements Geocoder {
}
}
+ private String handleResponse(double latitude, double longitude, Response response,
+ ReverseGeocoderCallback callback) throws IOException {
+ try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) {
+ Address address = parseAddress(reader.readObject());
+ if (address != null) {
+ String formattedAddress = addressFormat.format(address);
+ if (cache != null) {
+ cache.put(new AbstractMap.SimpleImmutableEntry<>(latitude, longitude), formattedAddress);
+ }
+ if (callback != null) {
+ callback.onSuccess(formattedAddress);
+ }
+ return formattedAddress;
+ } else {
+ if (callback != null) {
+ callback.onFailure(new GeocoderException("Empty address"));
+ }
+ Log.warning("Empty address");
+ }
+ }
+ return null;
+ }
+
@Override
- public void getAddress(
- final AddressFormat format, final double latitude,
- final double longitude, final ReverseGeocoderCallback callback) {
+ public String getAddress(
+ final double latitude, final double longitude, final ReverseGeocoderCallback callback) {
if (cache != null) {
String cachedAddress = cache.get(new AbstractMap.SimpleImmutableEntry<>(latitude, longitude));
if (cachedAddress != null) {
- callback.onSuccess(cachedAddress);
- return;
+ if (callback != null) {
+ callback.onSuccess(cachedAddress);
+ }
+ return cachedAddress;
}
}
- Context.getAsyncHttpClient().prepareGet(String.format(url, latitude, longitude))
- .execute(new AsyncCompletionHandler() {
- @Override
- public Object onCompleted(Response response) throws Exception {
- try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) {
- Address address = parseAddress(reader.readObject());
- if (address != null) {
- String formattedAddress = format.format(address);
- if (cache != null) {
- cache.put(new AbstractMap.SimpleImmutableEntry<>(latitude, longitude), formattedAddress);
- }
- callback.onSuccess(formattedAddress);
- } else {
- callback.onFailure(new GeocoderException("Empty address"));
- }
+ if (callback != null) {
+ Context.getAsyncHttpClient().prepareGet(String.format(url, latitude, longitude))
+ .execute(new AsyncCompletionHandler() {
+ @Override
+ public Object onCompleted(Response response) throws Exception {
+ return handleResponse(latitude, longitude, response, callback);
}
- return null;
- }
- @Override
- public void onThrowable(Throwable t) {
- callback.onFailure(t);
+ @Override
+ public void onThrowable(Throwable t) {
+ callback.onFailure(t);
+ }
+ });
+ } else {
+ try {
+ Response response = Context.getAsyncHttpClient()
+ .prepareGet(String.format(url, latitude, longitude)).execute().get();
+ return handleResponse(latitude, longitude, response, null);
+ } catch (InterruptedException | ExecutionException | IOException error) {
+ Log.warning("Geocoding failed", error);
}
- });
+ }
+ return null;
}
public abstract Address parseAddress(JsonObject json);
diff --git a/src/org/traccar/geocoder/MapQuestGeocoder.java b/src/org/traccar/geocoder/MapQuestGeocoder.java
index 7d7217e91..4029e3f07 100644
--- a/src/org/traccar/geocoder/MapQuestGeocoder.java
+++ b/src/org/traccar/geocoder/MapQuestGeocoder.java
@@ -1,5 +1,6 @@
/*
* Copyright 2014 - 2015 Stefaan Van Dooren (stefaan.vandooren@gmail.com)
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,8 +21,8 @@ import javax.json.JsonObject;
public class MapQuestGeocoder extends JsonGeocoder {
- public MapQuestGeocoder(String url, String key, int cacheSize) {
- super(url + "?key=" + key + "&location=%f,%f", cacheSize);
+ public MapQuestGeocoder(String url, String key, int cacheSize, AddressFormat addressFormat) {
+ super(url + "?key=" + key + "&location=%f,%f", cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/NominatimGeocoder.java b/src/org/traccar/geocoder/NominatimGeocoder.java
index 051727e93..75d2e9f99 100644
--- a/src/org/traccar/geocoder/NominatimGeocoder.java
+++ b/src/org/traccar/geocoder/NominatimGeocoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2014 - 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2014 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,8 +33,8 @@ public class NominatimGeocoder extends JsonGeocoder {
return url;
}
- public NominatimGeocoder(String url, String key, String language, int cacheSize) {
- super(formatUrl(url, key, language), cacheSize);
+ public NominatimGeocoder(String url, String key, String language, int cacheSize, AddressFormat addressFormat) {
+ super(formatUrl(url, key, language), cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/geocoder/OpenCageGeocoder.java b/src/org/traccar/geocoder/OpenCageGeocoder.java
index 9fa56a4a3..894397ee3 100644
--- a/src/org/traccar/geocoder/OpenCageGeocoder.java
+++ b/src/org/traccar/geocoder/OpenCageGeocoder.java
@@ -1,6 +1,6 @@
/*
* Copyright 2014 - 2015 Stefaan Van Dooren (stefaan.vandooren@gmail.com)
- * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,8 +21,8 @@ import javax.json.JsonObject;
public class OpenCageGeocoder extends JsonGeocoder {
- public OpenCageGeocoder(String url, String key, int cacheSize) {
- super(url + "/json?q=%f,%f&key=" + key, cacheSize);
+ public OpenCageGeocoder(String url, String key, int cacheSize, AddressFormat addressFormat) {
+ super(url + "/json?q=%f,%f&key=" + key, cacheSize, addressFormat);
}
@Override
diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java
index f6f386e99..e04f2f90c 100644
--- a/src/org/traccar/reports/ReportUtils.java
+++ b/src/org/traccar/reports/ReportUtils.java
@@ -190,13 +190,23 @@ public final class ReportUtils {
trip.setStartLat(startTrip.getLatitude());
trip.setStartLon(startTrip.getLongitude());
trip.setStartTime(startTrip.getFixTime());
- trip.setStartAddress(startTrip.getAddress());
+ String startAddress = startTrip.getAddress();
+ if (startAddress == null && Context.getGeocoder() != null
+ && Context.getConfig().getBoolean("geocoder.onRequest")) {
+ startAddress = Context.getGeocoder().getAddress(startTrip.getLatitude(), startTrip.getLongitude(), null);
+ }
+ trip.setStartAddress(startAddress);
trip.setEndPositionId(endTrip.getId());
trip.setEndLat(endTrip.getLatitude());
trip.setEndLon(endTrip.getLongitude());
trip.setEndTime(endTrip.getFixTime());
- trip.setEndAddress(endTrip.getAddress());
+ String endAddress = endTrip.getAddress();
+ if (endAddress == null && Context.getGeocoder() != null
+ && Context.getConfig().getBoolean("geocoder.onRequest")) {
+ endAddress = Context.getGeocoder().getAddress(endTrip.getLatitude(), endTrip.getLongitude(), null);
+ }
+ trip.setEndAddress(endAddress);
trip.setDistance(calculateDistance(startTrip, endTrip, !ignoreOdometer));
trip.setDuration(tripDuration);
@@ -224,7 +234,13 @@ public final class ReportUtils {
stop.setLatitude(startStop.getLatitude());
stop.setLongitude(startStop.getLongitude());
stop.setStartTime(startStop.getFixTime());
- stop.setAddress(startStop.getAddress());
+ String address = startStop.getAddress();
+ if (address == null && Context.getGeocoder() != null
+ && Context.getConfig().getBoolean("geocoder.onRequest")) {
+ address = Context.getGeocoder().getAddress(stop.getLatitude(), stop.getLongitude(), null);
+ }
+ stop.setAddress(address);
+
stop.setEndTime(endStop.getFixTime());
long stopDuration = endStop.getFixTime().getTime() - startStop.getFixTime().getTime();
diff --git a/test/org/traccar/geocoder/GeocoderTest.java b/test/org/traccar/geocoder/GeocoderTest.java
index 40b6fd75d..7c6208048 100644
--- a/test/org/traccar/geocoder/GeocoderTest.java
+++ b/test/org/traccar/geocoder/GeocoderTest.java
@@ -1,5 +1,7 @@
package org.traccar.geocoder;
+import java.util.Locale;
+
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
@@ -9,6 +11,7 @@ public class GeocoderTest {
@Ignore
@Test
public void test() throws InterruptedException {
+ Locale.setDefault(Locale.US);
testGoogle();
}
@@ -29,25 +32,28 @@ public class GeocoderTest {
}
public void testGoogle() throws InterruptedException {
- Geocoder geocoder = new GoogleGeocoder(null, null, 0);
+ Geocoder geocoder = new GoogleGeocoder(null, null, 0, new AddressFormat());
- geocoder.getAddress(new AddressFormat(), 31.776797, 35.211489, new Geocoder.ReverseGeocoderCallback() {
+ geocoder.getAddress(31.776797, 35.211489, new Geocoder.ReverseGeocoderCallback() {
@Override
public void onSuccess(String address) {
setAddress(address);
}
@Override
- public void onFailure(Throwable e) {
+ public void onFailure(final Throwable e) {
}
});
Assert.assertEquals("1 Ibn Shaprut St, Jerusalem, Jerusalem District, IL", waitAddress());
+
+ Assert.assertEquals("1 Ibn Shaprut St, Jerusalem, Jerusalem District, IL",
+ geocoder.getAddress(31.776797, 35.211489, null));
}
public void testNominatim() throws InterruptedException {
- Geocoder geocoder = new NominatimGeocoder(null, null, null, 0);
+ Geocoder geocoder = new NominatimGeocoder(null, null, null, 0, new AddressFormat());
- geocoder.getAddress(new AddressFormat(), 40.7337807, -73.9974401, new Geocoder.ReverseGeocoderCallback() {
+ geocoder.getAddress(40.7337807, -73.9974401, new Geocoder.ReverseGeocoderCallback() {
@Override
public void onSuccess(String address) {
setAddress(address);
@@ -57,13 +63,16 @@ public class GeocoderTest {
public void onFailure(Throwable e) {
}
});
- Assert.assertEquals("35 West 9th Street, NYC, New York, US", waitAddress());
+ Assert.assertEquals("35 West 9th Street, NYC, New York, US", waitAddress());
+
+ Assert.assertEquals("35 West 9th Street, NYC, New York, US",
+ geocoder.getAddress(40.7337807, -73.9974401, null));
}
public void testGisgraphy() throws InterruptedException {
- Geocoder geocoder = new GisgraphyGeocoder();
+ Geocoder geocoder = new GisgraphyGeocoder(new AddressFormat());
- geocoder.getAddress(new AddressFormat(), 48.8530000, 2.3400000, new Geocoder.ReverseGeocoderCallback() {
+ geocoder.getAddress(48.8530000, 2.3400000, new Geocoder.ReverseGeocoderCallback() {
@Override
public void onSuccess(String address) {
setAddress(address);
@@ -73,14 +82,16 @@ public class GeocoderTest {
public void onFailure(Throwable e) {
}
});
- Assert.assertEquals("Rue du Jardinet, Paris, FR", waitAddress());
+ Assert.assertEquals("Rue du Jardinet, Paris, FR", waitAddress());
+
+ Assert.assertEquals("Rue du Jardinet, Paris, FR", geocoder.getAddress(48.8530000, 2.3400000, null));
}
public void testOpenCage() throws InterruptedException {
Geocoder geocoder = new OpenCageGeocoder(
- "http://api.opencagedata.com/geocode/v1", "SECRET", 0);
+ "http://api.opencagedata.com/geocode/v1", "SECRET", 0, new AddressFormat());
- geocoder.getAddress(new AddressFormat(), 34.116302, -118.051519, new Geocoder.ReverseGeocoderCallback() {
+ geocoder.getAddress(34.116302, -118.051519, new Geocoder.ReverseGeocoderCallback() {
@Override
public void onSuccess(String address) {
setAddress(address);
@@ -90,13 +101,15 @@ public class GeocoderTest {
public void onFailure(Throwable e) {
}
});
- Assert.assertEquals("Charleston Road, California, US", waitAddress());
+ Assert.assertEquals("Charleston Road, California, US", waitAddress());
+
+ Assert.assertEquals("Charleston Road, California, US", geocoder.getAddress(34.116302, -118.051519, null));
}
public void testGeocodeFarm() throws InterruptedException {
- Geocoder geocoder = new GeocodeFarmGeocoder(null, null, 0);
+ Geocoder geocoder = new GeocodeFarmGeocoder(null, null, 0, new AddressFormat());
- geocoder.getAddress(new AddressFormat(), 34.116302, -118.051519, new Geocoder.ReverseGeocoderCallback() {
+ geocoder.getAddress(34.116302, -118.051519, new Geocoder.ReverseGeocoderCallback() {
@Override
public void onSuccess(String address) {
setAddress(address);
@@ -106,7 +119,10 @@ public class GeocoderTest {
public void onFailure(Throwable e) {
}
});
- Assert.assertEquals("Estrella Avenue, Arcadia, California, United States", waitAddress());
+ Assert.assertEquals("Estrella Avenue, Arcadia, California, United States", waitAddress());
+
+ Assert.assertEquals("Estrella Avenue, Arcadia, California, United States",
+ geocoder.getAddress(34.116302, -118.051519, null));
}
}