2020-11-19 15:19:27 +01:00
|
|
|
package org.gcube.portlets.user.geoportaldataviewer.client;
|
|
|
|
|
2021-09-01 12:51:06 +02:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION;
|
2021-08-31 18:21:17 +02:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MapEventType;
|
2020-11-19 15:19:27 +01:00
|
|
|
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;
|
2021-11-12 14:54:54 +01:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerMap;
|
2021-09-01 12:51:06 +02:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.ui.map.ExtentMapUtil;
|
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.ui.map.ExtentMapUtil.Location;
|
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.ui.map.ExtentMapUtil.PLACE;
|
2021-11-12 12:37:15 +01:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer;
|
2020-11-19 15:19:27 +01:00
|
|
|
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;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The Class OLMapManager.
|
|
|
|
*
|
|
|
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
|
|
|
*
|
2021-08-31 18:21:17 +02:00
|
|
|
* Nov 19, 2020
|
2020-11-19 15:19:27 +01:00
|
|
|
*/
|
|
|
|
public class OLMapManager {
|
|
|
|
|
|
|
|
private String targetId;
|
|
|
|
private HandlerManager layerManagerBus;
|
2021-11-12 14:54:54 +01:00
|
|
|
private OpenLayerMap olMap;
|
2020-11-19 15:19:27 +01:00
|
|
|
private ol.Extent dragStartExtent = null;
|
|
|
|
private Double zoomStart = null;
|
|
|
|
private Double zoomEnd = null;
|
|
|
|
private ol.Extent dragEndExtent = null;
|
2021-08-31 18:21:17 +02:00
|
|
|
public static final int QUERY_MIN_ZOOM_LEVEL = 13;
|
2021-09-08 16:15:36 +02:00
|
|
|
public static final Double LAYER_DETAIL_MIN_RESOLUTION = 0.01;
|
2021-10-14 11:34:04 +02:00
|
|
|
public static final Double LAYER_DETAIL_MAX_RESOLUTION = 18.5;
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Instantiates a new OL map manager.
|
|
|
|
*
|
2021-08-31 18:21:17 +02:00
|
|
|
* @param targetId the target id
|
2020-11-19 15:19:27 +01:00
|
|
|
* @param layerManagerBus the layer manager bus
|
2021-12-07 17:13:20 +01:00
|
|
|
* @param baseMapLayer the base map layer
|
2020-11-19 15:19:27 +01:00
|
|
|
*/
|
2021-11-12 12:37:15 +01:00
|
|
|
public OLMapManager(String targetId, HandlerManager layerManagerBus, BaseMapLayer baseMapLayer) {
|
2020-11-19 15:19:27 +01:00
|
|
|
this.targetId = targetId;
|
|
|
|
this.layerManagerBus = layerManagerBus;
|
2021-11-12 12:37:15 +01:00
|
|
|
instanceOLMap(baseMapLayer);
|
2020-11-19 15:19:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Instance OL map.
|
2021-11-12 14:54:54 +01:00
|
|
|
*
|
|
|
|
* @param baseMapLayer the base map layer
|
2020-11-19 15:19:27 +01:00
|
|
|
*/
|
2021-11-12 12:37:15 +01:00
|
|
|
public void instanceOLMap(BaseMapLayer baseMapLayer) {
|
2020-11-19 15:19:27 +01:00
|
|
|
|
2021-11-12 14:54:54 +01:00
|
|
|
olMap = new OpenLayerMap(targetId, layerManagerBus, baseMapLayer) {
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void clickListener(MapBrowserEvent event) {
|
|
|
|
Coordinate coordinate = event.getCoordinate();
|
2021-08-31 18:21:17 +02:00
|
|
|
if (!olMap.mapInstancied())
|
2020-11-19 15:19:27 +01:00
|
|
|
return;
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-20 18:10:43 +01:00
|
|
|
// if (olMap.isQueryPointActive()) {
|
|
|
|
// GeoQuery select = toDataPointQuery(coordinate);
|
|
|
|
// layerManagerBus.fireEvent(new QueryDataEvent(select, coordinate));
|
|
|
|
//
|
|
|
|
// }
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2021-12-07 17:13:20 +01:00
|
|
|
ExtentWrapped toExt = new ExtentWrapped(coordinate.getX(), coordinate.getY(), coordinate.getX(),
|
|
|
|
coordinate.getY());
|
2021-08-31 18:21:17 +02:00
|
|
|
GeoQuery select = toDataPointQuery(coordinate, true);
|
2021-09-08 14:40:36 +02:00
|
|
|
layerManagerBus.fireEvent(new QueryDataEvent(select, toExt, null, true, MapEventType.MOUSE_CLICK));
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void moveEndListener(MapEvent event) {
|
2021-08-31 18:21:17 +02:00
|
|
|
// onInit
|
|
|
|
if (!olMap.mapInstancied())
|
2020-11-19 15:19:27 +01:00
|
|
|
return;
|
2021-08-31 18:21:17 +02:00
|
|
|
|
|
|
|
checkSelectQuery(MapEventType.MOVE_END);
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void moveStartListener(MapEvent event) {
|
2021-08-31 18:21:17 +02:00
|
|
|
|
|
|
|
// onInit
|
|
|
|
if (!olMap.mapInstancied())
|
2020-11-19 15:19:27 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
setDragStart();
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void mapZoomListener(MapEvent event) {
|
2021-08-31 18:21:17 +02:00
|
|
|
|
|
|
|
// onInit
|
|
|
|
if (!olMap.mapInstancied())
|
2020-11-19 15:19:27 +01:00
|
|
|
return;
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
setDragStart();
|
|
|
|
zoomStart = olMap.getCurrentZoomLevel();
|
2021-08-31 18:21:17 +02:00
|
|
|
GWT.log("zoomStart: " + zoomStart);
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void mapZoomEndListener(MapEvent event) {
|
2021-08-31 18:21:17 +02:00
|
|
|
// onInit
|
|
|
|
if (!olMap.mapInstancied())
|
2020-11-19 15:19:27 +01:00
|
|
|
return;
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
setDragStart();
|
|
|
|
zoomEnd = olMap.getCurrentZoomLevel();
|
2021-08-31 18:21:17 +02:00
|
|
|
GWT.log("zoomEnd: " + zoomEnd);
|
|
|
|
checkSelectQuery(MapEventType.MAP_ZOOM_END);
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2021-09-01 12:51:06 +02:00
|
|
|
Location italyLocation = ExtentMapUtil.getLocation(PLACE.ITALY);
|
|
|
|
Coordinate transformedCenterCoordinate = italyLocation.getCoordinate(MAP_PROJECTION.EPSG_3857);
|
2020-11-19 15:19:27 +01:00
|
|
|
olMap.setCenter(transformedCenterCoordinate);
|
2021-09-01 12:51:06 +02:00
|
|
|
olMap.setZoom(italyLocation.getZoomLevel());
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To data point query.
|
|
|
|
*
|
2021-12-07 17:13:20 +01:00
|
|
|
* @param coordinate the coordinate
|
2021-11-12 14:54:54 +01:00
|
|
|
* @param manualClick the manual click
|
2020-11-19 15:19:27 +01:00
|
|
|
* @return the geo query
|
|
|
|
*/
|
2021-08-02 16:45:05 +02:00
|
|
|
public GeoQuery toDataPointQuery(Coordinate coordinate, boolean manualClick) {
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
double lon = coordinate.getX();
|
|
|
|
double lat = coordinate.getY();
|
2021-08-31 18:21:17 +02:00
|
|
|
GWT.log("To quey DP: " + coordinate);
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
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());
|
2021-12-07 17:13:20 +01:00
|
|
|
|
2021-08-02 16:45:05 +02:00
|
|
|
double geoWidth = 0;
|
2021-08-31 18:21:17 +02:00
|
|
|
// adding a tolerance in case of manual click
|
|
|
|
if (manualClick) {
|
|
|
|
// adding a tolerance for clicking
|
2021-12-07 17:13:20 +01:00
|
|
|
// geoWidth = (bboxWidth / w) * (14 / 2);
|
2021-09-08 17:13:59 +02:00
|
|
|
geoWidth = (bboxWidth / w) * (16 / 2);
|
2021-08-31 18:21:17 +02:00
|
|
|
} else {
|
|
|
|
// data point selection for coordinate loaded from concessione
|
2021-08-02 16:45:05 +02:00
|
|
|
geoWidth = (bboxWidth / w) * (2);
|
|
|
|
}
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
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+")");
|
|
|
|
|
|
|
|
GeoQuery select = new GeoQuery(x1, y1, x2, y2, TYPE.POINT);
|
|
|
|
return select;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2021-11-12 14:54:54 +01:00
|
|
|
* Gets the OL map.
|
2020-11-19 15:19:27 +01:00
|
|
|
*
|
2021-11-12 14:54:54 +01:00
|
|
|
* @return the OL map
|
2020-11-19 15:19:27 +01:00
|
|
|
*/
|
2021-11-12 14:54:54 +01:00
|
|
|
public OpenLayerMap getOLMap() {
|
2020-11-19 15:19:27 +01:00
|
|
|
return olMap;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check select query.
|
2021-11-12 14:54:54 +01:00
|
|
|
*
|
|
|
|
* @param mapEventType the map event type
|
2020-11-19 15:19:27 +01:00
|
|
|
*/
|
2021-08-31 18:21:17 +02:00
|
|
|
private void checkSelectQuery(MapEventType mapEventType) {
|
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
GWT.log("Zoom is:" + olMap.getCurrentZoomLevel());
|
2021-09-02 12:54:39 +02:00
|
|
|
GWT.log("Resolution is:" + olMap.getCurrentResolution());
|
2020-11-19 15:19:27 +01:00
|
|
|
|
|
|
|
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);
|
2021-12-07 17:13:20 +01:00
|
|
|
// TODO THE AUTOMATICALLY SHOWING POP-UP ACCORDING TO ZOOM IS BUGGY
|
2021-09-08 14:40:36 +02:00
|
|
|
layerManagerBus.fireEvent(new QueryDataEvent(select, endExt, null, false, mapEventType));
|
2020-11-19 15:19:27 +01:00
|
|
|
}
|
2021-08-31 18:21:17 +02:00
|
|
|
} else if (zoomStart != null && zoomEnd != null) {
|
|
|
|
|
|
|
|
if (zoomEnd < QUERY_MIN_ZOOM_LEVEL) {
|
2020-11-19 15:19:27 +01:00
|
|
|
layerManagerBus.fireEvent(new ZoomOutOverMinimumEvent(zoomStart, zoomEnd, QUERY_MIN_ZOOM_LEVEL));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the drag start.
|
|
|
|
*/
|
|
|
|
private void setDragStart() {
|
|
|
|
if (olMap.getCurrentZoomLevel() > QUERY_MIN_ZOOM_LEVEL) {
|
|
|
|
dragStartExtent = olMap.getExtent();
|
|
|
|
GWT.log("Drag Start is: " + dragStartExtent);
|
|
|
|
}
|
|
|
|
}
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
/**
|
|
|
|
* To data point query.
|
|
|
|
*
|
|
|
|
* @param extent the extent
|
|
|
|
* @return the geo query
|
|
|
|
*/
|
|
|
|
private GeoQuery toDataBoxQuery(ol.Extent extent) {
|
2021-08-31 18:21:17 +02:00
|
|
|
|
|
|
|
return new GeoQuery(extent.getLowerLeftX(), extent.getLowerLeftY(), extent.getUpperRightX(),
|
|
|
|
extent.getUpperRightY(), TYPE.BOX);
|
2020-11-19 15:19:27 +01:00
|
|
|
}
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
/**
|
|
|
|
* 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();
|
|
|
|
}
|
2021-08-31 18:21:17 +02:00
|
|
|
|
2020-11-19 15:19:27 +01:00
|
|
|
}
|