package org.gcube.portlets.user.geoportaldataviewer.client; import org.gcube.portlets.user.geoportaldataviewer.client.events.QueryDataEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMinimumEvent; import org.gcube.portlets.user.geoportaldataviewer.client.gis.ExtentWrapped; import org.gcube.portlets.user.geoportaldataviewer.client.gis.MapUtils; import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerOSM; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.GeoQuery; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.GeoQuery.TYPE; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.HandlerManager; import ol.Coordinate; import ol.MapBrowserEvent; import ol.MapEvent; import ol.OLFactory; /** * The Class OLMapManager. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * * Nov 19, 2020 */ public class OLMapManager { private String targetId; private HandlerManager layerManagerBus; private OpenLayerOSM olMap; private ol.Extent dragStartExtent = null; private Double zoomStart = null; private Double zoomEnd = null; private ol.Extent dragEndExtent = null; private static final int QUERY_MIN_ZOOM_LEVEL = 13; /** * Instantiates a new OL map manager. * * @param targetId the target id * @param layerManagerBus the layer manager bus */ public OLMapManager(String targetId, HandlerManager layerManagerBus) { this.targetId = targetId; this.layerManagerBus = layerManagerBus; instanceOLMap(); } /** * Instance OL map. */ public void instanceOLMap() { olMap = new OpenLayerOSM(targetId, layerManagerBus) { @Override public void clickListener(MapBrowserEvent event) { Coordinate coordinate = event.getCoordinate(); if(!olMap.mapInstancied()) return; if (olMap.isQueryPointActive()) { GeoQuery select = toDataPointQuery(coordinate); layerManagerBus.fireEvent(new QueryDataEvent(select, coordinate)); } } @Override public void moveEndListener(MapEvent event) { //onInit if(!olMap.mapInstancied()) return; checkSelectQuery(); } @Override public void moveStartListener(MapEvent event) { //onInit if(!olMap.mapInstancied()) return; setDragStart(); } @Override public void mapZoomListener(MapEvent event) { //onInit if(!olMap.mapInstancied()) return; setDragStart(); zoomStart = olMap.getCurrentZoomLevel(); GWT.log("zoomStart: "+zoomStart); } @Override public void mapZoomEndListener(MapEvent event) { //onInit //onInit if(!olMap.mapInstancied()) return; setDragStart(); zoomEnd = olMap.getCurrentZoomLevel(); GWT.log("zoomEnd: "+zoomEnd); checkSelectQuery(); } }; // EPSG_4326_TO_ITALY Coordinate centerCoordinate = OLFactory.createCoordinate(GeoportalDataViewerConstants.ITALY_CENTER_LONG, GeoportalDataViewerConstants.ITALY_CENTER_LAT); Coordinate transformedCenterCoordinate = MapUtils.transformCoordiante(centerCoordinate, GeoportalDataViewerConstants.EPSG_4326, GeoportalDataViewerConstants.EPSG_3857); olMap.setCenter(transformedCenterCoordinate); olMap.setZoom(GeoportalDataViewerConstants.ITALY_FIT_ZOOM_ON); } /** * To data point query. * * @param coordinate the coordinate * @return the geo query */ public GeoQuery toDataPointQuery(Coordinate coordinate) { double lon = coordinate.getX(); double lat = coordinate.getY(); int w = (int) olMap.getSize().getWidth(); int h = (int) olMap.getSize().getHeight(); // handler.clickOnMap(x, y, w, h); // ratio - mapPixelWeight : bboxWeight = 20px : geoRectangleWidth // where 10px is the pixel diameter dimension of the clicked point double bboxWidth = Math.abs(olMap.getExtent().getLowerLeftX() - olMap.getExtent().getUpperRightX()); double geoWidth = (bboxWidth / w) * (20 / 2); double x1 = Math.min(lon + geoWidth, lon - geoWidth); double x2 = Math.max(lon + geoWidth, lon - geoWidth); double y1 = Math.min(lat + geoWidth, lat - geoWidth); double y2 = Math.max(lat + geoWidth, lat - geoWidth); // GWT.log("("+x1+","+y1+")("+x2+","+y2+")"); // Point pt = new Point(coordinate); // ol.Extent extent = pt.getExtent(); // //new ClickDataInfo(x1, y1, x2, y2) // SelectDataInfo selectDataInfo // selectBox(new GeoQuery(x1, y1, x2, y2, GeoQuery.TYPE.POINT)); GeoQuery select = new GeoQuery(x1, y1, x2, y2, TYPE.POINT); return select; } /** * Gets the OLOSM map. * * @return the OLOSM map */ public OpenLayerOSM getOLOSMMap() { return olMap; } /** * Check select query. */ private void checkSelectQuery() { GWT.log("Zoom is:" + olMap.getCurrentZoomLevel()); if (dragStartExtent != null && olMap.getCurrentZoomLevel() > QUERY_MIN_ZOOM_LEVEL) { dragEndExtent = olMap.getExtent(); // GWT.log("Drag end is: "+dragEndExtent); ExtentWrapped startExt = new ExtentWrapped(dragStartExtent.getLowerLeftX(), dragStartExtent.getLowerLeftY(), dragStartExtent.getUpperRightX(), dragStartExtent.getUpperRightY()); ExtentWrapped endExt = new ExtentWrapped(dragEndExtent.getLowerLeftX(), dragEndExtent.getLowerLeftY(), dragEndExtent.getUpperRightX(), dragEndExtent.getUpperRightY()); // GWT.log("start Ext: "+startExt); // GWT.log("endExt Ext: "+endExt); long dist = MapUtils.distanceBetweenCentroid(startExt, endExt); GWT.log("the distance is: " + dist); if (dist > 5000 || startExt.containsExtent(endExt)) { GeoQuery select = toDataBoxQuery(dragEndExtent); layerManagerBus.fireEvent(new QueryDataEvent(select, endExt.getCenter())); } } else if(zoomStart!=null && zoomEnd!=null) { if(zoomEnd QUERY_MIN_ZOOM_LEVEL) { dragStartExtent = olMap.getExtent(); GWT.log("Drag Start is: " + dragStartExtent); } } /** * To data point query. * * @param extent the extent * @return the geo query */ private GeoQuery toDataBoxQuery(ol.Extent extent) { return new GeoQuery(extent.getLowerLeftX(), extent.getLowerLeftY(), extent.getUpperRightX(), extent.getUpperRightY(), TYPE.BOX); } /** * Checks if is query point active. * * @return true, if is query point active */ public boolean isQueryPointActive() { return olMap.isQueryPointActive(); } /** * Hide pop info. */ public void hidePopInfo() { olMap.hidePopup(); } }