package org.sigmah.client.ui.widget.map; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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/gpl-3.0.html>. * #L% */ import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.Maps; import com.google.gwt.maps.client.event.MarkerDragEndHandler; import com.google.gwt.maps.client.geom.LatLng; import com.google.gwt.maps.client.geom.LatLngBounds; import com.google.gwt.maps.client.geom.Point; import com.google.gwt.maps.client.geom.Size; import com.google.gwt.maps.client.overlay.Icon; import com.google.gwt.maps.client.overlay.Marker; import com.google.gwt.maps.client.overlay.MarkerOptions; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Label; import java.util.List; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.map.MapApiLoader; import org.sigmah.client.ui.notif.N10N; import org.sigmah.shared.dto.BoundingBoxDTO; /** * WorldMap implementation using Google Maps. * * @author Raphaƫl Calabro (rcalabro@ideia.fr) */ public class GoogleWorldMap extends AbstractWorldMap<Marker> { private MapWidget map; @Override protected void init() { MapApiLoader.load(new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { getRoot().add(new Label(I18N.CONSTANTS.connectionProblem())); setInitialized(true); } @Override public void onSuccess(Void result) { if(Maps.isLoaded()) { map = new MapWidget(); map.setHeight("100%"); getRoot().add(map); setInitialized(true); } else { N10N.errorNotif(I18N.CONSTANTS.googleMaps(), I18N.CONSTANTS.cannotLoadMap()); } } }); } @Override public String getName() { return "Google Maps"; } @Override protected void displayBounds(BoundingBoxDTO bounds) { final BoundingBoxDTO effectiveBounds = bounds != null ? bounds : new BoundingBoxDTO(); final LatLngBounds latLngBounds = toLatLngBounds(effectiveBounds); final int zoomLevel = map.getBoundsZoomLevel(latLngBounds); map.setCenter(latLngBounds.getCenter()); map.setZoomLevel(zoomLevel); } @Override protected void displayCenterAndZoom(double latitude, double longitude, int zoom) { map.setCenter(LatLng.newInstance(latitude, longitude)); map.setZoomLevel(zoom); } @Override protected Marker createNativePin(Pin pin) { final MarkerOptions options = MarkerOptions.newInstance(); if(pin.getTitle() != null) { options.setTitle(pin.getTitle()); } options.setDraggable(pin.isDraggable()); if(pin.getImageURL() != null) { final Icon icon = Icon.newInstance(pin.getImageURL()); icon.setIconSize(Size.newInstance(pin.getImageWidth(), pin.getImageHeight())); icon.setIconAnchor(Point.newInstance( // Horizontal center pin.getImageWidth() / 2, // Bottom pin.getImageHeight())); options.setIcon(icon); } return new Marker( LatLng.newInstance(pin.getLatitude(), pin.getLongitude()), options); } @Override protected void addPinDragEndHandler(Marker pin, final PinDragEndHandler dragEndHandler) { pin.addMarkerDragEndHandler(new MarkerDragEndHandler() { @Override public void onDragEnd(MarkerDragEndHandler.MarkerDragEndEvent event) { final LatLng latLng = event.getSender().getLatLng(); dragEndHandler.onDragEnd(latLng.getLatitude(), latLng.getLongitude()); } }); } @Override protected void displayPins(List<Marker> markers) { map.clearOverlays(); for(final Marker marker : markers) { map.addOverlay(marker); } } @Override public void panTo(double latitude, double longitude) { map.panTo(LatLng.newInstance(latitude, longitude)); } @Override protected void movePin(Marker marker, double latitude, double longitude) { marker.setLatLng(LatLng.newInstance(latitude, longitude)); } /** * Create an instance of LatLngBounds with the bounds defined by this object. * @return A new LatLngBounds instance. */ private LatLngBounds toLatLngBounds(BoundingBoxDTO boundingBox) { return LatLngBounds.newInstance( LatLng.newInstance(boundingBox.getY1(), boundingBox.getX1()), LatLng.newInstance(boundingBox.getY2(), boundingBox.getX2())); } }