Mercurial > pub > ImplabJs
view src/djol/WFSSource.js @ 17:9c21e656cbec
Разработка кнопки выбора координат с карт
author | nickolay |
---|---|
date | Tue, 19 Sep 2017 20:37:56 +0300 |
parents | 67a5de7581ad |
children | f750c89976d3 |
line wrap: on
line source
define([ "ol", "dojo/request", "dojo/_base/array", "implab/safe"], function(ol, request, array, safe) { 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); }; console.log(wfs, layerName); return source; }; });