geoportal-data-viewer-app/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java

259 lines
7.5 KiB
Java
Raw Normal View History

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;
import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerOSM;
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;
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;
private OpenLayerOSM olMap;
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;
public static final Double LAYER_DETAIL_MIN_RESOLUTION = 0.01;
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
*/
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();
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-09-08 14:40:36 +02: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.
*
* @param coordinate the coordinate
* @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-09-07 17:29:56 +02: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-09-08 17:13:59 +02:00
//geoWidth = (bboxWidth / w) * (14 / 2);
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;
}
/**
* Gets the OLOSM map.
*
* @return the OLOSM map
*/
public OpenLayerOSM getOLOSMMap() {
return olMap;
}
/**
* Check select query.
*/
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());
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-09-08 14:40:36 +02:00
//TODO THE AUTOMATICALLY SHOWING POP-UP ACCORDING TO ZOOM IS BUGGY
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
}