diff --git a/example/SuitabilityGeothermalDrillingSwitzerland.min.js b/example/SuitabilityGeothermalDrillingSwitzerland.min.js index 393b5f3..072148b 100644 --- a/example/SuitabilityGeothermalDrillingSwitzerland.min.js +++ b/example/SuitabilityGeothermalDrillingSwitzerland.min.js @@ -3645,7 +3645,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CheckSuitabilityCanton\": () => (/* binding */ CheckSuitabilityCanton),\n/* harmony export */ \"GetWMSCanton\": () => (/* binding */ GetWMSCanton),\n/* harmony export */ \"GetWMSLegendCanton\": () => (/* binding */ GetWMSLegendCanton),\n/* harmony export */ \"SetProxyServer\": () => (/* binding */ SetProxyServer),\n/* harmony export */ \"TestAllCantons\": () => (/* binding */ TestAllCantons),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"error\": () => (/* binding */ error),\n/* harmony export */ \"proxyServer\": () => (/* binding */ proxyServer)\n/* harmony export */ });\n/* harmony import */ var cross_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! cross-fetch */ \"./node_modules/cross-fetch/dist/browser-ponyfill.js\");\n/* harmony import */ var jsdom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ \"jsdom\");\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! underscore */ \"./node_modules/underscore/modules/index-all.js\");\n/* harmony import */ var ol_source_ImageWMS_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ol/source/ImageWMS.js */ \"./node_modules/ol/source/ImageWMS.js\");\n/* harmony import */ var ol_format_WMSGetFeatureInfo_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ol/format/WMSGetFeatureInfo.js */ \"./node_modules/ol/format/WMSGetFeatureInfo.js\");\n/* harmony import */ var proj4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! proj4 */ \"./node_modules/proj4/lib/index.js\");\n/* harmony import */ var ol_proj_proj4_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ol/proj/proj4.js */ \"./node_modules/ol/proj/proj4.js\");\n// SuitabilityGeothermalDrillingSwitzerland\r\n//\r\n/**\r\n * @module SuitabilityGeothermalDrillingSwitzerland\r\n * @typicalname BfeLib \r\n*/\r\n\r\n\r\n //node js only\r\n //node js only\r\n //node js only\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nproj4__WEBPACK_IMPORTED_MODULE_3__[\"default\"].defs(\r\n \"EPSG:2056\",\r\n \"+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs\"\r\n);\r\n(0,ol_proj_proj4_js__WEBPACK_IMPORTED_MODULE_4__.register)(proj4__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\r\n\r\n/**\r\n * on (catched) error, this object contains the error\r\n */\r\nlet error;\r\n\r\n/**\r\n * Proxy server URL (Getter)\r\n */\r\nlet proxyServer = 'https://bfe-cors.geotest.ch/';\r\n\r\n/**\r\n * Setter for proxyServer\r\n * @param {string} url proxy server url, e.g. 'https://bfe-cors.geotest.ch/'\r\n * @example SetProxyServer('https://bfe-cors.geotest.ch/');\r\n */\r\nfunction SetProxyServer(url) {\r\n if (url)\r\n proxyServer = url;\r\n}\r\n\r\n/**\r\n * async_fetch\r\n * @ignore\r\n * @param {string} url \r\n * @returns {string} json\r\n */\r\nasync function async_fetch(url) {\r\n let response = await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(url)\r\n if (response.ok)\r\n return await response.json()\r\n throw new Error(response.status)\r\n}\r\n\r\n/**\r\n * getAllCantonsJson\r\n * @ignore\r\n * @returns {object} all canton definitions from json\r\n */\r\nasync function getAllCantonsJson() {\r\n let cantonsJson;\r\n\r\n if (typeof window === 'undefined') { //node js env\r\n const JSDOM = jsdom__WEBPACK_IMPORTED_MODULE_1__.JSDOM;\r\n global.DOMParser = new JSDOM('').window.DOMParser;\r\n global.Node = new JSDOM('').window.Node;\r\n\r\n let rawCantons = jsdom__WEBPACK_IMPORTED_MODULE_1__.readFileSync('cantons.json');\r\n cantonsJson = JSON.parse(rawCantons);\r\n }\r\n else { // browser env\r\n cantonsJson = await async_fetch('cantons.json');\r\n }\r\n return cantonsJson;\r\n}\r\n\r\n/**\r\n * getCantonJson\r\n * @ignore\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @returns {object} canton definition from json\r\n */\r\nasync function getCantonJson(cantonAbbrev) {\r\n //get cantons\r\n const cantonsJson = await getAllCantonsJson();\r\n let cantons_array = cantonsJson.cantonsList;\r\n\r\n //get canton by abbreviation\r\n let canton = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(cantons_array, i => i.name === cantonAbbrev);\r\n\r\n return canton;\r\n}\r\n/**\r\n * getWMSList\r\n * @ignore\r\n * @param {object} canton canton defintion from json\r\n * @returns {object[]} list with wms defintions\r\n */\r\nasync function getWMSList(canton) {\r\n let wmsList = [];\r\n\r\n if (canton != undefined) {\r\n const hasMultiWMS = typeof canton.wmsMulti !== 'undefined';\r\n if (hasMultiWMS) { //handle mutliple wms sources\r\n // console.log('Multiple WMS defined: ', canton.wmsMulti);\r\n\r\n for (let index = 0; index < canton.wmsMulti.length; index++) {\r\n const wmsItem = canton.wmsMulti[index];\r\n wmsList.push(wmsItem);\r\n }\r\n }\r\n else { //handle single wms source\r\n wmsList.push({\r\n wmsUrl: canton.wmsUrl,\r\n mapServerUrlLegendUrl: canton.mapServerUrlLegendUrl,\r\n infoFormat: canton.infoFormat,\r\n layers: canton.layers\r\n });\r\n }\r\n }\r\n return wmsList;\r\n}\r\n\r\n/**\r\n * imageWMSFactory\r\n * @ignore\r\n * @param {object} wmsItem url and layer definition\r\n * @param {boolean} withProxy add proxy server to url. default = false\r\n * @param {string} wmsVersion (optional) default='1.3.0'\r\n * @param {boolean} noLayers (optional) ommit layers list. default = false\r\n * @returns {ImageWMS} ol imageWMS object\r\n */\r\nasync function imageWMSFactory(wmsItem, withProxy = false, wmsVersion = '1.3.0', noLayers = false) {\r\n let layerNames = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(wmsItem.layers, 'name'); //get wms layer names\r\n\r\n let url = wmsItem.wmsUrl;\r\n if (withProxy) url = proxyServer + wmsItem.wmsUrl;\r\n\r\n if (noLayers) {\r\n const imageWms = new ol_source_ImageWMS_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]({\r\n url: url,\r\n params: {\r\n 'VERSION': wmsVersion,\r\n 'TRANSPARENT': false\r\n },\r\n serverType: 'geoserver',\r\n crossOrigin: 'anonymous',\r\n });\r\n\r\n return imageWms;\r\n }\r\n else {\r\n const imageWms = new ol_source_ImageWMS_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]({\r\n url: url,\r\n params: {\r\n 'LAYERS': [...layerNames],\r\n 'VERSION': wmsVersion,\r\n 'TRANSPARENT': false\r\n },\r\n serverType: 'geoserver',\r\n crossOrigin: 'anonymous',\r\n });\r\n\r\n return imageWms;\r\n }\r\n}\r\n\r\n/**\r\n * esriRestFeatureFactory\r\n * @ignore\r\n * @param {string} featureServerUrl base url for esri REST feature server\r\n * @param {number} easting LV95 Easting\r\n * @param {number} northing LV95 Northing\r\n * @returns {string} feature server url at position E/N\r\n */\r\nasync function esriRestFeatureFactory(featureServerUrl, easting, northing) {\r\n const delta = 0.01; //variation for bbox\r\n let url = featureServerUrl +\r\n '/query/?f=json&' +\r\n 'imageDisplay=1,1,1&' +\r\n 'tolerance=1&' +\r\n // 'returnGeometry=false&spatialRel=esriSpatialRelIntersects&geometry=' +\r\n 'geometry={%22x%22%3A' +\r\n `${(easting).toFixed(3)}` +\r\n '%2C%22y%22%3A' +\r\n `${(northing).toFixed(3)}` +\r\n '}&' +\r\n 'returnGeometry=false&' +\r\n // 'spatialRel=esriSpatialRelIntersects&' +\r\n 'mapExtent=' +\r\n `${(easting - delta).toFixed(3)}` +\r\n ',' +\r\n `${(northing - delta).toFixed(3)}` +\r\n ',' +\r\n `${(easting + delta).toFixed(3)}` +\r\n ',' +\r\n `${(northing + delta).toFixed(3)}` +\r\n // '&geometryType=esriGeometryEnvelope&' +\r\n '&geometryType=esriGeometryPoint&' +\r\n 'inSR=2056&' +\r\n '&outSR=2056' +\r\n '&sr=2056';\r\n\r\n return url;\r\n}\r\n\r\n/**\r\n * GetWMSCanton\r\n * @async\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @param {boolean} withProxy (optional) add proxy server to url. default = false\r\n * @param {boolean} verbose (optional) activate console log. default = false\r\n * @return {ImageWMS[]} for open layers wms, not defined for esri yet\r\n * @example const imageWmsList = await GetWMSCanton('UR', true);\r\n */\r\nasync function GetWMSCanton(cantonAbbrev, withProxy = false, verbose = false) {\r\n const canton = await getCantonJson(cantonAbbrev);\r\n const wmsList = await getWMSList(canton);\r\n\r\n let imageWmsList = [];\r\n //multiple wms possible\r\n for (const wmsItem of wmsList) {\r\n if (wmsItem.infoFormat !== 'arcgis/json') { //openlayers WMS\r\n\r\n let imageWms, wmsVersion;\r\n if (canton.wmsVersion) //needed for TI so far\r\n {\r\n wmsVersion = canton.wmsVersion;\r\n imageWms = await imageWMSFactory(wmsItem, withProxy, wmsVersion);\r\n }\r\n else {\r\n imageWms = await imageWMSFactory(wmsItem, withProxy);\r\n }\r\n\r\n imageWmsList.push(imageWms);\r\n }\r\n else { //Esri ArcGIS REST \r\n\r\n if (canton.mapServerUrl && canton.wmsUrlEsriLayer) { //if esri wmsserver defined\r\n let esriItem = {\r\n wmsUrl: canton.mapServerUrl,\r\n mapServerUrlLegendUrl: undefined,\r\n infoFormat: canton.infoFormat,\r\n layers: [{ name: canton.wmsUrlEsriLayer }]\r\n };\r\n const imageWms = await imageWMSFactory(esriItem, withProxy);\r\n imageWmsList.push(imageWms);\r\n }\r\n else {\r\n if (verbose) console.log('Esri ArcGIS REST not implemented yet for canton ', cantonAbbrev);\r\n }\r\n }\r\n }\r\n\r\n return imageWmsList;\r\n}\r\n\r\n/**\r\n * GetWMSLegendCanton\r\n * @async\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @return {string[]} legend urls\r\n * @example let legends = await GetWMSLegendCanton('VD');\r\n */\r\nasync function GetWMSLegendCanton(cantonAbbrev) {\r\n\r\n //TODO: impolement for ESRI case?\r\n\r\n const imageWmsList = await GetWMSCanton(cantonAbbrev);\r\n\r\n let legendUrlList = [];\r\n for (const imageWmsItem of imageWmsList) {\r\n const legendItem = imageWmsItem.getLegendUrl();\r\n if (legendItem != null) legendUrlList.push(legendItem);\r\n }\r\n\r\n if (legendUrlList.length == 0) {\r\n const canton = await getCantonJson(cantonAbbrev);\r\n const wmsList = await getWMSList(canton);\r\n for (const wmsInfo of wmsList) {\r\n if (wmsInfo.mapServerUrlLegendUrl != null) legendUrlList.push(wmsInfo.mapServerUrlLegendUrl);\r\n }\r\n }\r\n\r\n return legendUrlList;\r\n}\r\n\r\n/**\r\n * CheckSuitabilityCanton\r\n * @async\r\n * @param {number} easting LV95 Easting in (m)\r\n * @param {number} northing LV95 Northing in (m)\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @param {boolean} verbose (optional) activate console log\r\n * @returns {number} harmonised suitability value, 999 on error -> check 'error' object\r\n * - 1 = Kat 1: Grundsätzlich mit allgemeinen Auflagen zulässig\r\n * - 2 = Kat 2: Grundsätzlich mit speziellen Auflagen zulässig\r\n * - 3 = Kat 3: Grundsätzlich nicht zulässig\r\n * - 4 = Kat 4: Aussage zur Eignung zurzeit nicht möglich\r\n * - 5 = Kat 5: Keine Daten vorhanden\r\n * @example let result = await CheckSuitabilityCanton(2652462, 1196901, 'LU');\r\n */\r\nasync function CheckSuitabilityCanton(easting, northing, cantonAbbrev, verbose = true) {\r\n try {\r\n\r\n error = undefined; //reset error object\r\n\r\n //Check perimeter\r\n const lowerleft = [2480000, 1070000];\r\n const upperright = [2840000, 1300000];\r\n if (easting < lowerleft[0] || easting > upperright[0] ||\r\n northing < lowerleft[1] || northing > upperright[1]) {\r\n error = new Error('Not in the ESPG 2056 perimeter: ' + lowerleft + ' ' + upperright);\r\n return 999;\r\n }\r\n\r\n const style = 'color:red; font-size:20px; font-weight: bold; -webkit-text-stroke: 1px black;'\r\n if (verbose) console.log(\"%c CheckSuitabilityCanton \", style);\r\n\r\n // //get canton by abbreviation\r\n const canton = await getCantonJson(cantonAbbrev);\r\n if (!canton) {\r\n if (verbose) console.log('canton abbreviation not supported: ' + cantonAbbrev);\r\n return 5; //kategorie weiss=5\r\n }\r\n\r\n // single vs multiple wms sources\r\n const wmsList = await getWMSList(canton);\r\n\r\n let mappingSum = 0; //the value to map in the harmony map\r\n for (const wmsItem of wmsList) {\r\n\r\n let url;\r\n if (wmsItem.infoFormat !== 'arcgis/json') { //openlayers WMS\r\n\r\n let imageWms;\r\n\r\n // wmsVersion in use for TI so far\r\n // loopLayers in use for LU so far\r\n imageWms = await imageWMSFactory(wmsItem, false, canton.wmsVersion, canton.loopLayers);\r\n\r\n url = imageWms.getFeatureInfoUrl(\r\n [easting, northing],\r\n 0.2, // small bbox extent is crucial, especially for wms with zoom factors\r\n 'EPSG:2056', // EPSG:2056 = LV95\r\n {\r\n 'INFO_FORMAT': wmsItem.infoFormat\r\n }\r\n );\r\n }\r\n else { //Esri ArcGIS REST \r\n url = await esriRestFeatureFactory(wmsItem.wmsUrl, easting, northing);\r\n }\r\n\r\n if (verbose) console.log(url);\r\n\r\n if (url) {\r\n try {\r\n //fetch wms url\r\n url = proxyServer + url;\r\n if (verbose && wmsItem.infoFormat !== 'arcgis/json') console.log(url);\r\n\r\n let response = await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(url); //Remark: not needed for wmsItem.infoFormat === 'arcgis/json'\r\n // if (response.status !== 200) {\r\n // throw 'response status = ' + response.status;\r\n // }\r\n\r\n let dataraw = await response.text();\r\n\r\n if (verbose && wmsItem.infoFormat !== 'arcgis/json' && canton.loopLayers == false)\r\n console.log(dataraw);\r\n\r\n //handle response\r\n for (let layer of wmsItem.layers) {\r\n if (verbose) console.log('\\nlayer name: \\t', layer.name);\r\n\r\n let value;\r\n\r\n //handle different text formats\r\n if (wmsItem.infoFormat === 'application/vnd.ogc.gml') {\r\n const featureInfo = new ol_format_WMSGetFeatureInfo_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]({ layers: layer.name });\r\n const feature = featureInfo.readFeatures(dataraw);\r\n value = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].first(underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(feature, 'values_'), layer.propertyName));\r\n }\r\n else if (wmsItem.infoFormat === 'application/geojson' ||\r\n wmsItem.infoFormat === 'application/geo+json' ||\r\n wmsItem.infoFormat === 'application/json' ||\r\n wmsItem.infoFormat === 'arcgis/json') {\r\n\r\n let rootName = 'features';\r\n let nodeName = 'properties';\r\n if (layer.rootName) {\r\n rootName = layer.rootName;\r\n }\r\n if (layer.nodeName) {\r\n nodeName = layer.nodeName;\r\n }\r\n\r\n // if (wmsItem.infoFormat !== 'arcgis/json') {\r\n // //continue with former request data\r\n // }\r\n if (wmsItem.infoFormat == 'arcgis/json' || canton.loopLayers == true) {\r\n\r\n let urlLayer = url + '&layers=' + layer.name;\r\n urlLayer = urlLayer + '&QUERY_LAYERS=' + layer.name;\r\n\r\n if (verbose) console.log(urlLayer);\r\n response = await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(urlLayer); // get esri rest response for layer\r\n dataraw = await response.text();\r\n if (verbose) console.log(dataraw);\r\n\r\n }\r\n if (verbose) console.log('node name: \\t', nodeName);\r\n\r\n let data = JSON.parse(dataraw)\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].has(data, rootName) && data[rootName].length > 0) {\r\n\r\n if (layer.priorityMax && data[rootName].length > 1) {\r\n //sort by 'priorityMax' descending\r\n data[rootName] = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].sortBy(data[rootName], function (o) { return -o.attributes[layer.priorityMax]; });\r\n }\r\n\r\n //take the first elmement\r\n value = data[rootName][0][nodeName][layer.propertyName];\r\n\r\n // Is value not defined and do we have more features?\r\n if (!value && data[rootName].length > 1) {\r\n data[rootName].every(v => {\r\n value = v[nodeName][layer.propertyName];\r\n if (!value) return true;\r\n return false;\r\n });\r\n }\r\n }\r\n else {\r\n value = undefined;\r\n }\r\n }\r\n else {\r\n error = new Error('infoFormat not implemented: ' + wmsItem.infoFormat);\r\n return 999;\r\n }\r\n\r\n if (verbose) console.log('property name: \\t', layer.propertyName);\r\n\r\n //assign summand\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].has(layer, 'propertyValues')) { //evaluate multiple return values\r\n if (value === undefined) {\r\n value = 'undefined';\r\n }\r\n\r\n let propertyValueNameByContains = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].some(layer.propertyValues, i => i.contains);\r\n let propertyValueNames = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(layer.propertyValues, 'name');\r\n\r\n if (!propertyValueNameByContains) { //search for exact match\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].contains(propertyValueNames, value)) {\r\n\r\n let propertyValue = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(layer.propertyValues, i => i.name === value);\r\n if (verbose) console.log('\\t list match exact: \\t', propertyValue.name);\r\n if (verbose) console.log('\\t summand: \\t', propertyValue.summand);\r\n mappingSum += propertyValue.summand;\r\n }\r\n else {\r\n if (verbose) console.log('\\t NO match: \\t', value);\r\n }\r\n }\r\n else { //search for contains text\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].filter(propertyValueNames,\r\n function (text) {\r\n return value.includes(text);\r\n })) {\r\n let propertyValue = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(layer.propertyValues, i => value.includes(i.name));\r\n if (verbose) console.log('\\t list match contains: \\t', propertyValue.name);\r\n if (verbose) console.log('\\t summand: \\t', propertyValue.summand);\r\n mappingSum += propertyValue.summand;\r\n }\r\n else {\r\n if (verbose) console.log('\\t NO match: \\t', value);\r\n }\r\n }\r\n }\r\n else { //evaluate presence of property value\r\n if (value) {\r\n if (verbose) console.log('\\t presence match: \\t', value);\r\n if (verbose) console.log('\\t summand: \\t', layer.summand);\r\n mappingSum += layer.summand;\r\n }\r\n // else {\r\n // console.log('\\t NO match.');\r\n // }\r\n\r\n }\r\n }\r\n if (verbose) console.log('\\n---------------------------------------------');\r\n }\r\n catch (err) {\r\n error = err;\r\n return 999;\r\n }\r\n }\r\n }\r\n\r\n // Harmonisation: mappping the response\r\n if (canton.harmonyMap) {\r\n let mappingItem = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(canton.harmonyMap, i => i.sum === mappingSum);\r\n let mappingValue;\r\n if (!mappingItem) {\r\n if (mappingSum === 0)\r\n mappingValue = 4; //Fallback\r\n else {\r\n mappingValue = undefined;\r\n error = new Error('no harmonised value found for sum = ' + mappingSum);\r\n return 999;\r\n }\r\n }\r\n else {\r\n mappingValue = mappingItem.value;\r\n }\r\n if (verbose) console.log('Mapping Sum: \\t', mappingSum);\r\n if (verbose) console.log('Harmonised value:\\t', mappingValue);\r\n return mappingValue;\r\n }\r\n else {\r\n if (verbose) console.log('Mapping Sum: \\t', mappingSum);\r\n if (verbose) console.log('Harmonised value:\\t', 'no harmony map found');\r\n error = new Error('no harmony found for canton ' + canton.name);\r\n return 999;\r\n }\r\n\r\n } catch (err) { //global catch\r\n error = err;\r\n return 999;\r\n }\r\n}\r\n\r\n/**\r\n * Check url for status ok\r\n * @ignore\r\n * @param {string} url \r\n * @returns {boolean} status=ok\r\n */\r\nasync function checkLinkOk(url) {\r\n if (url)\r\n return (await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(url)).ok;\r\n else\r\n return false;\r\n}\r\n\r\n/**\r\n * Test WMS definition for all cantons\r\n * @async\r\n * @param {boolean} verbose (optional) activate detailled console log. default = true\r\n * @returns {object} test result for all cantons\r\n * @example let result = await TestAllCantons();\r\n */\r\nasync function TestAllCantons(verbose = true) {\r\n\r\n let cantonsDict = [];\r\n\r\n const cantons = await getAllCantonsJson();\r\n const cantonsList = cantons.cantonsList;\r\n const cantonNames = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(cantonsList, 'name').sort();\r\n\r\n // First test proxy\r\n try {\r\n let isOnline = await checkLinkOk(proxyServer + 'https://admin.ch');\r\n if (!isOnline) console.log(\"Proxy or Admin not working...\");\r\n }\r\n catch (e) {\r\n console.log(\"Proxy or Admin not working...\");\r\n }\r\n\r\n // let cantonAbbrevList = ['LU'];\r\n\r\n for (const cantonAbbrev of cantonAbbrevList) {\r\n\r\n const configured = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].contains(cantonNames, cantonAbbrev);\r\n let wmsAlive = [];\r\n\r\n if (configured) {\r\n let imageWmsList;\r\n\r\n imageWmsList = await GetWMSCanton(cantonAbbrev, true);\r\n\r\n if (imageWmsList.length == 0) { //esri rest return empty list --> fallback: assume esri rest\r\n let canton = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(cantonsList, i => i.name === cantonAbbrev);\r\n let location1 = canton.exampleLocation[0];\r\n\r\n let wmsGetFeatureInfoOk = false;\r\n let suitability = await CheckSuitabilityCanton(location1[0], location1[1], cantonAbbrev, verbose);\r\n\r\n if (suitability && suitability < 5 && suitability > 0)\r\n wmsGetFeatureInfoOk = true;\r\n let checkResult = suitability === location1[2];\r\n\r\n let wmsAlive = [];\r\n wmsAlive.push({\r\n wms: 'none',\r\n aliveGetCap: undefined,\r\n aliveGetFeat: wmsGetFeatureInfoOk,\r\n expectedResult: checkResult\r\n });\r\n\r\n let item = {\r\n canton: cantonAbbrev,\r\n configured: configured,\r\n wmsAlive: wmsAlive\r\n }\r\n\r\n cantonsDict.push(item);\r\n console.log(cantonAbbrev);\r\n continue;\r\n }\r\n\r\n for (const imageWmsItem of imageWmsList) {\r\n try {\r\n const wmsUrl = imageWmsItem.getUrl();\r\n\r\n // Check GetCapabilities\r\n let wmsVersion = imageWmsItem.params_.VERSION;\r\n const wmsGetCapabilitiesUrl = wmsUrl + '?version=' + wmsVersion + '&request=GetCapabilities&service=WMS';\r\n const wmsGetCapabilitiesOk = await checkLinkOk(wmsGetCapabilitiesUrl);\r\n\r\n let wmsGetFeatureInfoOk = false;\r\n let canton = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(cantonsList, i => i.name === cantonAbbrev);\r\n let location1 = canton.exampleLocation[0];\r\n\r\n // Check Suitability (GetFeatureInfo)\r\n let suitability = await CheckSuitabilityCanton(location1[0], location1[1], cantonAbbrev, verbose);\r\n if (suitability && suitability < 5 && suitability > 0)\r\n wmsGetFeatureInfoOk = true;\r\n\r\n // let checkResult = suitability === Number(location1[2]);\r\n let checkResult = suitability === location1[2];\r\n\r\n wmsAlive.push({\r\n wms: wmsUrl,\r\n aliveGetCap: wmsGetCapabilitiesOk,\r\n aliveGetFeat: wmsGetFeatureInfoOk,\r\n expectedResult: checkResult //not fully implemented yet\r\n });\r\n\r\n }\r\n catch (err) {\r\n wmsAlive.push({\r\n wms: imageWmsItem.url,\r\n alive: false,\r\n error: err\r\n });\r\n }\r\n }\r\n if (imageWmsList.length === 0) //no wms for canton found\r\n wmsAlive.push({\r\n wms: 'none',\r\n aliveGetCap: undefined,\r\n aliveGetFeat: undefined,\r\n expectedResult: undefined\r\n });\r\n\r\n }\r\n else { //canton not configured\r\n wmsAlive.push({\r\n wms: 'none',\r\n aliveGetCap: undefined,\r\n aliveGetFeat: undefined,\r\n expectedResult: undefined\r\n });\r\n }\r\n\r\n let item = {\r\n canton: cantonAbbrev,\r\n configured: configured,\r\n wmsAlive: wmsAlive\r\n }\r\n\r\n cantonsDict.push(item);\r\n console.log(cantonAbbrev);\r\n }\r\n\r\n return cantonsDict;\r\n}\r\n\r\n/**\r\n * All 26 canton abbreviations\r\n * @ignore\r\n */\r\nconst cantonAbbrevList = ['AG',\r\n 'AI',\r\n 'AR',\r\n 'BE',\r\n 'BL',\r\n 'BS',\r\n 'FR',\r\n 'GE',\r\n 'GL',\r\n 'GR',\r\n 'JU',\r\n 'LU',\r\n 'NE',\r\n 'NW',\r\n 'OW',\r\n 'SG',\r\n 'SH',\r\n 'SO',\r\n 'SZ',\r\n 'TG',\r\n 'TI',\r\n 'UR',\r\n 'VD',\r\n 'VS',\r\n 'ZG',\r\n 'ZH'];\r\n\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ GetWMSCanton, GetWMSLegendCanton, CheckSuitabilityCanton, error, proxyServer, SetProxyServer, TestAllCantons });\n\n//# sourceURL=webpack://suitability_geothermal_drilling_switzerland/./src/SuitabilityGeothermalDrillingSwitzerland.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CheckSuitabilityCanton\": () => (/* binding */ CheckSuitabilityCanton),\n/* harmony export */ \"GetWMSCanton\": () => (/* binding */ GetWMSCanton),\n/* harmony export */ \"GetWMSLegendCanton\": () => (/* binding */ GetWMSLegendCanton),\n/* harmony export */ \"SetProxyServer\": () => (/* binding */ SetProxyServer),\n/* harmony export */ \"TestAllCantons\": () => (/* binding */ TestAllCantons),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"error\": () => (/* binding */ error),\n/* harmony export */ \"proxyServer\": () => (/* binding */ proxyServer)\n/* harmony export */ });\n/* harmony import */ var cross_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! cross-fetch */ \"./node_modules/cross-fetch/dist/browser-ponyfill.js\");\n/* harmony import */ var jsdom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ \"jsdom\");\n/* harmony import */ var underscore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! underscore */ \"./node_modules/underscore/modules/index-all.js\");\n/* harmony import */ var ol_source_ImageWMS_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ol/source/ImageWMS.js */ \"./node_modules/ol/source/ImageWMS.js\");\n/* harmony import */ var ol_format_WMSGetFeatureInfo_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ol/format/WMSGetFeatureInfo.js */ \"./node_modules/ol/format/WMSGetFeatureInfo.js\");\n/* harmony import */ var proj4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! proj4 */ \"./node_modules/proj4/lib/index.js\");\n/* harmony import */ var ol_proj_proj4_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ol/proj/proj4.js */ \"./node_modules/ol/proj/proj4.js\");\n// SuitabilityGeothermalDrillingSwitzerland\r\n//\r\n/**\r\n * @module SuitabilityGeothermalDrillingSwitzerland\r\n * @typicalname BfeLib \r\n*/\r\n\r\n\r\n //node js only\r\n //node js only\r\n //node js only\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nproj4__WEBPACK_IMPORTED_MODULE_3__[\"default\"].defs(\r\n \"EPSG:2056\",\r\n \"+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs\"\r\n);\r\n(0,ol_proj_proj4_js__WEBPACK_IMPORTED_MODULE_4__.register)(proj4__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\r\n\r\n/**\r\n * on (catched) error, this object contains the error\r\n */\r\nlet error;\r\n\r\n/**\r\n * Proxy server URL (Getter)\r\n */\r\nlet proxyServer = 'https://bfe-cors.geotest.ch/';\r\n\r\n/**\r\n * Setter for proxyServer\r\n * @param {string} url proxy server url, e.g. 'https://bfe-cors.geotest.ch/'\r\n * @example SetProxyServer('https://bfe-cors.geotest.ch/');\r\n */\r\nfunction SetProxyServer(url) {\r\n if (url)\r\n proxyServer = url;\r\n}\r\n\r\n/**\r\n * async_fetch\r\n * @ignore\r\n * @param {string} url \r\n * @returns {string} json\r\n */\r\nasync function async_fetch(url) {\r\n let response = await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(url)\r\n if (response.ok)\r\n return await response.json()\r\n throw new Error(response.status)\r\n}\r\n\r\n/**\r\n * getAllCantonsJson\r\n * @ignore\r\n * @returns {object} all canton definitions from json\r\n */\r\nasync function getAllCantonsJson() {\r\n let cantonsJson;\r\n\r\n if (typeof window === 'undefined') { //node js env\r\n const JSDOM = jsdom__WEBPACK_IMPORTED_MODULE_1__.JSDOM;\r\n global.DOMParser = new JSDOM('').window.DOMParser;\r\n global.Node = new JSDOM('').window.Node;\r\n\r\n let rawCantons = jsdom__WEBPACK_IMPORTED_MODULE_1__.readFileSync('cantons.json');\r\n cantonsJson = JSON.parse(rawCantons);\r\n }\r\n else { // browser env\r\n cantonsJson = await async_fetch('cantons.json');\r\n }\r\n return cantonsJson;\r\n}\r\n\r\n/**\r\n * getCantonJson\r\n * @ignore\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @returns {object} canton definition from json\r\n */\r\nasync function getCantonJson(cantonAbbrev) {\r\n //get cantons\r\n const cantonsJson = await getAllCantonsJson();\r\n let cantons_array = cantonsJson.cantonsList;\r\n\r\n //get canton by abbreviation\r\n let canton = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(cantons_array, i => i.name === cantonAbbrev);\r\n\r\n return canton;\r\n}\r\n/**\r\n * getWMSList\r\n * @ignore\r\n * @param {object} canton canton defintion from json\r\n * @returns {object[]} list with wms defintions\r\n */\r\nasync function getWMSList(canton) {\r\n let wmsList = [];\r\n\r\n if (canton != undefined) {\r\n const hasMultiWMS = typeof canton.wmsMulti !== 'undefined';\r\n if (hasMultiWMS) { //handle mutliple wms sources\r\n // console.log('Multiple WMS defined: ', canton.wmsMulti);\r\n\r\n for (let index = 0; index < canton.wmsMulti.length; index++) {\r\n const wmsItem = canton.wmsMulti[index];\r\n wmsList.push(wmsItem);\r\n }\r\n }\r\n else { //handle single wms source\r\n wmsList.push({\r\n wmsUrl: canton.wmsUrl,\r\n mapServerUrlLegendUrl: canton.mapServerUrlLegendUrl,\r\n infoFormat: canton.infoFormat,\r\n layers: canton.layers\r\n });\r\n }\r\n }\r\n return wmsList;\r\n}\r\n\r\n/**\r\n * imageWMSFactory\r\n * @ignore\r\n * @param {object} wmsItem url and layer definition\r\n * @param {boolean} withProxy add proxy server to url. default = false\r\n * @param {string} wmsVersion (optional) default='1.3.0'\r\n * @param {boolean} noLayers (optional) ommit layers list. default = false\r\n * @returns {ImageWMS} ol imageWMS object\r\n */\r\nasync function imageWMSFactory(wmsItem, withProxy = false, wmsVersion = '1.3.0', noLayers = false) {\r\n let layerNames = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(wmsItem.layers, 'name'); //get wms layer names\r\n\r\n let url = wmsItem.wmsUrl;\r\n if (withProxy) url = proxyServer + wmsItem.wmsUrl;\r\n\r\n if (noLayers) {\r\n const imageWms = new ol_source_ImageWMS_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]({\r\n url: url,\r\n params: {\r\n 'VERSION': wmsVersion,\r\n 'TRANSPARENT': false\r\n },\r\n serverType: 'geoserver',\r\n crossOrigin: 'anonymous',\r\n });\r\n\r\n return imageWms;\r\n }\r\n else {\r\n const imageWms = new ol_source_ImageWMS_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]({\r\n url: url,\r\n params: {\r\n 'LAYERS': [...layerNames],\r\n 'VERSION': wmsVersion,\r\n 'TRANSPARENT': false\r\n },\r\n serverType: 'geoserver',\r\n crossOrigin: 'anonymous',\r\n });\r\n\r\n return imageWms;\r\n }\r\n}\r\n\r\n/**\r\n * esriRestFeatureFactory\r\n * @ignore\r\n * @param {string} featureServerUrl base url for esri REST feature server\r\n * @param {number} easting LV95 Easting\r\n * @param {number} northing LV95 Northing\r\n * @returns {string} feature server url at position E/N\r\n */\r\nasync function esriRestFeatureFactory(featureServerUrl, easting, northing) {\r\n const delta = 0.01; //variation for bbox\r\n let url = featureServerUrl +\r\n '/query/?f=json&' +\r\n 'imageDisplay=1,1,1&' +\r\n 'tolerance=1&' +\r\n // 'returnGeometry=false&spatialRel=esriSpatialRelIntersects&geometry=' +\r\n 'geometry={%22x%22%3A' +\r\n `${(easting).toFixed(3)}` +\r\n '%2C%22y%22%3A' +\r\n `${(northing).toFixed(3)}` +\r\n '}&' +\r\n 'returnGeometry=false&' +\r\n // 'spatialRel=esriSpatialRelIntersects&' +\r\n 'mapExtent=' +\r\n `${(easting - delta).toFixed(3)}` +\r\n ',' +\r\n `${(northing - delta).toFixed(3)}` +\r\n ',' +\r\n `${(easting + delta).toFixed(3)}` +\r\n ',' +\r\n `${(northing + delta).toFixed(3)}` +\r\n // '&geometryType=esriGeometryEnvelope&' +\r\n '&geometryType=esriGeometryPoint&' +\r\n 'inSR=2056&' +\r\n '&outSR=2056' +\r\n '&sr=2056';\r\n\r\n return url;\r\n}\r\n\r\n/**\r\n * GetWMSCanton\r\n * @async\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @param {boolean} withProxy (optional) add proxy server to url. default = false\r\n * @param {boolean} verbose (optional) activate console log. default = false\r\n * @return {ImageWMS[]} for open layers wms, not defined for esri yet\r\n * @example const imageWmsList = await GetWMSCanton('UR', true);\r\n */\r\nasync function GetWMSCanton(cantonAbbrev, withProxy = false, verbose = false) {\r\n const canton = await getCantonJson(cantonAbbrev);\r\n const wmsList = await getWMSList(canton);\r\n\r\n let imageWmsList = [];\r\n //multiple wms possible\r\n for (const wmsItem of wmsList) {\r\n if (wmsItem.infoFormat !== 'arcgis/json') { //openlayers WMS\r\n\r\n let imageWms, wmsVersion;\r\n if (canton.wmsVersion) //needed for TI so far\r\n {\r\n wmsVersion = canton.wmsVersion;\r\n imageWms = await imageWMSFactory(wmsItem, withProxy, wmsVersion);\r\n }\r\n else {\r\n imageWms = await imageWMSFactory(wmsItem, withProxy);\r\n }\r\n\r\n imageWmsList.push(imageWms);\r\n }\r\n else { //Esri ArcGIS REST \r\n\r\n if (canton.mapServerUrl && canton.wmsUrlEsriLayer) { //if esri wmsserver defined\r\n let esriItem = {\r\n wmsUrl: canton.mapServerUrl,\r\n mapServerUrlLegendUrl: undefined,\r\n infoFormat: canton.infoFormat,\r\n layers: [{ name: canton.wmsUrlEsriLayer }]\r\n };\r\n const imageWms = await imageWMSFactory(esriItem, withProxy);\r\n imageWmsList.push(imageWms);\r\n }\r\n else {\r\n if (verbose) console.log('Esri ArcGIS REST not implemented yet for canton ', cantonAbbrev);\r\n }\r\n }\r\n }\r\n\r\n return imageWmsList;\r\n}\r\n\r\n/**\r\n * GetWMSLegendCanton\r\n * @async\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @return {string[]} legend urls\r\n * @example let legends = await GetWMSLegendCanton('VD');\r\n */\r\nasync function GetWMSLegendCanton(cantonAbbrev) {\r\n\r\n const imageWmsList = await GetWMSCanton(cantonAbbrev);\r\n\r\n // get wms legends\r\n let legendUrlList = [];\r\n for (const imageWmsItem of imageWmsList) {\r\n const legendItem = imageWmsItem.getLegendUrl();\r\n if (legendItem != null) legendUrlList.push(legendItem);\r\n }\r\n\r\n // check for manual legend definitions\r\n let legendUrlListManual = [];\r\n const canton = await getCantonJson(cantonAbbrev);\r\n const wmsList = await getWMSList(canton);\r\n for (const wmsInfo of wmsList) {\r\n if (wmsInfo.mapServerUrlLegendUrl != null) legendUrlListManual.push(wmsInfo.mapServerUrlLegendUrl);\r\n }\r\n\r\n if (legendUrlListManual.length > 0) // manual definitions wins\r\n return legendUrlListManual;\r\n else\r\n return legendUrlList;\r\n}\r\n\r\n\r\n/**\r\n * CheckSuitabilityCanton\r\n * @async\r\n * @param {number} easting LV95 Easting in (m)\r\n * @param {number} northing LV95 Northing in (m)\r\n * @param {string} cantonAbbrev two letter abbreviation for canton, e.g. 'AG'\r\n * @param {boolean} verbose (optional) activate console log\r\n * @returns {number} harmonised suitability value, 999 on error -> check 'error' object\r\n * - 1 = Kat 1: Grundsätzlich mit allgemeinen Auflagen zulässig\r\n * - 2 = Kat 2: Grundsätzlich mit speziellen Auflagen zulässig\r\n * - 3 = Kat 3: Grundsätzlich nicht zulässig\r\n * - 4 = Kat 4: Aussage zur Eignung zurzeit nicht möglich\r\n * - 5 = Kat 5: Keine Daten vorhanden\r\n * @example let result = await CheckSuitabilityCanton(2652462, 1196901, 'LU');\r\n */\r\nasync function CheckSuitabilityCanton(easting, northing, cantonAbbrev, verbose = true) {\r\n try {\r\n\r\n error = undefined; //reset error object\r\n\r\n //Check perimeter\r\n const lowerleft = [2480000, 1070000];\r\n const upperright = [2840000, 1300000];\r\n if (easting < lowerleft[0] || easting > upperright[0] ||\r\n northing < lowerleft[1] || northing > upperright[1]) {\r\n error = new Error('Not in the ESPG 2056 perimeter: ' + lowerleft + ' ' + upperright);\r\n return 999;\r\n }\r\n\r\n const style = 'color:red; font-size:20px; font-weight: bold; -webkit-text-stroke: 1px black;'\r\n if (verbose) console.log(\"%c CheckSuitabilityCanton \", style);\r\n\r\n // //get canton by abbreviation\r\n const canton = await getCantonJson(cantonAbbrev);\r\n if (!canton) {\r\n if (verbose) console.log('canton abbreviation not supported: ' + cantonAbbrev);\r\n return 5; //kategorie weiss=5\r\n }\r\n\r\n // single vs multiple wms sources\r\n const wmsList = await getWMSList(canton);\r\n\r\n let mappingSum = 0; //the value to map in the harmony map\r\n for (const wmsItem of wmsList) {\r\n\r\n let url;\r\n if (wmsItem.infoFormat !== 'arcgis/json') { //openlayers WMS\r\n\r\n let imageWms;\r\n\r\n // wmsVersion in use for TI so far\r\n // loopLayers in use for LU so far\r\n imageWms = await imageWMSFactory(wmsItem, false, canton.wmsVersion, canton.loopLayers);\r\n\r\n url = imageWms.getFeatureInfoUrl(\r\n [easting, northing],\r\n 0.2, // small bbox extent is crucial, especially for wms with zoom factors\r\n 'EPSG:2056', // EPSG:2056 = LV95\r\n {\r\n 'INFO_FORMAT': wmsItem.infoFormat\r\n }\r\n );\r\n }\r\n else { //Esri ArcGIS REST \r\n url = await esriRestFeatureFactory(wmsItem.wmsUrl, easting, northing);\r\n }\r\n\r\n if (verbose) console.log(url);\r\n\r\n if (url) {\r\n try {\r\n //fetch wms url\r\n url = proxyServer + url;\r\n if (verbose && wmsItem.infoFormat !== 'arcgis/json') console.log(url);\r\n\r\n let response = await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(url); //Remark: not needed for wmsItem.infoFormat === 'arcgis/json'\r\n // if (response.status !== 200) {\r\n // throw 'response status = ' + response.status;\r\n // }\r\n\r\n let dataraw = await response.text();\r\n\r\n if (verbose && wmsItem.infoFormat !== 'arcgis/json' && canton.loopLayers == false)\r\n console.log(dataraw);\r\n\r\n //handle response\r\n for (let layer of wmsItem.layers) {\r\n if (verbose) console.log('\\nlayer name: \\t', layer.name);\r\n\r\n let value;\r\n\r\n //handle different text formats\r\n if (wmsItem.infoFormat === 'application/vnd.ogc.gml') {\r\n const featureInfo = new ol_format_WMSGetFeatureInfo_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]({ layers: layer.name });\r\n const feature = featureInfo.readFeatures(dataraw);\r\n value = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].first(underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(feature, 'values_'), layer.propertyName));\r\n }\r\n else if (wmsItem.infoFormat === 'application/geojson' ||\r\n wmsItem.infoFormat === 'application/geo+json' ||\r\n wmsItem.infoFormat === 'application/json' ||\r\n wmsItem.infoFormat === 'arcgis/json') {\r\n\r\n let rootName = 'features';\r\n let nodeName = 'properties';\r\n if (layer.rootName) {\r\n rootName = layer.rootName;\r\n }\r\n if (layer.nodeName) {\r\n nodeName = layer.nodeName;\r\n }\r\n\r\n // if (wmsItem.infoFormat !== 'arcgis/json') {\r\n // //continue with former request data\r\n // }\r\n if (wmsItem.infoFormat == 'arcgis/json' || canton.loopLayers == true) {\r\n\r\n let urlLayer = url + '&layers=' + layer.name;\r\n urlLayer = urlLayer + '&QUERY_LAYERS=' + layer.name;\r\n\r\n if (verbose) console.log(urlLayer);\r\n response = await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(urlLayer); // get esri rest response for layer\r\n dataraw = await response.text();\r\n if (verbose) console.log(dataraw);\r\n\r\n }\r\n if (verbose) console.log('node name: \\t', nodeName);\r\n\r\n let data = JSON.parse(dataraw)\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].has(data, rootName) && data[rootName].length > 0) {\r\n\r\n if (layer.priorityMax && data[rootName].length > 1) {\r\n //sort by 'priorityMax' descending\r\n data[rootName] = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].sortBy(data[rootName], function (o) { return -o.attributes[layer.priorityMax]; });\r\n }\r\n\r\n //take the first elmement\r\n value = data[rootName][0][nodeName][layer.propertyName];\r\n\r\n // Is value not defined and do we have more features?\r\n if (!value && data[rootName].length > 1) {\r\n data[rootName].every(v => {\r\n value = v[nodeName][layer.propertyName];\r\n if (!value) return true;\r\n return false;\r\n });\r\n }\r\n }\r\n else {\r\n value = undefined;\r\n }\r\n }\r\n else {\r\n error = new Error('infoFormat not implemented: ' + wmsItem.infoFormat);\r\n return 999;\r\n }\r\n\r\n if (verbose) console.log('property name: \\t', layer.propertyName);\r\n\r\n //assign summand\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].has(layer, 'propertyValues')) { //evaluate multiple return values\r\n if (value === undefined) {\r\n value = 'undefined';\r\n }\r\n\r\n let propertyValueNameByContains = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].some(layer.propertyValues, i => i.contains);\r\n let propertyValueNames = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(layer.propertyValues, 'name');\r\n\r\n if (!propertyValueNameByContains) { //search for exact match\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].contains(propertyValueNames, value)) {\r\n\r\n let propertyValue = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(layer.propertyValues, i => i.name === value);\r\n if (verbose) console.log('\\t list match exact: \\t', propertyValue.name);\r\n if (verbose) console.log('\\t summand: \\t', propertyValue.summand);\r\n mappingSum += propertyValue.summand;\r\n }\r\n else {\r\n if (verbose) console.log('\\t NO match: \\t', value);\r\n }\r\n }\r\n else { //search for contains text\r\n if (underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].filter(propertyValueNames,\r\n function (text) {\r\n return value.includes(text);\r\n })) {\r\n let propertyValue = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(layer.propertyValues, i => value.includes(i.name));\r\n if (verbose) console.log('\\t list match contains: \\t', propertyValue.name);\r\n if (verbose) console.log('\\t summand: \\t', propertyValue.summand);\r\n mappingSum += propertyValue.summand;\r\n }\r\n else {\r\n if (verbose) console.log('\\t NO match: \\t', value);\r\n }\r\n }\r\n }\r\n else { //evaluate presence of property value\r\n if (value) {\r\n if (verbose) console.log('\\t presence match: \\t', value);\r\n if (verbose) console.log('\\t summand: \\t', layer.summand);\r\n mappingSum += layer.summand;\r\n }\r\n // else {\r\n // console.log('\\t NO match.');\r\n // }\r\n\r\n }\r\n }\r\n if (verbose) console.log('\\n---------------------------------------------');\r\n }\r\n catch (err) {\r\n error = err;\r\n return 999;\r\n }\r\n }\r\n }\r\n\r\n // Harmonisation: mappping the response\r\n if (canton.harmonyMap) {\r\n let mappingItem = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(canton.harmonyMap, i => i.sum === mappingSum);\r\n let mappingValue;\r\n if (!mappingItem) {\r\n if (mappingSum === 0)\r\n mappingValue = 4; //Fallback\r\n else {\r\n mappingValue = undefined;\r\n error = new Error('no harmonised value found for sum = ' + mappingSum);\r\n return 999;\r\n }\r\n }\r\n else {\r\n mappingValue = mappingItem.value;\r\n }\r\n if (verbose) console.log('Mapping Sum: \\t', mappingSum);\r\n if (verbose) console.log('Harmonised value:\\t', mappingValue);\r\n return mappingValue;\r\n }\r\n else {\r\n if (verbose) console.log('Mapping Sum: \\t', mappingSum);\r\n if (verbose) console.log('Harmonised value:\\t', 'no harmony map found');\r\n error = new Error('no harmony found for canton ' + canton.name);\r\n return 999;\r\n }\r\n\r\n } catch (err) { //global catch\r\n error = err;\r\n return 999;\r\n }\r\n}\r\n\r\n/**\r\n * Check url for status ok\r\n * @ignore\r\n * @param {string} url \r\n * @returns {boolean} status=ok\r\n */\r\nasync function checkLinkOk(url) {\r\n if (url)\r\n return (await cross_fetch__WEBPACK_IMPORTED_MODULE_0__(url)).ok;\r\n else\r\n return false;\r\n}\r\n\r\n/**\r\n * Test WMS definition for all cantons\r\n * @async\r\n * @param {boolean} verbose (optional) activate detailled console log. default = true\r\n * @returns {object} test result for all cantons\r\n * @example let result = await TestAllCantons();\r\n */\r\nasync function TestAllCantons(verbose = true) {\r\n\r\n let cantonsDict = [];\r\n\r\n const cantons = await getAllCantonsJson();\r\n const cantonsList = cantons.cantonsList;\r\n const cantonNames = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].pluck(cantonsList, 'name').sort();\r\n\r\n // First test proxy\r\n try {\r\n let isOnline = await checkLinkOk(proxyServer + 'https://admin.ch');\r\n if (!isOnline) console.log(\"Proxy or Admin not working...\");\r\n }\r\n catch (e) {\r\n console.log(\"Proxy or Admin not working...\");\r\n }\r\n\r\n // let cantonAbbrevList = ['LU'];\r\n\r\n for (const cantonAbbrev of cantonAbbrevList) {\r\n\r\n const configured = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].contains(cantonNames, cantonAbbrev);\r\n let wmsAlive = [];\r\n\r\n if (configured) {\r\n let imageWmsList;\r\n\r\n imageWmsList = await GetWMSCanton(cantonAbbrev, true);\r\n\r\n if (imageWmsList.length == 0) { //esri rest return empty list --> fallback: assume esri rest\r\n let canton = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(cantonsList, i => i.name === cantonAbbrev);\r\n let location1 = canton.exampleLocation[0];\r\n\r\n let wmsGetFeatureInfoOk = false;\r\n let suitability = await CheckSuitabilityCanton(location1[0], location1[1], cantonAbbrev, verbose);\r\n\r\n if (suitability && suitability < 5 && suitability > 0)\r\n wmsGetFeatureInfoOk = true;\r\n let checkResult = suitability === location1[2];\r\n\r\n let wmsAlive = [];\r\n wmsAlive.push({\r\n wms: 'none',\r\n aliveGetCap: undefined,\r\n aliveGetFeat: wmsGetFeatureInfoOk,\r\n expectedResult: checkResult\r\n });\r\n\r\n let item = {\r\n canton: cantonAbbrev,\r\n configured: configured,\r\n wmsAlive: wmsAlive\r\n }\r\n\r\n cantonsDict.push(item);\r\n console.log(cantonAbbrev);\r\n continue;\r\n }\r\n\r\n for (const imageWmsItem of imageWmsList) {\r\n try {\r\n const wmsUrl = imageWmsItem.getUrl();\r\n\r\n // Check GetCapabilities\r\n let wmsVersion = imageWmsItem.params_.VERSION;\r\n const wmsGetCapabilitiesUrl = wmsUrl + '?version=' + wmsVersion + '&request=GetCapabilities&service=WMS';\r\n const wmsGetCapabilitiesOk = await checkLinkOk(wmsGetCapabilitiesUrl);\r\n\r\n let wmsGetFeatureInfoOk = false;\r\n let canton = underscore__WEBPACK_IMPORTED_MODULE_2__[\"default\"].find(cantonsList, i => i.name === cantonAbbrev);\r\n let location1 = canton.exampleLocation[0];\r\n\r\n // Check Suitability (GetFeatureInfo)\r\n let suitability = await CheckSuitabilityCanton(location1[0], location1[1], cantonAbbrev, verbose);\r\n if (suitability && suitability < 5 && suitability > 0)\r\n wmsGetFeatureInfoOk = true;\r\n\r\n // let checkResult = suitability === Number(location1[2]);\r\n let checkResult = suitability === location1[2];\r\n\r\n wmsAlive.push({\r\n wms: wmsUrl,\r\n aliveGetCap: wmsGetCapabilitiesOk,\r\n aliveGetFeat: wmsGetFeatureInfoOk,\r\n expectedResult: checkResult //not fully implemented yet\r\n });\r\n\r\n }\r\n catch (err) {\r\n wmsAlive.push({\r\n wms: imageWmsItem.url,\r\n alive: false,\r\n error: err\r\n });\r\n }\r\n }\r\n if (imageWmsList.length === 0) //no wms for canton found\r\n wmsAlive.push({\r\n wms: 'none',\r\n aliveGetCap: undefined,\r\n aliveGetFeat: undefined,\r\n expectedResult: undefined\r\n });\r\n\r\n }\r\n else { //canton not configured\r\n wmsAlive.push({\r\n wms: 'none',\r\n aliveGetCap: undefined,\r\n aliveGetFeat: undefined,\r\n expectedResult: undefined\r\n });\r\n }\r\n\r\n let item = {\r\n canton: cantonAbbrev,\r\n configured: configured,\r\n wmsAlive: wmsAlive\r\n }\r\n\r\n cantonsDict.push(item);\r\n console.log(cantonAbbrev);\r\n }\r\n\r\n return cantonsDict;\r\n}\r\n\r\n/**\r\n * All 26 canton abbreviations\r\n * @ignore\r\n */\r\nconst cantonAbbrevList = ['AG',\r\n 'AI',\r\n 'AR',\r\n 'BE',\r\n 'BL',\r\n 'BS',\r\n 'FR',\r\n 'GE',\r\n 'GL',\r\n 'GR',\r\n 'JU',\r\n 'LU',\r\n 'NE',\r\n 'NW',\r\n 'OW',\r\n 'SG',\r\n 'SH',\r\n 'SO',\r\n 'SZ',\r\n 'TG',\r\n 'TI',\r\n 'UR',\r\n 'VD',\r\n 'VS',\r\n 'ZG',\r\n 'ZH'];\r\n\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ GetWMSCanton, GetWMSLegendCanton, CheckSuitabilityCanton, error, proxyServer, SetProxyServer, TestAllCantons });\n\n//# sourceURL=webpack://suitability_geothermal_drilling_switzerland/./src/SuitabilityGeothermalDrillingSwitzerland.js?"); /***/ }), diff --git a/src/SuitabilityGeothermalDrillingSwitzerland.js b/src/SuitabilityGeothermalDrillingSwitzerland.js index 0b3c447..b25ecc3 100644 --- a/src/SuitabilityGeothermalDrillingSwitzerland.js +++ b/src/SuitabilityGeothermalDrillingSwitzerland.js @@ -267,27 +267,30 @@ export async function GetWMSCanton(cantonAbbrev, withProxy = false, verbose = fa */ export async function GetWMSLegendCanton(cantonAbbrev) { - //TODO: impolement for ESRI case? - const imageWmsList = await GetWMSCanton(cantonAbbrev); + // get wms legends let legendUrlList = []; for (const imageWmsItem of imageWmsList) { const legendItem = imageWmsItem.getLegendUrl(); if (legendItem != null) legendUrlList.push(legendItem); } - if (legendUrlList.length == 0) { - const canton = await getCantonJson(cantonAbbrev); - const wmsList = await getWMSList(canton); - for (const wmsInfo of wmsList) { - if (wmsInfo.mapServerUrlLegendUrl != null) legendUrlList.push(wmsInfo.mapServerUrlLegendUrl); - } + // check for manual legend definitions + let legendUrlListManual = []; + const canton = await getCantonJson(cantonAbbrev); + const wmsList = await getWMSList(canton); + for (const wmsInfo of wmsList) { + if (wmsInfo.mapServerUrlLegendUrl != null) legendUrlListManual.push(wmsInfo.mapServerUrlLegendUrl); } - return legendUrlList; + if (legendUrlListManual.length > 0) // manual definitions wins + return legendUrlListManual; + else + return legendUrlList; } + /** * CheckSuitabilityCanton * @async