diff options
Diffstat (limited to 'src/org/traccar/geocode/NominatimReverseGeocoder.java')
-rw-r--r-- | src/org/traccar/geocode/NominatimReverseGeocoder.java | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/src/org/traccar/geocode/NominatimReverseGeocoder.java b/src/org/traccar/geocode/NominatimReverseGeocoder.java index c9393da42..911e0fa71 100644 --- a/src/org/traccar/geocode/NominatimReverseGeocoder.java +++ b/src/org/traccar/geocode/NominatimReverseGeocoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2014 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2014 - 2015 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,12 @@ */ package org.traccar.geocode; +import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -26,23 +30,50 @@ import org.w3c.dom.Document; public class NominatimReverseGeocoder implements ReverseGeocoder { private final String url; + + public NominatimReverseGeocoder() { + this("http://nominatim.openstreetmap.org/reverse"); + } public NominatimReverseGeocoder(String url) { - this.url = url + "?format=xml&lat=%f&lon=%f&zoom=18&addressdetails=0"; + this.url = url + "?format=json&lat=%f&lon=%f&zoom=18&addressdetails=1"; } @Override - public String getAddress(double latitude, double longitude) { + public String getAddress(AddressFormat format, double latitude, double longitude) { try { - + Address address = new Address(); URLConnection conn = new URL(String.format(url, latitude, longitude)).openConnection(); - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.parse(conn.getInputStream()); - - return doc.getFirstChild().getLastChild().getFirstChild().getNodeValue(); + JsonObject json = Json.createReader(new InputStreamReader(conn.getInputStream())).readObject().getJsonObject("address"); + + if (json.containsKey("house_number")) { + address.setHouse(json.getString("house_number")); + } + if (json.containsKey("road")) { + address.setStreet(json.getString("road")); + } + if (json.containsKey("village")) { + address.setSettlement(json.getString("village")); + } + if (json.containsKey("city")) { + address.setSettlement(json.getString("city")); + } + if (json.containsKey("state_district")) { + address.setDistrict(json.getString("state_district")); + } + if (json.containsKey("state")) { + address.setState(json.getString("state")); + } + if (json.containsKey("country_code")) { + address.setCountry(json.getString("country_code").toUpperCase()); + } + if (json.containsKey("postcode")) { + address.setPostcode(json.getString("postcode")); + } + + return format.format(address); } catch(Exception error) { Log.warning(error); |