Finding Latitude and Longitude through Zip Codes in Java

I'm having problems getting latitude and longitude values ​​from a given zip code. I am trying to do this with a servlet, that is, the zip code value is passed to the Servlet, and the Java code then uses the Google Geocode API to retrieve the latitude and longitude values, preferably to a string.

I walked around the net for a simple example, but for this, there seems to be more Javascript and PHP methods than Java.

Can someone insert a simple example of how to extract lat / long values ​​this way?

Thanks in advance!

-Rei

+4
source share
2 answers

OK long answer. This is the code that I have successfully used to poll the Google Geocoding API. This requires working with GSon, but alternatively, you can probably decode the answers manually if you do not want to use GSon:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import org.slf4j.Logger; import com.google.gson.Gson; import com.google.gson.JsonIOException; import com.google.gson.JsonSyntaxException; public class GeoCoder { private Gson gson = new Gson(); private volatile long lastRequest = 0L; public GeocodeResponse getLocation(String... addressElements) throws JsonSyntaxException, JsonIOException, MalformedURLException, IOException { StringBuilder sb = new StringBuilder(); for (String string : addressElements) { if (sb.length() > 0) { sb.append('+'); } sb.append(URLEncoder.encode(string.replace(' ', '+'), "UTF-8")); } String url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=" + sb.toString(); // Google limits this web service to 2500/day and 10 requests/s synchronized (this) { try { long elapsed = System.currentTimeMillis() - lastRequest; if (elapsed < 100) { try { Thread.sleep(100 - elapsed); } catch (InterruptedException e) { } } return gson.fromJson(new BufferedReader(new InputStreamReader(new URL(url).openStream())), GeocodeResponse.class); } finally { lastRequest = System.currentTimeMillis(); } } } } 

And other classes: GeocodeResponse:

 import java.util.List; public class GeocodeResponse { public enum Status { OK, ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED, INVALID_REQUEST; } public static class Result { public static enum Type { street_address, route, intersection, political, country, administrative_area_level_1, administrative_area_level_2, administrative_area_level_3, colloquial_area, locality, sublocality, neighborhood, premise, subpremise, postal_code, natural_feature, airport, park, point_of_interest, post_box, street_number, floor, room; } public static class AddressComponent { private String long_name; private String short_name; private Type[] types; public String getLong_name() { return long_name; } public void setLong_name(String long_name) { this.long_name = long_name; } public String getShort_name() { return short_name; } public void setShort_name(String short_name) { this.short_name = short_name; } public Type[] getTypes() { return types; } public void setTypes(Type[] types) { this.types = types; } } private String formatted_address; private List<AddressComponent> address_components; private Geometry geometry; private Type[] types; public Type[] getTypes() { return types; } public void setTypes(Type[] types) { this.types = types; } public String getFormatted_address() { return formatted_address; } public void setFormatted_address(String formatted_address) { this.formatted_address = formatted_address; } public List<AddressComponent> getAddress_components() { return address_components; } public void setAddress_components(List<AddressComponent> address_components) { this.address_components = address_components; } public Geometry getGeometry() { return geometry; } public void setGeometry(Geometry geometry) { this.geometry = geometry; } } public static class Geometry { public static enum LocationType { ROOFTOP, RANGE_INTERPOLATED, GEOMETRIC_CENTER, APPROXIMATE; } public static class ViewPort { private Location northeast; private Location southwest; public Location getNortheast() { return northeast; } public void setNortheast(Location northeast) { this.northeast = northeast; } public Location getSouthwest() { return southwest; } public void setSouthwest(Location southwest) { this.southwest = southwest; } } private Location location; private LocationType location_type; private ViewPort viewport; public Location getLocation() { return location; } public void setLocation(Location location) { this.location = location; } public LocationType getLocation_type() { return location_type; } public void setLocation_type(LocationType location_type) { this.location_type = location_type; } public ViewPort getViewport() { return viewport; } public void setViewport(ViewPort viewport) { this.viewport = viewport; } } private Status status; private List<Result> results; public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public List<Result> getResults() { return results; } public void setResults(List<Result> results) { this.results = results; } } 

Location:

 public class Location { private double lat; private double lng; public Location() { } public Location(double lat, double lng) { this.lat = lat; this.lng = lng; } public double getLat() { return lat; } public void setLat(double lat) { this.lat = lat; } public double getLng() { return lng; } public void setLng(double lng) { this.lng = lng; } } 
+12
source

It is not as elegant as Guillaume Polet's answer, but it does not need additional libraries.

With an argument:

 "1600 Amphitheatre Parkway, Mountain View, CA" 

He prints the answer:

 Latitude: 37.42207610 Longitude: -122.08451870 

Here is the code:

 import java.io.IOException; import java.io.InputStream; import java.net.URL; public class GoogleGeoCode { private static final String GEO_CODE_SERVER = "http://maps.googleapis.com/maps/api/geocode/json?"; public static void main(String[] args) { String code = args[0]; String response = getLocation(code); String[] result = parseLocation(response); System.out.println("Latitude: " + result[0]); System.out.println("Longitude: " + result[1]); } private static String getLocation(String code) { String address = buildUrl(code); String content = null; try { URL url = new URL(address); InputStream stream = url.openStream(); try { int available = stream.available(); byte[] bytes = new byte[available]; stream.read(bytes); content = new String(bytes); } finally { stream.close(); } return (String) content.toString(); } catch (IOException e) { throw new RuntimeException(e); } } private static String buildUrl(String code) { StringBuilder builder = new StringBuilder(); builder.append(GEO_CODE_SERVER); builder.append("address="); builder.append(code.replaceAll(" ", "+")); builder.append("&sensor=false"); return builder.toString(); } private static String[] parseLocation(String response) { // Look for location using brute force. // There are much nicer ways to do this, eg with Google JSON library: Gson // https://sites.google.com/site/gson/gson-user-guide String[] lines = response.split("\n"); String lat = null; String lng = null; for (int i = 0; i < lines.length; i++) { if ("\"location\" : {".equals(lines[i].trim())) { lat = getOrdinate(lines[i+1]); lng = getOrdinate(lines[i+2]); break; } } return new String[] {lat, lng}; } private static String getOrdinate(String s) { String[] split = s.trim().split(" "); if (split.length < 1) { return null; } String ord = split[split.length - 1]; if (ord.endsWith(",")) { ord = ord.substring(0, ord.length() - 1); } // Check that the result is a valid double Double.parseDouble(ord); return ord; } } 
+5
source

Source: https://habr.com/ru/post/1400192/


All Articles