/* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.opentripplanner.geocoder.google; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.UriBuilder; import org.opentripplanner.geocoder.Geocoder; import org.opentripplanner.geocoder.GeocoderResult; import org.opentripplanner.geocoder.GeocoderResults; import com.vividsolutions.jts.geom.Envelope; public class GoogleGeocoder implements Geocoder { private GoogleJsonDeserializer googleJsonDeserializer = new GoogleJsonDeserializer(); @Override public GeocoderResults geocode(String address, Envelope bbox) { String content = null; try { // make json request URL googleGeocoderUrl = getGoogleGeocoderUrl(address); URLConnection conn = googleGeocoderUrl.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); StringBuilder sb = new StringBuilder(128); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\n"); } reader.close(); content = sb.toString(); } catch (IOException e) { e.printStackTrace(); return noGeocoderResult("Error parsing geocoder response"); } GoogleGeocoderResults googleGeocoderResults = googleJsonDeserializer.parseResults(content); List<GoogleGeocoderResult> googleResults = googleGeocoderResults.getResults(); List<GeocoderResult> geocoderResults = new ArrayList<GeocoderResult>(); for (GoogleGeocoderResult googleGeocoderResult : googleResults) { Geometry geometry = googleGeocoderResult.getGeometry(); Location location = geometry.getLocation(); Double lat = location.getLat(); Double lng = location.getLng(); String formattedAddress = googleGeocoderResult.getFormatted_address(); GeocoderResult geocoderResult = new GeocoderResult(lat, lng, formattedAddress); geocoderResults.add(geocoderResult); } return new GeocoderResults(geocoderResults); } private GeocoderResults noGeocoderResult(String error) { return new GeocoderResults(error); } private URL getGoogleGeocoderUrl(String address) throws IOException { UriBuilder uriBuilder = UriBuilder.fromUri("http://maps.google.com/maps/api/geocode/json"); uriBuilder.queryParam("sensor", false); uriBuilder.queryParam("address", address); URI uri = uriBuilder.build(); return new URL(uri.toString()); } }