comparison src/djol/WFSSource.js @ 10:8705103f074f

Слияние
author cin
date Mon, 21 Aug 2017 18:03:00 +0300
parents f0035923ff3e
children 67a5de7581ad
comparison
equal deleted inserted replaced
9:37e9e6bbe87a 10:8705103f074f
1 define([ "ol", "dojo/request", "dojo/_base/array", "implab/safe"],
2
3 function(ol, request, array, safe) {
4 return function(wfs, featurePrefix, featureType, featureNS, queryArgs) {
5 if (arguments.length == 1) {
6 featurePrefix = wfs.featurePrefix;
7 featureType = wfs.featureType;
8 featureNS = wfs.featureNS;
9 wfs = wfs.wfsURL;
10 queryArgs = wfs.queryArgs;
11 }
12
13 safe.argumentNotNull(wfs, "wfsURL");
14 safe.argumentNotEmpty(featurePrefix, "featurePrefix");
15 safe.argumentNotEmpty(featureNS, "featureNS");
16 safe.argumentNotEmpty(featureType, "featureType");
17
18 var format = new ol.format.WFS({
19 featureNS : featureNS,
20 featureType : featureType
21 });
22
23 var layerName = featurePrefix + ":" + featureType;
24
25 function loader(extent, resolution, projection) {
26 var query = {
27 service : 'WFS',
28 version : '1.1.0',
29 request : 'GetFeature',
30 typename : layerName,
31 srsname : projection.getCode()
32 };
33 safe.mixin(query, queryArgs);
34
35 if (extent && isFinite(extent[0]))
36 query.bbox = extent.join(',') + "," + projection.getCode();
37
38 return request(wfs, {
39 query : query,
40 handleAs : 'xml'
41 }).then(function(data) {
42 // в загрузчике нельзя вызывать метод source.clear() поскольку
43 // это приводит к рекурсии
44 var features = format.readFeatures(data);
45
46 var map = {}, del = [], add = [];
47
48 array.forEach(features, function(x) {
49 // HACK исправляем идентификаторы, чтобы они совпадали с
50 // реальными
51
52 var id = x.get("id");
53 if (id)
54 x.setId(id);
55 else
56 id = x.getId();
57
58 map[id] = x;
59
60 // нужно проверить, была ли фича на карте
61 var prev = source.getFeatureById(id);
62 if (prev) {
63 // если да, то обновить ее.
64 var data = x.getProperties();
65 prev.setProperties(data);
66 } else {
67 // иначе добавить
68 add.push(x);
69 }
70 });
71
72 source.forEachFeatureInExtent(extent, function(x) {
73 if (!(x.getId() in map))
74 del.push(x);
75 });
76
77 source.addFeatures(add);
78
79 array.forEach(del, function(x) {
80 source.removeFeature(x);
81 });
82
83 //revision = revision + 1;
84
85 source.set("revision", ++revision);
86
87 });
88 }
89
90 var cls = ol.source.ServerVector || ol.source.Vector;
91 var revision = 0;
92 var source = new cls({
93 loader : loader,
94 //revision: revision
95 wrapX : false
96 // ,
97 // strategy : options.strategy || ol.loadingstrategy.all,
98 // projection : options.projection
99 });
100 source.set("revision", revision);
101 source.reload = function(extent,resolution, projection, q) {
102 if (arguments.length >= 4)
103 queryArgs = q;
104 if (!extent)
105 extent = [-Infinity, -Infinity, Infinity, Infinity];
106 return loader(extent,resolution,projection);
107 };
108
109 console.log(wfs, layerName);
110 return source;
111 };
112 });