// @require WFS_URL if (!WFS_URL) throw "Missing WFS_URL" // wfsFeature json format: /* { $fieldName: - string => field value - array of objects => ref features as objects (wfsFeature) - array of strings => ref features as xlink url } */ function p5WFS_ParseFeatureFieldRecurse(tagNode) { // @returns object from xml element var item = {} var i = 0 for (i = 0; i < tagNode.children.length; i++) { var fieldNode = tagNode.children[i] if (!fieldNode.children.length) { if (fieldNode.textContent) item[ fieldNode.localName ] = fieldNode.textContent else { var xlink = fieldNode.getAttribute('xlink:href') if (xlink) { if (!(fieldNode.tagName in item)) item[ fieldNode.tagName ] = [] item[ fieldNode.tagName ].push( xlink ) } } } else { if (!(fieldNode.tagName in item)) item[ fieldNode.tagName ] = [] item[ fieldNode.tagName ].push( p5WFS_ParseFeatureFieldRecurse(fieldNode) ) } } return item } function p5WFS_ParseFeatureMember(featureMember) { // @returns object from xml element if (!featureMember) return null if (!featureMember.children.length) return null var featureNode = featureMember.children[0] if (!featureNode) return null if (!featureNode.children.length) return null return p5WFS_ParseFeatureFieldRecurse(featureNode) } /** * @usage p5WFS_GetFeature('p5_default_db:CRM_PROCES', { 'featureID': 'CRM_PROCES.' + id, }).then(function (features) { // ... }).catch(function (e) { // ... }) * @usage - expected one feature p5WFS_GetFeature('p5_default_db:CRM_PROCES', { 'featureID': 'CRM_PROCES.' + id, }).then(function (features) { if (!features) throw "Nie odnaleziono rekordu id = " + id if (!features.length) throw "Nie odnaleziono rekordu id = " + id if (1 !== features.length) throw "Bład: API zwróciło za dużo rekordów" return features[0] console.log('fetched features', features) }).then(function (feature) { // ... }).catch(function (e) { // ... }) * @usage - POST p5WFS_GetFeature('p5_default_db:CRM_PROCES', { // 'Filter': '' + "PARENT_ID" + '' + parent_id + '', 'sortBy': 'SORT_PRIO+A,ID', 'ogc:Filter': '' + '' + '' + "PARENT_ID" + '' + parent_id + '' + '' + '' }).then(function (features) { ... */ function p5WFS_GetFeature(typeName, query) { // @returns Promise var postData = null var link = WFS_URL + '?SERVICE=WFS&VERSION=1.0.0' + '&REQUEST=GetFeature' + '&TYPENAME=' + typeName + '&SRSNAME=EPSG:3003' // '&Filter=ID' + id + '' var query = query || {} if ('featureID' in query) link += '&featureID=' + query['featureID'] if ('Filter' in query && 'string' === typeof query['Filter']) { var ogcFilter = ('' !== query['Filter'].substr(0, ''.length)) ? '' + query['Filter'] + '' : query['Filter'] ; link += '&Filter=' + ogcFilter } if ('ogc:Filter' in query && 'string' === typeof query['ogc:Filter']) { var headerOgcFilter = '' if ('' === query['ogc:Filter'].substr(0, ''.length)) { postData = headerOgcFilter + '' + query['ogc:Filter'] + '' + '' } else if ('' === query['ogc:Filter'].substr(0, ''.length)) { postData = headerOgcFilter + query['ogc:Filter'] + '' } else { throw 'Error - wrong syntax ogc:Filter' } } if ('sortBy' in query) link += '&sortBy=' + query['sortBy'] if ('maxFeatures' in query) link += '&maxFeatures=' + query['maxFeatures'] if ('count' in query) link += '&count=' + query['count'] var method = (postData) ? 'POST' : 'GET' return window.fetch(link, Object.assign({ method: method, credentials: 'include', }, ('POST' === method) ? { body: postData } : {} )).then(function (response) { return response.text() }).then(function (responseText) { return (new DOMParser()).parseFromString(responseText, "text/xml"); }).then(function (xmlResponse) { if (!xmlResponse.children.length) throw "Missing response xml root element" return xmlResponse.children[0] }).then(function (xmlRoot) { if ('html' === xmlRoot.localName) { console.log(xmlRoot) // html / body / parseerror / div throw "Parse xml error" } if ('FeatureCollection' !== xmlRoot.localName) { if ('ServiceExceptionReport' === xmlRoot.tagName) { if (xmlRoot.children[0] && xmlRoot.children[0].textContent) throw xmlRoot.children[0].textContent throw "WFS API Exception" } throw "Missing FeatureCollection as root element in wfs response" } var features = [] for (var i = 0; i < xmlRoot.children.length; i++) { features.push(p5WFS_ParseFeatureMember(xmlRoot.children[i])) } return features.filter(function (item) { return !!item; }) }) } global.p5WFS_ParseFeatureMember = p5WFS_ParseFeatureMember global.p5WFS_ParseFeatureFieldRecurse = p5WFS_ParseFeatureFieldRecurse global.p5WFS_GetFeature = p5WFS_GetFeature