package mainpackage; import java.io.DataInputStream; import java.io.DataOutputStream; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.net.URLEncoder; import java.util.Calendar; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONTokener; public class MapsUtil { /** * Recupera endereço formatado * * @param address * @param number * @param neighborhood * @param city * @param federativeunit * @return endereço formatado */ private static String getFormattedAddress(String address, Integer number, String neighborhood, String city, String federativeunit) { StringBuilder fullAddress = new StringBuilder(); fullAddress.append(address); fullAddress.append(", ").append(number); if (neighborhood != null && !neighborhood.isEmpty()) { fullAddress.append(" - ").append(neighborhood); } if (city != null && !city.isEmpty()) { fullAddress.append(", ").append(city); } if (federativeunit != null && !federativeunit.isEmpty()) { fullAddress.append(" - ").append(federativeunit); } return fullAddress.toString(); } /** * Recupera latitude e longitude * * @param address * @param number * @param neighborhood * @param city * @param federativeunit * @return latitude e longitude em um objeto da classe GeoPoint */ public static GeoPoint getLatitudeLongitude(String address, Integer number, String neighborhood, String city, String federativeunit) { try { String fullAddress = getFormattedAddress(address, number, neighborhood, city, federativeunit); Proxy proxy = null; String host = System.getProperties().getProperty("http.proxyHost"); String port = System.getProperties().getProperty("http.proxyPort"); if (host != null && port != null) { proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, Integer.valueOf(port))); } final String UTF8 = "UTF-8"; StringBuilder builder = new StringBuilder(); builder.append("http://maps.googleapis.com/maps/api/geocode/json"); builder.append("?address=").append( URLEncoder.encode(fullAddress, UTF8) ); builder.append("&sensor=false"); // //Parametro fake para compor o body de uma requisição do tipo POST // String post = "dt=".concat(String.valueOf(Calendar.getInstance().getTimeInMillis())); URL url = new URL(builder.toString()); HttpURLConnection urlConnection = null; if (proxy == null) { urlConnection = (HttpURLConnection) url.openConnection(); } else { urlConnection = (HttpURLConnection) url.openConnection(proxy); } int timeout5segundos = 5 * 1000; urlConnection.setRequestMethod("POST"); urlConnection.setConnectTimeout(timeout5segundos); urlConnection.setDoInput(true); urlConnection.setDoOutput(true); urlConnection.setUseCaches(false); urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty("Content-Length", String.valueOf( post.getBytes(UTF8).length )); DataOutputStream outStream = new DataOutputStream(urlConnection.getOutputStream()); outStream.writeBytes(post); outStream.flush(); outStream.close(); /* ****************************** * Lendo resposta da requisição * * ******************************/ StringBuilder json = new StringBuilder(); DataInputStream responseStream = new DataInputStream(urlConnection.getInputStream()); int r = 0; byte[] buffer = new byte[4096]; while (true) { r = responseStream.read(buffer); if (r <= 0) { break; } if (urlConnection.getContentEncoding() != null) { json.append( new String(buffer, 0, r, urlConnection.getContentEncoding()) ); } else { json.append( new String(buffer, 0, r, UTF8)); } } responseStream.close(); urlConnection.disconnect(); if ( json.toString().contains("ZERO_RESULTS") ) { return null; } JSONTokener tokener = new JSONTokener(json.toString()); JSONObject object = new JSONObject(tokener); JSONArray results = object.getJSONArray("results"); JSONObject geometry = results.getJSONObject(0).getJSONObject("geometry"); JSONObject location = geometry.getJSONObject("location"); String latitude = location.getString("lat"); String longitude = location.getString("lng"); return new GeoPoint( new BigDecimal(latitude), new BigDecimal(longitude)); } catch (Exception ex) { throw new RuntimeException(ex); } } public static class GeoPoint implements java.io.Serializable { private static final long serialVersionUID = 5003693401489165529L; private BigDecimal latigude; private BigDecimal longitude; public GeoPoint(BigDecimal latigude, BigDecimal longitude) { super(); this.latigude = latigude; this.longitude = longitude; } public BigDecimal getLatigude() { return latigude; } public BigDecimal getLongitude() { return longitude; } @Override public boolean equals(Object object) { if (this == object) { return true; } if (!(object instanceof GeoPoint)) { return false; } final GeoPoint other = (GeoPoint) object; if (!(latigude == null ? other.latigude == null : latigude.equals(other.latigude))) { return false; } if (!(longitude == null ? other.longitude == null : longitude.equals(other.longitude))) { return false; } return true; } @Override public int hashCode() { final int PRIME = 37; int result = 1; result = PRIME * result + ((latigude == null) ? 0 : latigude.hashCode()); result = PRIME * result + ((longitude == null) ? 0 : longitude.hashCode()); return result; } @Override public String toString() { String str = super.toString(); str += "[lat:"+latigude+"|lng"+longitude+"]"; return str; } } }
sábado, 16 de agosto de 2014
Recuperando latitude e longitude no google
Have Fun!
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário