/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.maps.sample.hellomaps.client; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.maps.client.InfoWindow; import com.google.gwt.maps.client.InfoWindowContent; import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.geocode.Geocoder; import com.google.gwt.maps.client.geocode.LatLngCallback; import com.google.gwt.maps.client.geom.LatLng; import com.google.gwt.maps.client.overlay.Marker; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; import com.google.gwt.user.client.ui.FormPanel.SubmitHandler; /** * You can access the Google Maps API geocoder via the GClientGeocoder object. * Use the GClientGeocoder.getLatLng() method to convert a string address into a * GLatLng. Because geocoding involves sending a request to Google's servers, it * can take some time. To avoid making your script wait, you should pass in a * callback function to execute after the response returns. * * In this example, we geocode an address, add a marker at that point, and open * an info window displaying the address. */ public class GeocoderDemo extends MapsDemo { private static final LatLng ATLANTA = LatLng.newInstance(33.7814790, -84.3880580); private static HTML descHTML = null; private static final String descString = "<p>Creates a 500 x 300 pixel map " + "viewport centered on Atlanta, GA USA.</p>" + "<p>Type an address in the textbox. Clicking the 'Go' button will" + "contact the Google Geocoding service, display the resulting " + "Lat/Lng coordinates, and re-position the map with those coordinates" + "in the center </p>\n" + "<p>Equivalent to the Maps JavaScript API Example: " + "<a href=\"http://code.google.com/apis/maps/documentation/examples/geocoding-simple.html\">" + "http://code.google.com/apis/maps/documentation/examples/geocoding-simple.html</a></p>\n"; public static MapsDemoInfo init() { return new MapsDemoInfo() { @Override public MapsDemo createInstance() { return new GeocoderDemo(); } @Override public HTML getDescriptionHTML() { if (descHTML == null) { descHTML = new HTML(descString); } return descHTML; } @Override public String getName() { return "Geocoding: Simple"; } }; } private Geocoder geocoder; private Label latLabel; private Label lngLabel; private MapWidget map; public GeocoderDemo() { Panel panel = new FlowPanel(); final FormPanel form = new FormPanel(); form.setAction("#"); Panel formElements = new FlowPanel(); final TextBox address = new TextBox(); address.setVisibleLength(60); address.setText("10 10th Street, Atlanta, GA"); formElements.add(address); formElements.add(buildLatLngPanel()); this.displayLatLng(ATLANTA); Button submit = new Button("Go!"); submit.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { form.submit(); } }); formElements.add(submit); form.add(formElements); form.addSubmitHandler(new SubmitHandler() { public void onSubmit(SubmitEvent event) { showAddress(address.getText()); event.cancel(); } }); panel.add(form); map = new MapWidget(ATLANTA, 13); map.setSize("500px", "300px"); panel.add(map); initWidget(panel); geocoder = new Geocoder(); } /* * Build a horizontal panel to display latitude and longitude returned from * the geocoding service. * * Broke this function out to make the constructor more readable. */ private Panel buildLatLngPanel() { HorizontalPanel horiz = new HorizontalPanel(); horiz.add(new Label("Lat:")); latLabel = new Label(); horiz.add(latLabel); horiz.add(new Label("Long:")); lngLabel = new Label(); horiz.add(lngLabel); horiz.setSpacing(10); return horiz; } private void displayLatLng(LatLng point) { NumberFormat fmt = NumberFormat.getFormat("#.0000000#"); latLabel.setText(fmt.format(point.getLatitude())); lngLabel.setText(fmt.format(point.getLongitude())); } private void showAddress(final String address) { final InfoWindow info = map.getInfoWindow(); geocoder.getLatLng(address, new LatLngCallback() { public void onFailure() { Window.alert(address + " not found"); } public void onSuccess(LatLng point) { map.setCenter(point, 13); Marker marker = new Marker(point); map.addOverlay(marker); info.open(marker, new InfoWindowContent(address)); displayLatLng(point); } }); } }