Fullstack Portal Created by the HCMR for the Marine Strategy Framework Directive Program in order to cover demands and aspects considering extendability and maintainability
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

197 lines
5.9 KiB

L.Geoserver = L.FeatureGroup.extend({
//Some of the default options
options: {
layers: "",
format: "image/png",
transparent: true,
CQL_FILTER: "INCLUDE",
zIndex: 1000,
version: "1.1.0",
srsname: "EPSG:4326",
attribution: `layer`,
fitLayer: true,
style: "",
onEachFeature: function (feature, layer) {},
wmsLayers: [],
wmsCQL_FILTER: [],
wmsStyle: [],
width: 500,
height: 500,
},
// constructor function
initialize: function (baseLayerUrl, options) {
this.baseLayerUrl = baseLayerUrl;
L.setOptions(this, options);
this._layers = {};
this.state = {
exist: "exist",
};
},
//wms layer function
wms: function () {
return L.tileLayer.wms(this.baseLayerUrl, this.options);
},
//wfs layer fetching function
//Note this function will work only for vector layer
wfs: function () {
var that = this;
//Geoserver Web Feature Service
$.ajax(this.baseLayerUrl, {
type: "GET",
data: {
service: "WFS",
version: "1.1.0",
request: "GetFeature",
typename: this.options.layers,
CQL_FILTER: this.options.CQL_FILTER,
srsname: this.options.srsname,
outputFormat: "text/javascript",
format_options: "callback: getJson",
},
dataType: "jsonp",
jsonpCallback: "getJson",
success: function (data) {
var layers = [];
// push all the layers to the layers array
for (var i = 0; i < data.features.length; i++) {
var layer = L.GeoJSON.geometryToLayer(
data.features[i],
that.options || null
);
layer.feature = data.features[i];
layer.options.onEachFeature = that.options.onEachFeature(
layer.feature,
layer
);
layers.push(layer);
}
// for adding styles to the geojson feature
if (typeof that.options.style === "function") {
for (i = 0; i < layers.length; i++) {
that.addLayer(layers[i]);
if (i.setStyle) {
i.setStyle(that.options.style(i.feature));
}
}
} else {
for (i = 0; i < layers.length; i++) {
that.addLayer(layers[i]);
that.setStyle(that.options.style);
}
}
if (that.options.fitLayer) {
that._map.fitBounds(that.getBounds());
}
},
}).fail(function (jqXHR, textStatus, error) {
console.log(jqXHR, textStatus, error);
});
return that;
},
//Legend of the map
legend: function () {
var that = this;
var legend = L.control({ position: "bottomleft" });
legend.onAdd = function (map) {
var div = L.DomUtil.create("div", "info Legend");
var url = `${that.baseLayerUrl}/wms?REQUEST=GetLegendGraphic&VERSION=1.1.0&FORMAT=image/png&LAYER=${that.options.layers}&style=${that.options.style}`;
div.innerHTML +=
"<img src=" +
url +
' alt="legend" data-toggle="tooltip" title="Map legend">';
return div;
};
return legend;
},
//This function is used for zooming the raster layer using specific vector data
wmsImage: function () {
var that = this;
$.ajax({
url: `${that.baseLayerUrl}/ows?service=WFS&version=1.0.0&request=GetFeature&cql_filter=${that.options.wmsCQL_FILTER[0]}&typeName=${that.options.wmsLayers[0]}&srsName=EPSG:4326&maxFeatures=50&outputFormat=text%2Fjavascript`,
dataType: "jsonp",
jsonpCallback: "parseResponse",
success: function (data) {
// bounding box for the selected vector layer
selectedArea = L.geoJson(data);
bboxX1 = selectedArea.getBounds()._southWest.lng;
bboxX2 = selectedArea.getBounds()._northEast.lng;
bboxY1 = selectedArea.getBounds()._southWest.lat;
bboxY2 = selectedArea.getBounds()._northEast.lat;
bboxList = [bboxX1, bboxX2, bboxY1, bboxY2];
bufferBbox = Math.min((bboxX2 - bboxX1) * 0.1, (bboxY2 - bboxY1) * 0.1);
maxValue = Math.max(bboxX2 - bboxX1, bboxY2 - bboxY1) / 2.0;
var otherLayers = "";
var otherStyle = "";
var otherCqlFilter = "";
for (var i = 1; i < that.options.wmsLayers.length; i++) {
otherLayers += that.options.wmsLayers[i];
otherStyle += that.options.wmsStyle[i];
otherCqlFilter +=that.options.wmsCQL_FILTER[i];
if (i != that.options.wmsLayers.length - 1) {
otherLayers += ",";
otherStyle += ",";
otherCqlFilter += ';';
}
}
//final wmsLayerUrl
var wmsLayerURL = `${
that.baseLayerUrl
}/wms?service=WMS&version=1.1.0&request=GetMap&\
layers=${otherLayers}&\
styles=${otherStyle}&\
cql_filter=${otherCqlFilter}&\
bbox=${(bboxX1 + bboxX2) * 0.5 - maxValue - bufferBbox},${
(bboxY1 + bboxY2) * 0.5 - maxValue - bufferBbox
},${(bboxX1 + bboxX2) * 0.5 + maxValue + bufferBbox},${
(bboxY1 + bboxY2) * 0.5 + maxValue + bufferBbox
}&\
width=${that.options.width}&\
height=${that.options.height}&\
srs=EPSG%3A4326&\
format=image/png`;
$(`#${that.options.wmsId}`).attr("src", wmsLayerURL);
return that;
},
});
return that;
},
});
L.Geoserver.wms = function (baseLayerUrl, options) {
var req = new L.Geoserver(baseLayerUrl, options);
return req.wms();
};
L.Geoserver.wfs = function (baseLayerUrl, options) {
var req = new L.Geoserver(baseLayerUrl, options);
return req.wfs();
};
L.Geoserver.legend = function (baseLayerUrl, options) {
var req = new L.Geoserver(baseLayerUrl, options);
return req.legend();
};
L.Geoserver.wmsImage = function (baseLayerUrl, options) {
var req = new L.Geoserver(baseLayerUrl, options);
return req.wmsImage();
};