Added Layer Style and Show Legend facilities #11
|
@ -1,5 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -41,7 +43,9 @@
|
|||
|
||||
|
||||
<wb-module deploy-name="geoportal-data-viewer-app-3.1.0">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -83,7 +87,9 @@
|
|||
|
||||
|
||||
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -125,7 +131,9 @@
|
|||
|
||||
|
||||
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -167,7 +175,9 @@
|
|||
|
||||
|
||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/target/generated-sources/gwt"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -209,7 +219,9 @@
|
|||
|
||||
|
||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -251,7 +263,9 @@
|
|||
|
||||
|
||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -293,7 +307,9 @@
|
|||
|
||||
|
||||
<property name="java-output-path" value="/geoportal-data-viewer-app/target/geoportal-data-viewer-app-0.0.1-SNAPSHOT/WEB-INF/classes"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -335,7 +351,9 @@
|
|||
|
||||
|
||||
<property name="context-root" value="geoportal-data-viewer-app"/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -377,7 +395,9 @@
|
|||
|
||||
|
||||
</wb-module>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -15,12 +15,12 @@ import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerCon
|
|||
import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.events.ChangeMapLayerEvent;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.events.MapExtentToEvent;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.CloseCollectionEvent;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.OpenCollectionEvent;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerMap;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.resources.GNAIcons;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.resources.GNAImages;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.search.SearchFacilityUI;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.ui.layercollection.LayerCollectionPanel;
|
||||
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.shared.GCubeCollection;
|
||||
|
@ -521,44 +521,22 @@ public class GeonaDataViewMainPanel extends Composite {
|
|||
|
||||
for (GCubeCollection coll : collection) {
|
||||
GWT.log("Found available collection " + coll);
|
||||
String label = coll.getUcd().getName();
|
||||
final String collectionID = coll.getUcd().getId(); // collectionID == UCD_Id
|
||||
|
||||
CheckBox checkbox = new CheckBox(label);
|
||||
checkbox.setId("gcubeCollectionSelector_" + collectionID);
|
||||
LayerCollectionPanel lcp = new LayerCollectionPanel(coll, applicationBus);
|
||||
|
||||
checkbox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
|
||||
|
||||
@Override
|
||||
public void onValueChange(ValueChangeEvent<Boolean> event) {
|
||||
GWT.log("Collection selector flag changed to value : " + event.toDebugString());
|
||||
|
||||
// String collectionID = ((CheckBox) event.getSource()).getId().replace("gcubeCollectionSelector_",
|
||||
// "");
|
||||
|
||||
GWT.log("Collection ID is : " + collectionID + ", event value: " + event.getValue());
|
||||
if (event.getValue()) {
|
||||
// OPEN COLLECTION
|
||||
applicationBus.fireEvent(new OpenCollectionEvent(collectionID));
|
||||
} else {
|
||||
// CLOSE COLLECTION
|
||||
applicationBus.fireEvent(new CloseCollectionEvent(collectionID));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
openCollectionPanel.add(checkbox);
|
||||
openCollectionPanel.add(lcp);
|
||||
|
||||
List<CheckBox> listCollections = mapCollectionCheckBoxes.get(collectionID);
|
||||
if (listCollections == null)
|
||||
listCollections = new ArrayList<CheckBox>();
|
||||
|
||||
listCollections.add(checkbox);
|
||||
listCollections.add(lcp.getCheckbox());
|
||||
mapCollectionCheckBoxes.put(collectionID, listCollections);
|
||||
|
||||
// Opening All Collections if openCollectionID is null
|
||||
if (openCollectionID == null) {
|
||||
checkbox.setValue(true, true);
|
||||
lcp.getCheckbox().setValue(true, true);
|
||||
// String collectionID = checkbox.getId().replace("gcubeCollectionSelector_",
|
||||
// "");
|
||||
GWT.log("Opening the collection: " + collectionID);
|
||||
|
|
|
@ -0,0 +1,287 @@
|
|||
package org.gcube.portlets.user.geoportaldataviewer.client.ui.layercollection;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.IndexLayerDV;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewer;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerServiceAsync;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.CloseCollectionEvent;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.OpenCollectionEvent;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.client.util.URLUtil;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.shared.GCubeCollection;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.shared.ViewerConfiguration;
|
||||
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.GeoInformationForWMSRequest;
|
||||
|
||||
import com.github.gwtbootstrap.client.ui.Button;
|
||||
import com.github.gwtbootstrap.client.ui.CheckBox;
|
||||
import com.github.gwtbootstrap.client.ui.ListBox;
|
||||
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.Style.FontWeight;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.event.dom.client.ErrorEvent;
|
||||
import com.google.gwt.event.dom.client.ErrorHandler;
|
||||
import com.google.gwt.event.dom.client.LoadEvent;
|
||||
import com.google.gwt.event.dom.client.LoadHandler;
|
||||
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
||||
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
||||
import com.google.gwt.event.shared.HandlerManager;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.FlexTable;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.HTML;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Image;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.ScrollPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
/**
|
||||
* The Class LayerCollectionPanel.
|
||||
*
|
||||
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
|
||||
*
|
||||
* Jan 16, 2023
|
||||
*/
|
||||
public class LayerCollectionPanel extends Composite {
|
||||
|
||||
public static String COLORSCALERANGE = "COLORSCALERANGE";
|
||||
|
||||
@UiField
|
||||
HTMLPanel basePanel;
|
||||
|
||||
@UiField
|
||||
HTMLPanel stylePanel;
|
||||
|
||||
@UiField
|
||||
HTMLPanel styleListPanel;
|
||||
|
||||
@UiField
|
||||
Button buttonLegend;
|
||||
|
||||
@UiField
|
||||
ScrollPanel legendPanel;
|
||||
|
||||
private CheckBox checkbox;
|
||||
|
||||
private GeoInformationForWMSRequest geoInformation;
|
||||
|
||||
private static LayerCollectionPanelUiBinder uiBinder = GWT.create(LayerCollectionPanelUiBinder.class);
|
||||
|
||||
private ListBox listBoxStyles = new ListBox();
|
||||
|
||||
/**
|
||||
* The Interface LayerCollectionPanelUiBinder.
|
||||
*
|
||||
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
|
||||
*
|
||||
* Jan 16, 2023
|
||||
*/
|
||||
interface LayerCollectionPanelUiBinder extends UiBinder<Widget, LayerCollectionPanel> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new layer collection panel.
|
||||
*
|
||||
* @param coll the coll
|
||||
* @param applicationBus the application bus
|
||||
*/
|
||||
public LayerCollectionPanel(GCubeCollection coll, HandlerManager applicationBus) {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
buttonLegend.setType(ButtonType.LINK);
|
||||
legendPanel.setVisible(false);
|
||||
|
||||
GWT.log("Found available collection " + coll);
|
||||
String label = coll.getUcd().getName();
|
||||
final String collectionID = coll.getUcd().getId(); // collectionID == UCD_Id
|
||||
|
||||
checkbox = new CheckBox(label);
|
||||
checkbox.setId("gcubeCollectionSelector_" + collectionID);
|
||||
checkbox.getElement().getStyle().setFontWeight(FontWeight.BOLD);
|
||||
|
||||
checkbox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
|
||||
|
||||
@Override
|
||||
public void onValueChange(ValueChangeEvent<Boolean> event) {
|
||||
GWT.log("Collection selector flag changed to value : " + event.toDebugString());
|
||||
|
||||
// String collectionID = ((CheckBox) event.getSource()).getId().replace("gcubeCollectionSelector_",
|
||||
// "");
|
||||
|
||||
GWT.log("Collection ID is : " + collectionID + ", event value: " + event.getValue());
|
||||
if (event.getValue()) {
|
||||
// OPEN COLLECTION
|
||||
applicationBus.fireEvent(new OpenCollectionEvent(collectionID));
|
||||
} else {
|
||||
// CLOSE COLLECTION
|
||||
legendPanel.clear();
|
||||
legendPanel.setVisible(false);
|
||||
applicationBus.fireEvent(new CloseCollectionEvent(collectionID));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
basePanel.add(checkbox);
|
||||
|
||||
ViewerConfiguration theConfig = GeoportalDataViewer.getStatus().getViewerConfig();
|
||||
GCubeCollection toOpen = theConfig.getAvailableCollections().get(collectionID);
|
||||
|
||||
// Check if indexes is empty
|
||||
if (toOpen.getIndexes() == null || toOpen.getIndexes().isEmpty()) {
|
||||
GWT.log("Unexpected empty indexes in collection " + toOpen);
|
||||
Window.alert("Cannot open collection index layer for " + toOpen.getUcd().getName() + ".");
|
||||
return;
|
||||
}
|
||||
// TODO Get Default Index Layer
|
||||
// For now we just take the first - only 1 is expected
|
||||
IndexLayerDV layer = toOpen.getIndexes().get(0);
|
||||
// Open Index Layer
|
||||
|
||||
HashMap<String, String> ogcLinks = layer.getLayer().getOgcLinks();
|
||||
final String wmsLink = ogcLinks.get("wms");
|
||||
final String layerName = URLUtil.getValueOfParameter("layers", wmsLink);
|
||||
|
||||
GeoportalDataViewerServiceAsync.Util.getInstance().parseWmsRequest(wmsLink, layerName,
|
||||
new AsyncCallback<GeoInformationForWMSRequest>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
|
||||
Window.alert(caught.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(GeoInformationForWMSRequest geoInfoWMS) {
|
||||
geoInformation = geoInfoWMS;
|
||||
GWT.log("Parsed WMS Request returned: " + geoInfoWMS);
|
||||
|
||||
if (geoInfoWMS.getStyles() != null && geoInfoWMS.getStyles().getGeoStyles() != null) {
|
||||
if (geoInfoWMS.getStyles().getGeoStyles().size() > 0) {
|
||||
stylePanel.setVisible(true);
|
||||
listBoxStyles.clear();
|
||||
for (String styleName : geoInfoWMS.getStyles().getGeoStyles()) {
|
||||
listBoxStyles.addItem(styleName, styleName);
|
||||
}
|
||||
|
||||
styleListPanel.add(listBoxStyles);
|
||||
}
|
||||
}
|
||||
|
||||
buttonLegend.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
GWT.log("is isToggle: " + buttonLegend.isToggle());
|
||||
GWT.log("is isToggled: " + buttonLegend.isToggled());
|
||||
if (legendPanel.isVisible()) {
|
||||
legendPanel.clear();
|
||||
legendPanel.setVisible(false);
|
||||
|
||||
} else {
|
||||
legendPanel.setVisible(true);
|
||||
loadLegend(wmsLink);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the checkbox.
|
||||
*
|
||||
* @return the checkbox
|
||||
*/
|
||||
public CheckBox getCheckbox() {
|
||||
return checkbox;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load legend.
|
||||
*
|
||||
* @param wmsLink the wms link
|
||||
*/
|
||||
private void loadLegend(String wmsLink) {
|
||||
|
||||
legendPanel.clear();
|
||||
String theLayerName = geoInformation.getLayerName();
|
||||
final FlexTable flexTable = new FlexTable();
|
||||
legendPanel.add(flexTable);
|
||||
|
||||
// Case no style found
|
||||
if (listBoxStyles.getSelectedValue() == null) {
|
||||
flexTable.setWidget(0, 0, new HTML("No style found"));
|
||||
return;
|
||||
}
|
||||
|
||||
FlowPanel flow = new FlowPanel();
|
||||
flow.add(new HTMLPanel("Legend for: " + theLayerName));
|
||||
final HorizontalPanel hpLegend = new HorizontalPanel();
|
||||
|
||||
String url = geoInformation.getBaseWmsServiceHost() + "?service=WMS&" + "version="
|
||||
+ URLUtil.getValueOfParameter("version", wmsLink) + "&" + "request=GetLegendGraphic&" + "layer="
|
||||
+ theLayerName;
|
||||
|
||||
String styleName = null;
|
||||
try {
|
||||
styleName = listBoxStyles.getSelectedValue();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
styleName = styleName != null && !styleName.isEmpty() ? styleName : "";
|
||||
|
||||
if (!geoInformation.isNcWMS()) {
|
||||
|
||||
url += "&format=image/png" + "&STYLE=" + styleName
|
||||
+ "&LEGEND_OPTIONS=forceRule:True;dx:0.2;dy:0.2;mx:0.2;my:0.2;fontStyle:bold;"
|
||||
+ "borderColor:000000;border:true;fontColor:000000;fontSize:14";
|
||||
} else {
|
||||
|
||||
int isNcWmsStyle = styleName.indexOf("/");
|
||||
if (isNcWmsStyle != -1) {
|
||||
styleName = styleName.substring(isNcWmsStyle + 1, styleName.length());
|
||||
}
|
||||
url += "&palette=" + styleName;
|
||||
if (geoInformation.getMapWMSNoStandard() != null) {
|
||||
for (String key : geoInformation.getMapWMSNoStandard().keySet()) { // ADDING COLORSCALERANGE?
|
||||
if (key.compareToIgnoreCase(COLORSCALERANGE) == 0) {
|
||||
url += "&" + key + "=" + geoInformation.getMapWMSNoStandard().get(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GWT.log(url);
|
||||
flexTable.setStyleName("layer-style-panel-table-legend");
|
||||
flexTable.setWidget(0, 0, new Label("Legend"));
|
||||
final Image legendImage = new Image(url);
|
||||
legendImage.addLoadHandler(new LoadHandler() {
|
||||
@Override
|
||||
public void onLoad(LoadEvent event) {
|
||||
}
|
||||
});
|
||||
|
||||
legendImage.addErrorHandler(new ErrorHandler() {
|
||||
@Override
|
||||
public void onError(ErrorEvent event) {
|
||||
GWT.log("ErrorEvent ");
|
||||
flexTable.setWidget(0, 1, new HTML("Error on loading the style"));
|
||||
}
|
||||
});
|
||||
|
||||
hpLegend.add(legendImage);
|
||||
flexTable.setWidget(0, 1, hpLegend);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
|
||||
<ui:style>
|
||||
.important {
|
||||
font-weight: bold;
|
||||
}
|
||||
</ui:style>
|
||||
<g:HTMLPanel>
|
||||
<g:HTMLPanel ui:field="basePanel">
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel ui:field="stylePanel" visible="false" addStyleNames="layer-style-panel">
|
||||
Layer Style
|
||||
<g:HorizontalPanel>
|
||||
<g:HTMLPanel ui:field="styleListPanel"></g:HTMLPanel>
|
||||
<b:Button icon="BAR_CHART" ui:field="buttonLegend" title="Show the Legend"></b:Button>
|
||||
</g:HorizontalPanel>
|
||||
|
||||
<g:ScrollPanel ui:field="legendPanel"></g:ScrollPanel>
|
||||
</g:HTMLPanel>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
|
@ -554,10 +554,10 @@ public class Geoportal_JSON_Mapper {
|
|||
}
|
||||
|
||||
//Setting only if one element exists
|
||||
if(filesetImages.getListPayload().size()>0) {
|
||||
if(filesetImages.getListPayload()!=null && filesetImages.getListPayload().size()>0) {
|
||||
listImages.add(filesetImages);
|
||||
}
|
||||
if(filesetFiles.getListPayload().size()>0) {
|
||||
if(filesetFiles.getListPayload()!=null && filesetFiles.getListPayload().size()>0) {
|
||||
listFiles.add(filesetFiles);
|
||||
}
|
||||
|
||||
|
|
|
@ -769,3 +769,14 @@ RESPONSIVE
|
|||
width: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
/* OPEN COLLECTION UI */
|
||||
.layer-style-panel {
|
||||
margin-left: 25px;
|
||||
font-size: 13px;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.layer-style-panel-table-legend table td {
|
||||
padding-left: 5px;
|
||||
}
|
Loading…
Reference in New Issue