package org.gcube.portlets.user.geoportaldataviewer.client; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.LayerType; import org.gcube.portlets.user.geoportaldataviewer.client.events.QueryDataEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.QueryDataEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowDetailsEvent; import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerOSM; import org.gcube.portlets.user.geoportaldataviewer.client.util.URLUtil; import org.gcube.portlets.user.geoportaldataviewer.shared.GeoNaDataObject; import org.gcube.portlets.user.geoportaldataviewer.shared.ProductType; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BoundsMap; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.GeoQuery; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wfs.FeatureRow; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.GeoInformationForWMSRequest; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.ZAxis; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.VerticalPanel; import ol.Coordinate; /** * The Class LayerManager. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * * Oct 27, 2020 */ public class LayerManager { /** The ol map. */ private OpenLayerOSM olMap; /** The layer items. */ private List layerItems = new ArrayList(); private HandlerManager eventBus = new HandlerManager(""); private HandlerManager applicationBus; /** * Instantiates a new layer manager. * @param applicationBus */ public LayerManager(HandlerManager applicationBus) { this.applicationBus = applicationBus; bindEvents(); } private void bindEvents() { eventBus.addHandler(QueryDataEvent.TYPE, new QueryDataEventHandler() { @Override public void onQueryInteraction(final QueryDataEvent queryEvent) { if(queryEvent.getGeoQuery()!=null) { GeoQuery selectDataInfo = queryEvent.getGeoQuery(); GWT.log("("+selectDataInfo.getX1()+","+selectDataInfo.getY1()+")("+selectDataInfo.getX2()+","+selectDataInfo.getY2()+")"); for (LayerItem layerItem : layerItems){ //TODO isLayerVisible(layerItem); } BoundsMap mapBBOX = new BoundsMap(); //THIS IS SHOULD BE CORRET, THE BOUND AND CRS ARE READ FROM MAP /*mapBBOX.setCrs(olMap.getProjectionCode()); mapBBOX.setLowerLeftX(olMap.getExtent().getLowerLeftX()); mapBBOX.setLowerLeftY(olMap.getExtent().getLowerLeftY()); mapBBOX.setUpperRightX(olMap.getExtent().getUpperRightX()); mapBBOX.setUpperRightY(olMap.getExtent().getUpperRightY()); */ //THE FOLLOWING SHOULD BE NOT NEEDED BUT THE GETFEATURE WITH EPSG_3857 SEEMS NOT WORK IN OUR GEOSERVER // double minX = olMap.getExtent().getLowerLeftX(); // double minY = olMap.getExtent().getLowerLeftY(); double minX = queryEvent.getGeoQuery().getX1(); double minY = queryEvent.getGeoQuery().getY1(); Coordinate centerCoordinate = new Coordinate(minX, minY); centerCoordinate = olMap.transform(centerCoordinate, GeoportalDataViewerConstants.EPSG_3857, GeoportalDataViewerConstants.EPSG_4326); mapBBOX.setLowerLeftX(centerCoordinate.getX()); mapBBOX.setLowerLeftY(centerCoordinate.getY()); // double maxX = olMap.getExtent().getUpperRightX(); // double maxY = olMap.getExtent().getUpperRightY(); double maxX = queryEvent.getGeoQuery().getX2(); double maxY = queryEvent.getGeoQuery().getY2(); centerCoordinate = new Coordinate(maxX,maxY); centerCoordinate = olMap.transform(centerCoordinate, GeoportalDataViewerConstants.EPSG_3857, GeoportalDataViewerConstants.EPSG_4326); mapBBOX.setUpperRightX(centerCoordinate.getX()); mapBBOX.setUpperRightY(centerCoordinate.getY()); mapBBOX.setCrs(GeoportalDataViewerConstants.EPSG_4326); GWT.log("Bounds is: "+mapBBOX); GeoportalDataViewerServiceAsync.Util.getInstance().getDataResult(layerItems, olMap.getProjectionCode(), mapBBOX, GeoportalDataViewerConstants.MAX_WFS_FEATURES, olMap.getCurrentZoomLevel(), new AsyncCallback>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(List result) { if(result==null || result.isEmpty()) return; GWT.log("Data result: "+result); FlexTable flex = new FlexTable(); flex.setCellPadding(1); flex.setCellSpacing(1); flex.getElement().addClassName("popup-table"); boolean featureFound = false; FeatureRow feature = null; for (GeoNaDataObject geoNaDataObject : result) { List features = geoNaDataObject.getFeatures(); if(features!=null && features.size()>0) { feature = features.get(0); Map> entries = features.get(0).getMapProperties(); for (String key : entries.keySet()) { if(key.equalsIgnoreCase("nome")) { flex.setHTML(0, 0, new HTML(entries.get(key).get(0)).toString()); } else if(key.equalsIgnoreCase("descrizione")) { flex.setText(1, 0, entries.get(key).get(0)); }else if(key.equalsIgnoreCase("date_scavo")) { flex.setHTML(2, 0, new HTML(""+entries.get(key).get(0)).toString()+""); } } featureFound = true; break; //Only the first one } } FeatureRow theFeature = feature; Button button = null; if(!featureFound) { flex.setHTML(0, 0, new HTML("No data available").toString()); }else { button = new Button("Open Details"); button.getElement().setId("open-details"); button.setType(ButtonType.LINK); } VerticalPanel vpPanel = new VerticalPanel(); vpPanel.add(flex); if(button!=null) vpPanel.add(button); olMap.showPopup(vpPanel.toString(), queryEvent.getoLCoordinate()); Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { Element buttonElement = DOM.getElementById("open-details"); Event.sinkEvents(buttonElement, Event.ONCLICK); Event.setEventListener(buttonElement, new EventListener() { @Override public void onBrowserEvent(Event event) { if(Event.ONCLICK == event.getTypeInt()) { applicationBus.fireEvent(new ShowDetailsEvent(ProductType.CONCESSIONE, theFeature)); } } }); } }); button.setType(ButtonType.LINK); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { GWT.log("qui"); applicationBus.fireEvent(new ShowDetailsEvent(ProductType.CONCESSIONE, theFeature)); } }); } }); } } }); } /** * Adds the layer by wms. * * @param layerTitle the layer title * @param layerName the layer name * @param wmsRequest the wms request * @param isBase the is base * @param UUID the uuid */ public void addLayerByWms(String layerTitle, String layerName, String wmsRequest, boolean isBase, String UUID) { boolean displayInLayerSwitcher = false; if(isBase) displayInLayerSwitcher = true; addLayerByWmsRequest(layerTitle, layerName, wmsRequest, isBase, displayInLayerSwitcher, UUID, true); } /** * Adds the layer by wms request. * * @param layerTitle the layer title * @param layerName the layer name * @param wmsRequest the wms request * @param isBase the is base * @param displayInLayerSwitcher the display in layer switcher * @param UUID the uuid * @param onTop the on top */ public void addLayerByWmsRequest(final String layerTitle, final String layerName, final String wmsRequest, final boolean isBase,final boolean displayInLayerSwitcher, final String UUID, final boolean onTop) { // final LayoutContainer westPanel = (LayoutContainer) layersPanel.getParent(); // // if(layersPanel.getLayerItems().size()==0) // westPanel.mask("Adding..."+layerName, "x-mask-loading"); // else // layersPanel.mask("Adding..."+layerName, "x-mask-loading"); final LayerType featureType = isBase?LayerType.RASTER_BASELAYER:LayerType.FEATURE_TYPE; // Info.display("Adding Layer", layerName); GeoportalDataViewerServiceAsync.Util.getInstance().parseWmsRequest(wmsRequest, layerName, new AsyncCallback() { @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); } @Override public void onSuccess(GeoInformationForWMSRequest result) { GWT.log("Add Layer By WMS: "+result.getMapWMSNoStandard() + ", and isNCWMS? "+result.isNcWMS()); addLayerByWms(featureType, layerTitle, layerName, result.getWmsRequest(), result.getBaseWmsServiceHost(), true, isBase, displayInLayerSwitcher, (ArrayList) result.getStyles().getGeoStyles(), result.getWmsRequest(), false, result.getMapWMSNoStandard(), result.isNcWMS(), UUID, result.getZAxis()); } }); } /** * Adds the layer by wms. * * @param layerType the layer type * @param layerTitle the layer title * @param layerName the layer name * @param layerURL the layer URL * @param mapServerHost the map server host * @param isExternal the is external * @param isBase the is base * @param displayInLayerSwitcher the display in layer switcher * @param styles the styles * @param serverWmsRequest the server wms request * @param onTop the on top * @param wmsNotStandardParams the wms not standard params * @param isNcWms the is nc wms * @param UUID the uuid * @param zAxis the z axis */ private void addLayerByWms(LayerType layerType, String layerTitle, String layerName, String layerURL, String mapServerHost, boolean isExternal, boolean isBase, boolean displayInLayerSwitcher, ArrayList styles, String serverWmsRequest, boolean onTop, HashMap wmsNotStandardParams, boolean isNcWms, String UUID, ZAxis zAxis) { // GWT.log("Add addLayerByWms 1"); LayerItem layerItem = new LayerItem(); layerItem.setBaseLayer(isBase); layerItem.setTitle(layerTitle); layerItem.setName(layerName); layerItem.setUrl(layerURL); layerItem.setMapServerHost(mapServerHost); //l.setExternal(isExternal); layerItem.setOpacity(1d); layerItem.setBuffer(2); layerItem.setServerWmsRequest(serverWmsRequest); layerItem.setWmsNotStandardParams(wmsNotStandardParams); layerItem.setNcWms(isNcWms); layerItem.setUUID(UUID); layerItem.setZAxis(zAxis); switch (layerType) { //TODO IMPLEMENT THIS CASE case RASTER_BASELAYER: // l.setHasLegend(false); layerItem.setBaseLayer(true); layerItem.setTrasparent(false); layerItem.setClickData(false); break; case FEATURE_TYPE: //CASE FEATURE TYPE layerItem.setBaseLayer(false); layerItem.setClickData(true); layerItem.setTrasparent(true); break; } GWT.log("styles "+styles); if(styles!=null && styles.size()>0){ layerItem.setHasLegend(true); layerItem.setDefaultStyle(styles.get(0)); layerItem.setStyle(styles.get(0)); layerItem.setStyles(styles); }else{ String style = URLUtil.getValueOfParameter("styles", serverWmsRequest); if(style!=null){ //CASE OF STYLE =""; //TENTATIVE TO GET LEGEND layerItem.setHasLegend(true); } } GWT.log("Built layer: "+layerItem); layerItems.add(layerItem); olMap.addWMSLayer(layerItem.getMapServerHost(), layerName); // openLayersMap.addLayerItemByWms(l, displayInLayerSwitcher); // layersPanel.addLayerItems(layerItems, onTop); // layersPanel.updateLayersOrder(); } /** * Checks if is layer visible. * * @param layerItem the layer item * @return true, if is layer visible */ public boolean isLayerVisible(LayerItem layerItem){ return olMap.isLayerVisible(layerItem.getName()); } /** * Sets the ol map. * * @param olMap the new ol map */ public void setOlMap(OpenLayerOSM olMap) { this.olMap = olMap; } public HandlerManager getEventBus() { return eventBus; } }