243 lines
6.5 KiB
Java
243 lines
6.5 KiB
Java
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));
|
|
//
|
|
// }
|
|
|
|
GeoQuery select = toDataPointQuery(coordinate);
|
|
layerManagerBus.fireEvent(new QueryDataEvent(select, coordinate, null, true));
|
|
|
|
}
|
|
|
|
@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
|
|
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.MAP_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+")");
|
|
|
|
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(), null, false));
|
|
}
|
|
}
|
|
else if(zoomStart!=null && zoomEnd!=null) {
|
|
|
|
if(zoomEnd<QUERY_MIN_ZOOM_LEVEL) {
|
|
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);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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();
|
|
}
|
|
|
|
|
|
}
|