[OpenLayers-Dev] removeComponent from LinearRing seems to remove too much points
Fabian Patzke 2
listensammler at patzi.de
Wed Nov 28 02:05:00 PST 2012
Hi,
yesterday I stumbled over a problem while writing a function to remove
points from geometries. When I want to remove a point from a LinearRing that
I created with 3 points (the ring will automatically have 4 points to be
closed) I can remove one of them because of the conditions in
OpenLayers.Geometry.LinearRing. Afterwards the LinearRing only consists of 2
individual points (actual 3) and is no longer a ring.
LinearRing states at the moment:
removeComponent: function(point) {
var removed = this.components && (this.components.length > 3);
if (removed) {
...
But it must be:
removeComponent: function(point) {
var removed = this.components && (this.components.length > 3);
if (removed) {
...
Also there seems to be a bug in the way what is returned by
OpenLayers.Geometry.Collection.removeComponent. It doesn't not really return
if a component existed in that Collection and could really me removed. It
just returns true.
But when it is written like this it returns the correct boolean:
removeComponent: function(component) {
var length = this.components.length;
OpenLayers.Util.removeItem(this.components, component);
if (length != this.components.length) {
// clearBounds() so that it gets recalculated on the next call
// to this.getBounds();
this.clearBounds();
return true;
}
return false;
},
I hope you can follow me, if wanted I can create tickets and patch files.
Providing that everything I have written is correct.
So the following (jasmine-1.2.0 test) should be correct, at the moment it
wouldn't work.
describe("OpenLayers.Geometry.LinearRing.removeComponent", function() {
it("3 point ring", function() {
var point1 = new OpenLayers.Geometry.Point(1.0, 1.0);
var point2 = new OpenLayers.Geometry.Point(1.0, 2.0);
var point3 = new OpenLayers.Geometry.Point(2.0, 2.0);
var ring = new OpenLayers.Geometry.LinearRing([ point1, point2,
point3 ]);
var clone = ring.clone();
expect(clone.equals(ring)).toBe(true);
var removed = clone.removeComponent(clone.components[0]);
expect(removed).toBe(false);
expect(clone.equals(ring)).toBe(true);
});
it("4 point ring", function() {
var point1 = new OpenLayers.Geometry.Point(1.0, 1.0);
var point2 = new OpenLayers.Geometry.Point(1.0, 2.0);
var point3 = new OpenLayers.Geometry.Point(2.0, 2.0);
var point4 = new OpenLayers.Geometry.Point(2.0, 1.0);
var ring = new OpenLayers.Geometry.LinearRing([ point1, point2,
point3, point4 ]);
var clone = ring.clone();
expect(clone.equals(ring)).toBe(true);
var expectedResult = new OpenLayers.Geometry.LinearRing([ point2,
point3, point4 ]);
expect(clone.equals(expectedResult)).toBe(false);
var removed = clone.removeComponent(clone.components[0]);
expect(removed).toBe(true);
expect(clone.equals(ring)).toBe(false);
expect(clone.equals(expectedResult)).toBe(true);
});
it("remove non existend point", function() {
var point1 = new OpenLayers.Geometry.Point(1.0, 1.0);
var point2 = new OpenLayers.Geometry.Point(1.0, 2.0);
var point3 = new OpenLayers.Geometry.Point(2.0, 2.0);
var point4 = new OpenLayers.Geometry.Point(2.0, 1.0);
var ring = new OpenLayers.Geometry.LinearRing([ point1, point2,
point3, point4 ]);
var clone = ring.clone();
expect(clone.equals(ring)).toBe(true);
var removed = clone.removeComponent(new
OpenLayers.Geometry.Point(7.0, 7.0));
expect(removed).toBe(false);
expect(clone.equals(ring)).toBe(true);
});
});
--
View this message in context: http://osgeo-org.1560.n6.nabble.com/removeComponent-from-LinearRing-seems-to-remove-too-much-points-tp5019251.html
Sent from the OpenLayers Dev mailing list archive at Nabble.com.
More information about the Dev
mailing list