Mercurial > pub > ImplabJs
diff src/djol/WFSSource.js @ 34:27e8e9e38e07 default tip
Слияние
author | nickolay |
---|---|
date | Wed, 05 Jun 2019 20:44:15 +0300 |
parents | 8af8e840dd49 1dc2fd263b90 |
children |
line wrap: on
line diff
--- a/src/djol/WFSSource.js Wed Jun 05 17:44:17 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -define([ - "ol", - "dojo/request", - "dojo/_base/array", - "implab/safe", - "implab/log/trace!" -], function (ol, - request, - array, - safe, - trace -) { - return function (wfs, featurePrefix, featureType, featureNS, queryArgs) { - if (arguments.length == 1) { - featurePrefix = wfs.featurePrefix; - featureType = wfs.featureType; - featureNS = wfs.featureNS; - wfs = wfs.wfsURL; - queryArgs = wfs.queryArgs; - } - - safe.argumentNotNull(wfs, "wfsURL"); - safe.argumentNotEmptyString(featurePrefix, "featurePrefix"); - safe.argumentNotEmptyString(featureNS, "featureNS"); - safe.argumentNotEmptyString(featureType, "featureType"); - - var format = new ol.format.WFS({ - featureNS: featureNS, - featureType: featureType - }); - - var layerName = featurePrefix + ":" + featureType; - - function loader(extent, resolution, projection) { - var query = { - service: 'WFS', - version: '1.1.0', - request: 'GetFeature', - typename: layerName, - srsname: projection.getCode() - }; - safe.mixin(query, queryArgs); - - if (extent && isFinite(extent[0])) - query.bbox = extent.join(',') + "," + projection.getCode(); - - return request(wfs, { - query: query, - handleAs: 'xml' - }).then(function (data) { - // в загрузчике нельзя вызывать метод source.clear() поскольку - // это приводит к рекурсии - var features = format.readFeatures(data); - - var map = {}, - del = [], - add = []; - - array.forEach(features, function (x) { - // HACK исправляем идентификаторы, чтобы они совпадали с - // реальными - - var id = x.get("id"); - if (id) - x.setId(id); - else - id = x.getId(); - - map[id] = x; - - // нужно проверить, была ли фича на карте - var prev = source.getFeatureById(id); - if (prev) { - // если да, то обновить ее. - var data = x.getProperties(); - prev.setProperties(data); - } else { - // иначе добавить - add.push(x); - } - }); - - source.forEachFeatureInExtent(extent, function (x) { - if (!(x.getId() in map)) - del.push(x); - }); - - source.addFeatures(add); - - array.forEach(del, function (x) { - source.removeFeature(x); - }); - - //revision = revision + 1; - - source.set("revision", ++revision); - - }); - } - - var cls = ol.source.ServerVector || ol.source.Vector; - var revision = 0; - var source = new cls({ - loader: loader, - //revision: revision - wrapX: false - // , - // strategy : options.strategy || ol.loadingstrategy.all, - // projection : options.projection - }); - source.set("revision", revision); - source.reload = function (extent, resolution, projection, q) { - if (arguments.length >= 4) - queryArgs = q; - if (!extent) - extent = [-Infinity, -Infinity, Infinity, Infinity]; - return loader(extent, resolution, projection); - }; - - trace.log("{0} -> {1}", layerName, wfs); - return source; - }; -}); \ No newline at end of file