Adding support for reading and writing spatial filters with Within, Contains, and Intersects elements. Thanks pvalsecc for the original patch. r=ahocevar (closes #1959)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@8921 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -24,6 +24,8 @@ OpenLayers.Filter.Spatial = OpenLayers.Class(OpenLayers.Filter, {
|
||||
* - OpenLayers.Filter.Spatial.BBOX
|
||||
* - OpenLayers.Filter.Spatial.INTERSECTS
|
||||
* - OpenLayers.Filter.Spatial.DWITHIN
|
||||
* - OpenLayers.Filter.Spatial.WITHIN
|
||||
* - OpenLayers.Filter.Spatial.CONTAINS
|
||||
*/
|
||||
type: null,
|
||||
|
||||
@@ -107,3 +109,5 @@ OpenLayers.Filter.Spatial = OpenLayers.Class(OpenLayers.Filter, {
|
||||
OpenLayers.Filter.Spatial.BBOX = "BBOX";
|
||||
OpenLayers.Filter.Spatial.INTERSECTS = "INTERSECTS";
|
||||
OpenLayers.Filter.Spatial.DWITHIN = "DWITHIN";
|
||||
OpenLayers.Filter.Spatial.WITHIN = "WITHIN";
|
||||
OpenLayers.Filter.Spatial.CONTAINS = "CONTAINS";
|
||||
|
||||
@@ -178,11 +178,49 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
},
|
||||
"UpperBoundary": function(node, filter) {
|
||||
filter.upperBoundary = this.readOgcExpression(node);
|
||||
},
|
||||
"Intersects": function(node, obj) {
|
||||
this.readSpatial(node, obj, OpenLayers.Filter.Spatial.INTERSECTS);
|
||||
},
|
||||
"Within": function(node, obj) {
|
||||
this.readSpatial(node, obj, OpenLayers.Filter.Spatial.WITHIN);
|
||||
},
|
||||
"Contains": function(node, obj) {
|
||||
this.readSpatial(node, obj, OpenLayers.Filter.Spatial.CONTAINS);
|
||||
},
|
||||
"DWithin": function(node, obj) {
|
||||
this.readSpatial(node, obj, OpenLayers.Filter.Spatial.DWITHIN);
|
||||
},
|
||||
"Distance": function(node, obj) {
|
||||
obj.distance = parseInt(this.getChildValue(node));
|
||||
obj.distanceUnits = node.getAttribute("units");
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: readSpatial
|
||||
*
|
||||
* Read a {<OpenLayers.Filter.Spatial>} filter.
|
||||
*
|
||||
* Parameters:
|
||||
* node - {DOMElement} A DOM element that contains an ogc:expression.
|
||||
* obj - {Object} The target object.
|
||||
* type - {String} One of the OpenLayers.Filter.Spatial.* constants.
|
||||
*
|
||||
* Returns:
|
||||
* {<OpenLayers.Filter.Spatial>} The created filter.
|
||||
*/
|
||||
readSpatial: function(node, obj, type) {
|
||||
var filter = new OpenLayers.Filter.Spatial({
|
||||
type: type
|
||||
});
|
||||
this.readChildNodes(node, filter);
|
||||
filter.value = filter.components[0];
|
||||
delete filter.components;
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: readOgcExpression
|
||||
* Limited support for OGC expressions.
|
||||
@@ -343,29 +381,31 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
this.writeNode("Literal", filter.upperBoundary, node);
|
||||
return node;
|
||||
},
|
||||
"INTERSECTS": function(filter) {
|
||||
return this.writeSpatial(filter, "Intersects");
|
||||
},
|
||||
"WITHIN": function(filter) {
|
||||
return this.writeSpatial(filter, "Within");
|
||||
},
|
||||
"CONTAINS": function(filter) {
|
||||
return this.writeSpatial(filter, "Contains");
|
||||
},
|
||||
"DWITHIN": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:DWithin");
|
||||
this.writeNode("PropertyName", filter, node);
|
||||
var child = this.writeNode("feature:_geometry", filter.value);
|
||||
node.appendChild(child.firstChild);
|
||||
var node = this.writeSpatial(filter, "DWithin");
|
||||
this.writeNode("Distance", filter, node);
|
||||
return node;
|
||||
},
|
||||
"INTERSECTS": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:Intersects");
|
||||
this.writeNode("PropertyName", filter, node);
|
||||
var child = this.writeNode("feature:_geometry", filter.value);
|
||||
node.appendChild(child.firstChild);
|
||||
return node;
|
||||
},
|
||||
"Distance": function(filter) {
|
||||
return this.createElementNSPlus("ogc:Distance",
|
||||
{attributes: {units: filter.distanceUnits},
|
||||
value: filter.distance});
|
||||
return this.createElementNSPlus("ogc:Distance", {
|
||||
attributes: {
|
||||
units: filter.distanceUnits
|
||||
},
|
||||
value: filter.distance
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Method: getFilterType
|
||||
*/
|
||||
@@ -396,6 +436,8 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
"~": "PropertyIsLike",
|
||||
"BBOX": "BBOX",
|
||||
"DWITHIN": "DWITHIN",
|
||||
"WITHIN": "WITHIN",
|
||||
"CONTAINS": "CONTAINS",
|
||||
"INTERSECTS": "INTERSECTS"
|
||||
},
|
||||
|
||||
|
||||
@@ -111,6 +111,35 @@ OpenLayers.Format.Filter.v1_0_0 = OpenLayers.Class(
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: writeSpatial
|
||||
*
|
||||
* Read a {<OpenLayers.Filter.Spatial>} filter and converts it into XML.
|
||||
*
|
||||
* Parameters:
|
||||
* filter - {<OpenLayers.Filter.Spatial>} The filter.
|
||||
* name - {String} Name of the generated XML element.
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} The created XML element.
|
||||
*/
|
||||
writeSpatial: function(filter, name) {
|
||||
var node = this.createElementNSPlus("ogc:"+name);
|
||||
this.writeNode("PropertyName", filter, node);
|
||||
var child;
|
||||
if(filter.value instanceof OpenLayers.Geometry) {
|
||||
child = this.writeNode("feature:_geometry", filter.value).firstChild;
|
||||
} else {
|
||||
child = this.writeNode("gml:Box", filter.value);
|
||||
}
|
||||
if(filter.projection) {
|
||||
child.setAttribute("srsName", filter.projection);
|
||||
}
|
||||
node.appendChild(child);
|
||||
return node;
|
||||
},
|
||||
|
||||
|
||||
CLASS_NAME: "OpenLayers.Format.Filter.v1_0_0"
|
||||
|
||||
});
|
||||
@@ -125,6 +125,34 @@ OpenLayers.Format.Filter.v1_1_0 = OpenLayers.Class(
|
||||
"feature": OpenLayers.Format.GML.v3.prototype.writers["feature"]
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: writeSpatial
|
||||
*
|
||||
* Read a {<OpenLayers.Filter.Spatial>} filter and converts it into XML.
|
||||
*
|
||||
* Parameters:
|
||||
* filter - {<OpenLayers.Filter.Spatial>} The filter.
|
||||
* name - {String} Name of the generated XML element.
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} The created XML element.
|
||||
*/
|
||||
writeSpatial: function(filter, name) {
|
||||
var node = this.createElementNSPlus("ogc:"+name);
|
||||
this.writeNode("PropertyName", filter, node);
|
||||
var child;
|
||||
if(filter.value instanceof OpenLayers.Geometry) {
|
||||
child = this.writeNode("feature:_geometry", filter.value).firstChild;
|
||||
} else {
|
||||
child = this.writeNode("gml:Envelope", filter.value);
|
||||
}
|
||||
if(filter.projection) {
|
||||
child.setAttribute("srsName", filter.projection);
|
||||
}
|
||||
node.appendChild(child);
|
||||
return node;
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Format.Filter.v1_1_0"
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user