diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 23f6300..3ce35fa 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -275,9 +275,6 @@ - - uses - diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java index c142d36..9ba0ced 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java @@ -11,6 +11,7 @@ import org.gcube.application.geoportalcommon.shared.GeoportalItemReferences; import org.gcube.application.geoportalcommon.shared.geoportal.materialization.IndexLayerDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.RelationshipDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView; +import org.gcube.application.geoportalcommon.shared.gis.BoundsMap; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MapEventType; import org.gcube.portlets.user.geoportaldataviewer.client.events.AddLayerToMapEvent; @@ -59,6 +60,7 @@ import org.gcube.portlets.user.geoportaldataviewer.shared.ItemFieldsResponse; import org.gcube.portlets.user.geoportaldataviewer.shared.ViewerConfiguration; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.GeoQuery; +import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem; import com.github.gwtbootstrap.client.ui.Popover; import com.github.gwtbootstrap.client.ui.constants.Placement; @@ -70,6 +72,13 @@ import com.google.gwt.core.client.ScriptInjector; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.http.client.Request; +import com.google.gwt.http.client.RequestBuilder; +import com.google.gwt.http.client.RequestCallback; +import com.google.gwt.http.client.RequestException; +import com.google.gwt.http.client.Response; +import com.google.gwt.json.client.JSONParser; +import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -80,6 +89,18 @@ import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import ol.Coordinate; +import ol.OLFactory; +import ol.Options; +import ol.format.GeoJson; +import ol.format.GeoJsonFeatureOptions; +import ol.format.GeoJsonOptions; +import ol.geom.Geometry; +import ol.layer.LayerOptions; +import ol.proj.Projection; +import ol.proj.ProjectionOptions; +import ol.source.Vector; +import ol.Feature; +import ol.FeatureOptions; /** * Entry point classes define onModuleLoad(). @@ -569,6 +590,100 @@ public class GeoportalDataViewer implements EntryPoint { doLayerActionEvent.getVisibility()); break; + case LOCATE_LAYER: + + LayerItem layerItem = doLayerActionEvent.getLayerItem(); + + ol.layer.Image layer = olMap.getWmsDetailsLayerMap().get(layerItem.getName()); + + + + ExtentWrapped sourceExt = olMap.getSourceExtentForLayer(layerItem.getName()); + + GWT.log("extent: "+sourceExt); + +// BoundsMap theBBOX = new BoundsMap(layer.getExtent().getLowerLeftX(), layer.getExtent().getLowerLeftY(), layer.getExtent().getUpperRightX(), layer.getExtent().getUpperRightY(), +// null); + +// Coordinate lower = OLFactory.createCoordinate(olMap.getBBOX().getLowerLeftX(), olMap.getBBOX().getLowerLeftY()); +// Coordinate lowerCoord = MapUtils.transformCoordiante(lower, MAP_PROJECTION.EPSG_4326.getName(), +// MAP_PROJECTION.EPSG_3857.getName()); +// +// Coordinate upper = OLFactory.createCoordinate(olMap.getBBOX().getUpperRightX(), olMap.getBBOX().getUpperRightY()); +// Coordinate upperCoord = MapUtils.transformCoordiante(upper, MAP_PROJECTION.EPSG_4326.getName(), +// MAP_PROJECTION.EPSG_3857.getName()); + + + BoundsMap theBBOX = new BoundsMap(sourceExt.getLowerLeftX(), sourceExt.getLowerLeftY(), sourceExt.getUpperRightX(), sourceExt.getUpperRightY(), null); + GWT.log("theBBOX: "+theBBOX); +// if (bbox != null) { + +// Coordinate lower = OLFactory.createCoordinate(olMap.getBBOX().getLowerLeftX(), olMap.getBBOX().getLowerLeftY()); +// Coordinate lowerCoord = MapUtils.transformCoordiante(lower, MAP_PROJECTION.EPSG_4326.getName(), +// MAP_PROJECTION.EPSG_3857.getName()); +// +// Coordinate upper = OLFactory.createCoordinate(olMap.getBBOX().getUpperRightX(), olMap.getBBOX().getUpperRightY()); +// Coordinate upperCoord = MapUtils.transformCoordiante(upper, MAP_PROJECTION.EPSG_4326.getName(), +// MAP_PROJECTION.EPSG_3857.getName()); +// +// ew = new ExtentWrapped(lowerCoord.getX(), lowerCoord.getY(), upperCoord.getX(), upperCoord.getY()); + +// } + + + GeoportalDataViewerServiceAsync.Util.getInstance().getWFSRequest(layerItem, + olMap.getProjectionCode(), null, 0, "json", + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + // TODO Auto-generated method stub + + } + + @Override + public void onSuccess(String wmsRequestURL) { + GWT.log("wmsRequestURL: "+wmsRequestURL); + + RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, wmsRequestURL); + + try { + Request response = builder.sendRequest(null, new RequestCallback() { + public void onError(Request request, Throwable exception) { + // Code omitted for clarity + } + + public void onResponseReceived(Request request, Response response) { + GWT.log("GeoJSON: "+response.getText()); + + GeoJsonFeatureOptions fo = new GeoJsonFeatureOptions(); + ProjectionOptions projectionOptions = new ProjectionOptions(); + projectionOptions.setCode(MAP_PROJECTION.EPSG_3857.getName()); + Projection fp = new Projection(projectionOptions); + fo.setFeatureProjection(fp); + fo.setDataProjection(fp); + GeoJsonOptions geoJsonOpt = new GeoJsonOptions(); + geoJsonOpt.setDefaultDataProjection(fp); + geoJsonOpt.setFeatureProjection(fp); + GeoJson geoJson = OLFactory.createGeoJSON(geoJsonOpt); + + Feature[] features = geoJson.readFeatures(response.getText()); + GWT.log("features: "+features); + //Feature[] features = new GeoJson().readFeatures(jsonObject, projectionOptions); + olMap.addFeaturesAsHighlight(features); + } + }); + + } catch (RequestException e) { + // Code omitted for clarity + } + + //olMap.locateLayer(doLayerActionEvent.getLayerItem()); + + } + }); + + break; default: break; @@ -576,7 +691,7 @@ public class GeoportalDataViewer implements EntryPoint { } }); - + applicationBus.addHandler(ChangeMapLayerEvent.TYPE, new ChangeMapLayerEventHandler() { @Override @@ -686,6 +801,17 @@ public class GeoportalDataViewer implements EntryPoint { } + + /** + * Sets the. + * + * @param json the json + */ + public static native Object toJSON(String json) /*-{ + var jsonObj = JSON.parse(json); + //console.log("jsonObj: "+jsonObj); + return jsonObj; + }-*/; // /** // * Handler popu closer. // * diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java index 7741424..89b4ac6 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java @@ -87,7 +87,7 @@ public class GeoportalDataViewerConstants { * @param msg the msg */ public static native void printJs(String msg)/*-{ - console.log("js console: " + msg); + //console.log("js console: " + msg); }-*/; /** @@ -96,7 +96,7 @@ public class GeoportalDataViewerConstants { * @param msg the msg */ public static native void printJsObj(Object object)/*-{ - console.log("js obj: " + JSON.stringify(object, null, 4)); + //console.log("js obj: " + JSON.stringify(object, null, 4)); }-*/; /** diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java index a07e40f..05c25cf 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java @@ -15,6 +15,7 @@ import org.gcube.portlets.user.geoportaldataviewer.shared.ItemFieldsResponse; import org.gcube.portlets.user.geoportaldataviewer.shared.ResultSetPaginatedDataIDs; import org.gcube.portlets.user.geoportaldataviewer.shared.ViewerConfiguration; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; +import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerObject; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.GeoInformationForWMSRequest; @@ -179,4 +180,17 @@ public interface GeoportalDataViewerService extends RemoteService { */ GeoJSON getSpatialReference(String profileID, String projectID); + /** + * Gets the WFS request. + * + * @param layerItem the layer item + * @param mapSrsName the map srs name + * @param mapBBOX the map BBOX + * @param maxFeatures the max features. If 0 means all feature + * @param outputFormat the output format + * @return the WFS request + */ + String getWFSRequest(LayerItem layerItem, String mapSrsName, BoundsMap mapBBOX, int maxFeatures, + String outputFormat); + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java index fac0a4d..4ceb4c4 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java @@ -15,6 +15,7 @@ import org.gcube.portlets.user.geoportaldataviewer.shared.ItemFieldsResponse; import org.gcube.portlets.user.geoportaldataviewer.shared.ResultSetPaginatedDataIDs; import org.gcube.portlets.user.geoportaldataviewer.shared.ViewerConfiguration; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; +import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerObject; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.GeoInformationForWMSRequest; @@ -75,4 +76,7 @@ public interface GeoportalDataViewerServiceAsync { void getSpatialReference(String profileID, String projectID, AsyncCallback callback); + void getWFSRequest(LayerItem layerItem, String mapSrsName, BoundsMap mapBBOX, int maxFeatures, String outputFormat, + AsyncCallback callback); + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java index 6259a65..e397efb 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java @@ -22,7 +22,7 @@ public class DoActionOnDetailLayersEvent extends GwtEvent entry = entrySetsIt.next(); - documentAsMap.put(entry.getKey(), entry.getValue()!=null?entry.getValue().toString():null); + documentAsMap.put(entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : null); i++; } @@ -1539,4 +1542,30 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme return null; } + + /** + * Gets the WFS request. + * + * @param layerItem the layer item + * @param mapSrsName the map srs name + * @param mapBBOX the map BBOX + * @param maxFeatures the max features. If 0 means all feature + * @param outputFormat the output format + * @return the WFS request + */ + @Override + public String getWFSRequest(LayerItem layerItem, String mapSrsName, BoundsMap mapBBOX, int maxFeatures, + String outputFormat) { + LOG.info("getWFSRequest called"); + + if (LOG.isDebugEnabled()) { + LOG.debug("getWFSRequest parameters layerItem name: " + layerItem.getName(), + ", mapSrsName: " + mapSrsName + ", mapBBOX: " + mapBBOX + ", maxFeatures: " + maxFeatures + + ", outputFormat: " + outputFormat); + } + String url = GisMakers.buildWFSFeatureQuery(layerItem, mapSrsName, mapBBOX, maxFeatures, outputFormat); + LOG.info("returning WFSRequest: "+url); + return url; + } + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/gis/GisMakers.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/gis/GisMakers.java index 5018ea2..a4121c3 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/gis/GisMakers.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/gis/GisMakers.java @@ -7,18 +7,17 @@ import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - /** * The Class URLMakers. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * - * Oct 29, 2020 + * Oct 29, 2020 */ public class GisMakers { public static final String CQL_FILTER_PARAMETER = "CQL_FILTER"; - + public static final String GEOM_NAME_BOUNDED = "geom"; // MAP SERVER PIVOT @@ -30,53 +29,56 @@ public class GisMakers { public static final String CSV = "csv"; public static final String JSON = "json"; - + private static String[][] a = { { "\\?", "%3F" }, { "&", "%26" }, }; - + private static final Logger LOG = LoggerFactory.getLogger(GisMakers.class); - + /** * The Enum COORDINATE_FORMAT. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * - * Oct 29, 2020 + * Oct 29, 2020 */ public static enum COORDINATE_FORMAT { XY, YX }; - /** * Builds the WFS feature query. * - * @param layerItem the layer item - * @param mapSrsName the map srs name - * @param mapBBOX the map BBOX - * @param maxFeatures the max features + * @param layerItem the layer item + * @param mapSrsName the map srs name + * @param mapBBOX the map BBOX + * @param maxFeatures the max features * @param outputFormat the output format * @return the string */ - public static String buildWFSFeatureQuery(LayerItem layerItem, String mapSrsName, BoundsMap mapBBOX, int maxFeatures, String outputFormat) { + public static String buildWFSFeatureQuery(LayerItem layerItem, String mapSrsName, BoundsMap mapBBOX, + int maxFeatures, String outputFormat) { String link = layerItem.getMapServerHost(); LOG.debug("Map server host URL: " + link); LOG.debug("CQL filter is: " + layerItem.getCqlFilter()); LOG.debug("MAX FEATURES: " + maxFeatures); + LOG.debug("BBOX: " + mapBBOX); + LOG.debug("Output Format: " + outputFormat); String outputformat = null; - String boundingBox = ""; + String boundingBox = null; // CASE MAP SERVER SERVERTYPE mapserverType = MapServerRecognize.recongnize(layerItem); LOG.debug("Recongnized SERVERTYPE: " + mapserverType); - if (mapserverType != null) { if (mapserverType.equals(SERVERTYPE.MAPSERVER)) { LOG.debug("wms url contains wxs is a map server? no appending /wfs "); outputformat = MapServerRecognize.outputFormatRecognize(SERVERTYPE.MAPSERVER, outputFormat); - boundingBox = BBOX_FORMAT(COORDINATE_FORMAT.YX, ",",mapBBOX.getLowerLeftX(),mapBBOX.getLowerLeftY(),mapBBOX.getUpperRightX(),mapBBOX.getUpperRightY()); // USE AXIS XY + if (mapBBOX != null) + boundingBox = BBOX_FORMAT(COORDINATE_FORMAT.YX, ",", mapBBOX.getLowerLeftX(), + mapBBOX.getLowerLeftY(), mapBBOX.getUpperRightX(), mapBBOX.getUpperRightY()); // USE AXIS XY // DEBUG LOG.debug("SERVERTYPE.MAPSERVER outputformat: " + outputformat); LOG.debug("SERVERTYPE.MAPSERVER srsName: " + mapSrsName); @@ -85,8 +87,10 @@ public class GisMakers { LOG.debug("is geoserver appending suffix /wfs if is not present"); link += link.endsWith("wfs") ? "" : "/wfs"; outputformat = MapServerRecognize.outputFormatRecognize(SERVERTYPE.GEOSEVER, outputFormat); - mapSrsName = "urn:x-ogc:def:crs:"+mapSrsName; - boundingBox = BBOX_FORMAT(COORDINATE_FORMAT.YX, ",",mapBBOX.getLowerLeftX(),mapBBOX.getLowerLeftY(),mapBBOX.getUpperRightX(),mapBBOX.getUpperRightY()); // USE AXIS XY + mapSrsName = "urn:x-ogc:def:crs:" + mapSrsName; + if (mapBBOX != null) + boundingBox = BBOX_FORMAT(COORDINATE_FORMAT.YX, ",", mapBBOX.getLowerLeftX(), + mapBBOX.getLowerLeftY(), mapBBOX.getUpperRightX(), mapBBOX.getUpperRightY()); // USE AXIS XY // DEBUG LOG.debug("SERVERTYPE.GEOSEVER outputformat: " + outputformat); LOG.debug("SERVERTYPE.GEOSEVER srsName: " + mapSrsName); @@ -98,23 +102,31 @@ public class GisMakers { // + (outputformat == null ? "" : "&OUTPUTFORMAT=" + outputformat); // - link += "?"+ - URLParserUtil.addParameterToQueryString(WFSGetFeature.SERVICE.getParameter(), WFSGetFeature.SERVICE.getValue(), false, true)+ - URLParserUtil.addParameterToQueryString(WFSGetFeature.VERSION.getParameter(), WFSGetFeature.VERSION.getValue(), false, true)+ - URLParserUtil.addParameterToQueryString(WFSGetFeature.REQUEST.getParameter(), WFSGetFeature.REQUEST.getValue(), false, true)+ - URLParserUtil.addParameterToQueryString(WFSGetFeature.SRSNAME.getParameter(), mapSrsName, false, true)+ - URLParserUtil.addParameterToQueryString(WFSGetFeature.TYPENAME.getParameter(), layerItem.getName(), false, true)+ - (maxFeatures == 0 ? "" : URLParserUtil.addParameterToQueryString(WFSGetFeature.MAXFEATURES.getParameter(), maxFeatures+"", false, true))+ - (outputformat == null ? "" : URLParserUtil.addParameterToQueryString(WFSGetFeature.OUTPUTFORMAT.getParameter(), outputformat, false, false)); - - + link += "?" + + URLParserUtil.addParameterToQueryString(WFSGetFeature.SERVICE.getParameter(), + WFSGetFeature.SERVICE.getValue(), false, true) + + URLParserUtil.addParameterToQueryString(WFSGetFeature.VERSION.getParameter(), + WFSGetFeature.VERSION.getValue(), false, true) + + URLParserUtil.addParameterToQueryString(WFSGetFeature.REQUEST.getParameter(), + WFSGetFeature.REQUEST.getValue(), false, true) + + URLParserUtil.addParameterToQueryString(WFSGetFeature.SRSNAME.getParameter(), mapSrsName, false, true) + + URLParserUtil.addParameterToQueryString(WFSGetFeature.TYPENAME.getParameter(), layerItem.getName(), + false, true) + + (maxFeatures == 0 ? "" + : URLParserUtil.addParameterToQueryString(WFSGetFeature.MAXFEATURES.getParameter(), + maxFeatures + "", false, true)) + + (outputformat == null ? "" + : URLParserUtil.addParameterToQueryString(WFSGetFeature.OUTPUTFORMAT.getParameter(), + outputformat, false, false)); + if (layerItem.getCqlFilter() != null && !layerItem.getCqlFilter().isEmpty()) { - if (layerItem.getCqlFilter().contains("BBOX("+GEOM_NAME_BOUNDED+"")) { + if (layerItem.getCqlFilter().contains("BBOX(" + GEOM_NAME_BOUNDED + "")) { // THE BBOX IS ALREADY USED INTO CQL FILTERING, SO USING IT DIRECTLY link += "&" + CQL_FILTER_PARAMETER + "=" + layerItem.getCqlFilter(); } else { // I NEED TO ENCODE THE BBOX INTO CQL FILTERING, - String cqlFilterValue = "BBOX("+GEOM_NAME_BOUNDED+"," + boundingBox + ")" + " AND " + layerItem.getCqlFilter(); + String cqlFilterValue = "BBOX(" + GEOM_NAME_BOUNDED + "," + boundingBox + ")" + " AND " + + layerItem.getCqlFilter(); link += "&" + CQL_FILTER_PARAMETER + "=" + cqlFilterValue; } @@ -172,44 +184,30 @@ public class GisMakers { return string; } - - + /** * Format. * - * @param format the format + * @param format the format * @param separator the separator * @return the string */ - public static String BBOX_FORMAT(COORDINATE_FORMAT format, String separator, double lowerLeftX, double lowerLeftY, double upperRightX, double upperRightY) { - - if(format==null) + public static String BBOX_FORMAT(COORDINATE_FORMAT format, String separator, double lowerLeftX, double lowerLeftY, + double upperRightX, double upperRightY) { + + if (format == null) format = COORDINATE_FORMAT.XY; - - if(separator==null) + + if (separator == null) separator = ","; - + switch (format) { case XY: - return String.format("%s%s%s%s%s%s%s", - String.valueOf(lowerLeftX), - separator, - String.valueOf(lowerLeftY), - separator, - String.valueOf(upperRightX), - separator, - String.valueOf(upperRightY) - ); + return String.format("%s%s%s%s%s%s%s", String.valueOf(lowerLeftX), separator, String.valueOf(lowerLeftY), + separator, String.valueOf(upperRightX), separator, String.valueOf(upperRightY)); case YX: - return String.format("%s%s%s%s%s%s%s", - String.valueOf(lowerLeftY), - separator, - String.valueOf(lowerLeftX), - separator, - String.valueOf(upperRightY), - separator, - String.valueOf(upperRightX) - ); + return String.format("%s%s%s%s%s%s%s", String.valueOf(lowerLeftY), separator, String.valueOf(lowerLeftX), + separator, String.valueOf(upperRightY), separator, String.valueOf(upperRightX)); } return null;