| 276 | | }, |
|---|
| 277 | | "ogc": { |
|---|
| 278 | | "Filter": function(node, rule) { |
|---|
| 279 | | // Filters correspond to subclasses of OpenLayers.Filter. |
|---|
| 280 | | // Since they contain information we don't persist, we |
|---|
| 281 | | // create a temporary object and then pass on the filter |
|---|
| 282 | | // (ogc:Filter) to the parent rule (sld:Rule). |
|---|
| 283 | | var obj = { |
|---|
| 284 | | fids: [], |
|---|
| 285 | | filters: [] |
|---|
| 286 | | }; |
|---|
| 287 | | this.readChildNodes(node, obj); |
|---|
| 288 | | if(obj.fids.length > 0) { |
|---|
| 289 | | rule.filter = new OpenLayers.Filter.FeatureId({ |
|---|
| 290 | | fids: obj.fids |
|---|
| 291 | | }); |
|---|
| 292 | | } else if(obj.filters.length > 0) { |
|---|
| 293 | | rule.filter = obj.filters[0]; |
|---|
| 294 | | } |
|---|
| 295 | | }, |
|---|
| 296 | | "FeatureId": function(node, obj) { |
|---|
| 297 | | var fid = node.getAttribute("fid"); |
|---|
| 298 | | if(fid) { |
|---|
| 299 | | obj.fids.push(fid); |
|---|
| 300 | | } |
|---|
| 301 | | }, |
|---|
| 302 | | "And": function(node, obj) { |
|---|
| 303 | | var filter = new OpenLayers.Filter.Logical({ |
|---|
| 304 | | type: OpenLayers.Filter.Logical.AND |
|---|
| 305 | | }); |
|---|
| 306 | | this.readChildNodes(node, filter); |
|---|
| 307 | | obj.filters.push(filter); |
|---|
| 308 | | }, |
|---|
| 309 | | "Or": function(node, obj) { |
|---|
| 310 | | var filter = new OpenLayers.Filter.Logical({ |
|---|
| 311 | | type: OpenLayers.Filter.Logical.OR |
|---|
| 312 | | }); |
|---|
| 313 | | this.readChildNodes(node, filter); |
|---|
| 314 | | obj.filters.push(filter); |
|---|
| 315 | | }, |
|---|
| 316 | | "Not": function(node, obj) { |
|---|
| 317 | | var filter = new OpenLayers.Filter.Logical({ |
|---|
| 318 | | type: OpenLayers.Filter.Logical.NOT |
|---|
| 319 | | }); |
|---|
| 320 | | this.readChildNodes(node, filter); |
|---|
| 321 | | obj.filters.push(filter); |
|---|
| 322 | | }, |
|---|
| 323 | | "PropertyIsEqualTo": function(node, obj) { |
|---|
| 324 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 325 | | type: OpenLayers.Filter.Comparison.EQUAL_TO |
|---|
| 326 | | }); |
|---|
| 327 | | this.readChildNodes(node, filter); |
|---|
| 328 | | obj.filters.push(filter); |
|---|
| 329 | | }, |
|---|
| 330 | | "PropertyIsNotEqualTo": function(node, obj) { |
|---|
| 331 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 332 | | type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO |
|---|
| 333 | | }); |
|---|
| 334 | | this.readChildNodes(node, filter); |
|---|
| 335 | | obj.filters.push(filter); |
|---|
| 336 | | }, |
|---|
| 337 | | "PropertyIsLessThan": function(node, obj) { |
|---|
| 338 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 339 | | type: OpenLayers.Filter.Comparison.LESS_THAN |
|---|
| 340 | | }); |
|---|
| 341 | | this.readChildNodes(node, filter); |
|---|
| 342 | | obj.filters.push(filter); |
|---|
| 343 | | }, |
|---|
| 344 | | "PropertyIsGreaterThan": function(node, obj) { |
|---|
| 345 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 346 | | type: OpenLayers.Filter.Comparison.GREATER_THAN |
|---|
| 347 | | }); |
|---|
| 348 | | this.readChildNodes(node, filter); |
|---|
| 349 | | obj.filters.push(filter); |
|---|
| 350 | | }, |
|---|
| 351 | | "PropertyIsLessThanOrEqualTo": function(node, obj) { |
|---|
| 352 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 353 | | type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO |
|---|
| 354 | | }); |
|---|
| 355 | | this.readChildNodes(node, filter); |
|---|
| 356 | | obj.filters.push(filter); |
|---|
| 357 | | }, |
|---|
| 358 | | "PropertyIsGreaterThanOrEqualTo": function(node, obj) { |
|---|
| 359 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 360 | | type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO |
|---|
| 361 | | }); |
|---|
| 362 | | this.readChildNodes(node, filter); |
|---|
| 363 | | obj.filters.push(filter); |
|---|
| 364 | | }, |
|---|
| 365 | | "PropertyIsBetween": function(node, obj) { |
|---|
| 366 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 367 | | type: OpenLayers.Filter.Comparison.BETWEEN |
|---|
| 368 | | }); |
|---|
| 369 | | this.readChildNodes(node, filter); |
|---|
| 370 | | obj.filters.push(filter); |
|---|
| 371 | | }, |
|---|
| 372 | | "PropertyIsLike": function(node, obj) { |
|---|
| 373 | | var filter = new OpenLayers.Filter.Comparison({ |
|---|
| 374 | | type: OpenLayers.Filter.Comparison.LIKE |
|---|
| 375 | | }); |
|---|
| 376 | | this.readChildNodes(node, filter); |
|---|
| 377 | | var wildCard = node.getAttribute("wildCard"); |
|---|
| 378 | | var singleChar = node.getAttribute("singleChar"); |
|---|
| 379 | | var esc = node.getAttribute("escape"); |
|---|
| 380 | | filter.value2regex(wildCard, singleChar, esc); |
|---|
| 381 | | obj.filters.push(filter); |
|---|
| 382 | | }, |
|---|
| 383 | | "Literal": function(node, obj) { |
|---|
| 384 | | obj.value = this.getChildValue(node); |
|---|
| 385 | | }, |
|---|
| 386 | | "PropertyName": function(node, filter) { |
|---|
| 387 | | filter.property = this.getChildValue(node); |
|---|
| 388 | | }, |
|---|
| 389 | | "LowerBoundary": function(node, filter) { |
|---|
| 390 | | filter.lowerBoundary = this.readOgcExpression(node); |
|---|
| 391 | | }, |
|---|
| 392 | | "UpperBoundary": function(node, filter) { |
|---|
| 393 | | filter.upperBoundary = this.readOgcExpression(node); |
|---|
| 394 | | } |
|---|
| 395 | | } |
|---|
| 396 | | }, |
|---|
| 397 | | |
|---|
| 398 | | /** |
|---|
| 399 | | * Method: readOgcExpression |
|---|
| 400 | | * Limited support for OGC expressions. |
|---|
| 401 | | * |
|---|
| 402 | | * Parameters: |
|---|
| 403 | | * node - {DOMElement} A DOM element that contains an ogc:expression. |
|---|
| 404 | | * |
|---|
| 405 | | * Returns: |
|---|
| 406 | | * {String} A value to be used in a symbolizer. |
|---|
| 407 | | */ |
|---|
| 408 | | readOgcExpression: function(node) { |
|---|
| 409 | | var obj = {}; |
|---|
| 410 | | this.readChildNodes(node, obj); |
|---|
| 411 | | var value = obj.value; |
|---|
| 412 | | if(!value) { |
|---|
| 413 | | value = this.getChildValue(node); |
|---|
| 414 | | } |
|---|
| 415 | | return value; |
|---|
| | 283 | } |
|---|
| 900 | | }, |
|---|
| 901 | | "ogc": { |
|---|
| 902 | | "Filter": function(filter) { |
|---|
| 903 | | var node = this.createElementNSPlus("ogc:Filter"); |
|---|
| 904 | | var sub = filter.CLASS_NAME.split(".").pop(); |
|---|
| 905 | | if(sub == "FeatureId") { |
|---|
| 906 | | for(var i=0, len=filter.fids.length; i<len; ++i) { |
|---|
| 907 | | this.writeNode(node, "FeatureId", filter.fids[i]); |
|---|
| 908 | | } |
|---|
| 909 | | } else { |
|---|
| 910 | | this.writeNode(node, this.getFilterType(filter), filter); |
|---|
| 911 | | } |
|---|
| 912 | | return node; |
|---|
| 913 | | }, |
|---|
| 914 | | "FeatureId": function(fid) { |
|---|
| 915 | | return this.createElementNSPlus("ogc:FeatureId", { |
|---|
| 916 | | attributes: {fid: fid} |
|---|
| 917 | | }); |
|---|
| 918 | | }, |
|---|
| 919 | | "And": function(filter) { |
|---|
| 920 | | var node = this.createElementNSPlus("ogc:And"); |
|---|
| 921 | | var childFilter; |
|---|
| 922 | | for(var i=0, len=filter.filters.length; i<len; ++i) { |
|---|
| 923 | | childFilter = filter.filters[i]; |
|---|
| 924 | | this.writeNode( |
|---|
| 925 | | node, this.getFilterType(childFilter), childFilter |
|---|
| 926 | | ); |
|---|
| 927 | | } |
|---|
| 928 | | return node; |
|---|
| 929 | | }, |
|---|
| 930 | | "Or": function(filter) { |
|---|
| 931 | | var node = this.createElementNSPlus("ogc:Or"); |
|---|
| 932 | | var childFilter; |
|---|
| 933 | | for(var i=0, len=filter.filters.length; i<len; ++i) { |
|---|
| 934 | | childFilter = filter.filters[i]; |
|---|
| 935 | | this.writeNode( |
|---|
| 936 | | node, this.getFilterType(childFilter), childFilter |
|---|
| 937 | | ); |
|---|
| 938 | | } |
|---|
| 939 | | return node; |
|---|
| 940 | | }, |
|---|
| 941 | | "Not": function(filter) { |
|---|
| 942 | | var node = this.createElementNSPlus("ogc:Not"); |
|---|
| 943 | | var childFilter = filter.filters[0]; |
|---|
| 944 | | this.writeNode( |
|---|
| 945 | | node, this.getFilterType(childFilter), childFilter |
|---|
| 946 | | ); |
|---|
| 947 | | return node; |
|---|
| 948 | | }, |
|---|
| 949 | | "PropertyIsEqualTo": function(filter) { |
|---|
| 950 | | var node = this.createElementNSPlus("ogc:PropertyIsEqualTo"); |
|---|
| 951 | | // no ogc:expression handling for now |
|---|
| 952 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 953 | | this.writeNode(node, "Literal", filter.value); |
|---|
| 954 | | return node; |
|---|
| 955 | | }, |
|---|
| 956 | | "PropertyIsNotEqualTo": function(filter) { |
|---|
| 957 | | var node = this.createElementNSPlus("ogc:PropertyIsNotEqualTo"); |
|---|
| 958 | | // no ogc:expression handling for now |
|---|
| 959 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 960 | | this.writeNode(node, "Literal", filter.value); |
|---|
| 961 | | return node; |
|---|
| 962 | | }, |
|---|
| 963 | | "PropertyIsLessThan": function(filter) { |
|---|
| 964 | | var node = this.createElementNSPlus("ogc:PropertyIsLessThan"); |
|---|
| 965 | | // no ogc:expression handling for now |
|---|
| 966 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 967 | | this.writeNode(node, "Literal", filter.value); |
|---|
| 968 | | return node; |
|---|
| 969 | | }, |
|---|
| 970 | | "PropertyIsGreaterThan": function(filter) { |
|---|
| 971 | | var node = this.createElementNSPlus("ogc:PropertyIsGreaterThan"); |
|---|
| 972 | | // no ogc:expression handling for now |
|---|
| 973 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 974 | | this.writeNode(node, "Literal", filter.value); |
|---|
| 975 | | return node; |
|---|
| 976 | | }, |
|---|
| 977 | | "PropertyIsLessThanOrEqualTo": function(filter) { |
|---|
| 978 | | var node = this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo"); |
|---|
| 979 | | // no ogc:expression handling for now |
|---|
| 980 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 981 | | this.writeNode(node, "Literal", filter.value); |
|---|
| 982 | | return node; |
|---|
| 983 | | }, |
|---|
| 984 | | "PropertyIsGreaterThanOrEqualTo": function(filter) { |
|---|
| 985 | | var node = this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo"); |
|---|
| 986 | | // no ogc:expression handling for now |
|---|
| 987 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 988 | | this.writeNode(node, "Literal", filter.value); |
|---|
| 989 | | return node; |
|---|
| 990 | | }, |
|---|
| 991 | | "PropertyIsBetween": function(filter) { |
|---|
| 992 | | var node = this.createElementNSPlus("ogc:PropertyIsBetween"); |
|---|
| 993 | | // no ogc:expression handling for now |
|---|
| 994 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 995 | | this.writeNode(node, "LowerBoundary", filter); |
|---|
| 996 | | this.writeNode(node, "UpperBoundary", filter); |
|---|
| 997 | | return node; |
|---|
| 998 | | }, |
|---|
| 999 | | "PropertyIsLike": function(filter) { |
|---|
| 1000 | | var node = this.createElementNSPlus("ogc:PropertyIsLike", { |
|---|
| 1001 | | attributes: { |
|---|
| 1002 | | wildCard: "*", singleChar: ".", escape: "!" |
|---|
| 1003 | | } |
|---|
| 1004 | | }); |
|---|
| 1005 | | // no ogc:expression handling for now |
|---|
| 1006 | | this.writeNode(node, "PropertyName", filter); |
|---|
| 1007 | | // convert regex string to ogc string |
|---|
| 1008 | | this.writeNode(node, "Literal", filter.regex2value()); |
|---|
| 1009 | | return node; |
|---|
| 1010 | | }, |
|---|
| 1011 | | "PropertyName": function(filter) { |
|---|
| 1012 | | // no ogc:expression handling for now |
|---|
| 1013 | | return this.createElementNSPlus("ogc:PropertyName", { |
|---|
| 1014 | | value: filter.property |
|---|
| 1015 | | }); |
|---|
| 1016 | | }, |
|---|
| 1017 | | "Literal": function(value) { |
|---|
| 1018 | | // no ogc:expression handling for now |
|---|
| 1019 | | return this.createElementNSPlus("ogc:Literal", { |
|---|
| 1020 | | value: value |
|---|
| 1021 | | }); |
|---|
| 1022 | | }, |
|---|
| 1023 | | "LowerBoundary": function(filter) { |
|---|
| 1024 | | // no ogc:expression handling for now |
|---|
| 1025 | | var node = this.createElementNSPlus("ogc:LowerBoundary"); |
|---|
| 1026 | | this.writeNode(node, "Literal", filter.lowerBoundary); |
|---|
| 1027 | | return node; |
|---|
| 1028 | | }, |
|---|
| 1029 | | "UpperBoundary": function(filter) { |
|---|
| 1030 | | // no ogc:expression handling for now |
|---|
| 1031 | | var node = this.createElementNSPlus("ogc:UpperBoundary"); |
|---|
| 1032 | | this.writeNode(node, "Literal", filter.upperBoundary); |
|---|
| 1033 | | return node; |
|---|
| 1034 | | } |
|---|
| 1035 | | } |
|---|
| 1036 | | }, |
|---|
| 1037 | | |
|---|
| 1038 | | /** |
|---|
| 1039 | | * Method: getFilterType |
|---|
| 1040 | | */ |
|---|
| 1041 | | getFilterType: function(filter) { |
|---|
| 1042 | | var filterType = this.filterMap[filter.type]; |
|---|
| 1043 | | if(!filterType) { |
|---|
| 1044 | | throw "SLD writing not supported for rule type: " + filter.type; |
|---|
| 1045 | | } |
|---|
| 1046 | | return filterType; |
|---|
| 1047 | | }, |
|---|
| 1048 | | |
|---|
| 1049 | | /** |
|---|
| 1050 | | * Property: filterMap |
|---|
| 1051 | | * {Object} Contains a member for each filter type. Values are node names |
|---|
| 1052 | | * for corresponding OGC Filter child elements. |
|---|
| 1053 | | */ |
|---|
| 1054 | | filterMap: { |
|---|
| 1055 | | "&&": "And", |
|---|
| 1056 | | "||": "Or", |
|---|
| 1057 | | "!": "Not", |
|---|
| 1058 | | "==": "PropertyIsEqualTo", |
|---|
| 1059 | | "!=": "PropertyIsNotEqualTo", |
|---|
| 1060 | | "<": "PropertyIsLessThan", |
|---|
| 1061 | | ">": "PropertyIsGreaterThan", |
|---|
| 1062 | | "<=": "PropertyIsLessThanOrEqualTo", |
|---|
| 1063 | | ">=": "PropertyIsGreaterThanOrEqualTo", |
|---|
| 1064 | | "..": "PropertyIsBetween", |
|---|
| 1065 | | "~": "PropertyIsLike" |
|---|
| 1066 | | }, |
|---|
| 1067 | | |
|---|
| 1068 | | |
|---|
| | 768 | } |
|---|
| | 769 | }, |
|---|
| | 770 | |
|---|