Add split method for linestring and multilinestring geometries. Use for splitting one geometry with another. Optionally performs a mutual split. r=ahocevar (closes #1929)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@8974 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -21,6 +21,196 @@
|
||||
t.eq( mline.components.length, 1, "mline.components.length is set correctly");
|
||||
}
|
||||
|
||||
function test_split(t) {
|
||||
var wkt = OpenLayers.Geometry.fromWKT;
|
||||
|
||||
var cases = [{
|
||||
msg: "no intersection",
|
||||
g1: "MULTILINESTRING((0 0, 0 1), (2 2, 3 3))",
|
||||
g2: "MULTILINESTRING((1 0, 1 1), (2 2, 3 2))",
|
||||
exp: null
|
||||
} , {
|
||||
msg: "intersection at midpoint",
|
||||
g1: "MULTILINESTRING((0 0, 1 1))",
|
||||
g2: "MULTILINESTRING((1 0, 0 1))",
|
||||
exp: ["MULTILINESTRING((1 0, 0.5 0.5))", "MULTILINESTRING((0.5 0.5, 0 1))"]
|
||||
}, {
|
||||
msg: "intersection at midpoint (reverse source/target)",
|
||||
g1: "MULTILINESTRING((1 0, 0 1))",
|
||||
g2: "MULTILINESTRING((0 0, 1 1))",
|
||||
exp: ["MULTILINESTRING((0 0, 0.5 0.5))", "MULTILINESTRING((0.5 0.5, 1 1))"]
|
||||
}, {
|
||||
msg: "intersection at endpoint",
|
||||
g1: "MULTILINESTRING((0 0, 1 1))",
|
||||
g2: "MULTILINESTRING((1 0, 1 1))",
|
||||
exp: null
|
||||
}, {
|
||||
msg: "midpoint intersection, no options",
|
||||
g1: "MULTILINESTRING((0 0, 2 2))",
|
||||
g2: "MULTILINESTRING((0 2, 2 0))",
|
||||
exp: ["MULTILINESTRING((0 2, 1 1))", "MULTILINESTRING((1 1, 2 0))"]
|
||||
}, {
|
||||
msg: "midpoint intersection, edge false",
|
||||
opt: {edge: false},
|
||||
g1: "MULTILINESTRING((0 0, 2 2))",
|
||||
g2: "MULTILINESTRING((0 2, 2 0))",
|
||||
exp: null
|
||||
}, {
|
||||
msg: "midpoint intersection, mutual",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 0, 2 2))",
|
||||
g2: "MULTILINESTRING((0 2, 2 0))",
|
||||
exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2))"], ["MULTILINESTRING((0 2, 1 1))", "MULTILINESTRING((1 1, 2 0))"]]
|
||||
}, {
|
||||
msg: "close intersection, no tolerance",
|
||||
g1: "MULTILINESTRING((0 0, 0.9 0.9))",
|
||||
g2: "MULTILINESTRING((0 2, 2 0))",
|
||||
exp: null
|
||||
}, {
|
||||
msg: "close intersection, within tolerance",
|
||||
opt: {tolerance: 0.2},
|
||||
g1: "MULTILINESTRING((0 0, 0.9 0.9))",
|
||||
g2: "MULTILINESTRING((0 2, 2 0))",
|
||||
exp: ["MULTILINESTRING((0 2, 0.9 0.9))", "MULTILINESTRING((0.9 0.9, 2 0))"]
|
||||
}, {
|
||||
msg: "multi source, single target",
|
||||
g1: "MULTILINESTRING((0 0, 2 2))",
|
||||
g2: "LINESTRING(0 2, 2 0)",
|
||||
exp: ["LINESTRING(0 2, 1 1)", "LINESTRING(1 1, 2 0)"]
|
||||
}, {
|
||||
msg: "multi source, single target, mutual split",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 0, 2 2))",
|
||||
g2: "LINESTRING(0 2, 2 0)",
|
||||
exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2))"], ["LINESTRING(0 2, 1 1)", "LINESTRING(1 1, 2 0)"]]
|
||||
}, {
|
||||
msg: "single source, multi target",
|
||||
g1: "LINESTRING(0 2, 2 0)",
|
||||
g2: "MULTILINESTRING((0 0, 2 2))",
|
||||
exp: ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2))"]
|
||||
}, {
|
||||
msg: "partial target split",
|
||||
g1: "MULTILINESTRING((2 0, 0 2))",
|
||||
g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
|
||||
exp: ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]
|
||||
}, {
|
||||
msg: "partial target split, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((2 0, 0 2))",
|
||||
g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
|
||||
exp: [["MULTILINESTRING((2 0, 1 1))", "MULTILINESTRING((1 1, 0 2))"], ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]]
|
||||
}, {
|
||||
msg: "partial source split, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
|
||||
g2: "MULTILINESTRING((2 0, 0 2))",
|
||||
exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"], ["MULTILINESTRING((2 0, 1 1))", "MULTILINESTRING((1 1, 0 2))"]]
|
||||
}, {
|
||||
msg: "partial target split with source endpoint",
|
||||
g1: "MULTILINESTRING((1 0, 1 1))",
|
||||
g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
|
||||
exp: ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]
|
||||
}, {
|
||||
msg: "partial target split with source endpoint, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((5 5, 6 6), (1 0, 1 1))",
|
||||
g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
|
||||
exp: [[], ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]]
|
||||
}, {
|
||||
msg: "partial source split with target endpoint",
|
||||
g1: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
|
||||
g2: "MULTILINESTRING((1 0, 1 1))",
|
||||
exp: null
|
||||
}, {
|
||||
msg: "partial source split with target endpoint, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4), (5 5, 6 6))",
|
||||
g2: "MULTILINESTRING((1 0, 1 1))",
|
||||
exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4), (5 5, 6 6))"], []]
|
||||
}, {
|
||||
msg: "partial target and source split",
|
||||
g1: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
|
||||
g2: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
|
||||
exp: ["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"]
|
||||
}, {
|
||||
msg: "partial target and source split, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
|
||||
g2: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
|
||||
exp: [["MULTILINESTRING((0 5, 2 5), (4 5, 5 5))", "MULTILINESTRING((5 5, 6 5), (8 5, 10 5))"],
|
||||
["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"]]
|
||||
}, {
|
||||
msg: "partial target and source split with source endpoint, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
|
||||
g2: "MULTILINESTRING((4 0, 4 2), (4 4, 4 6), (4 8, 4 10))",
|
||||
exp: [[], ["MULTILINESTRING((4 0, 4 2), (4 4, 4 5))", "MULTILINESTRING((4 5, 4 6), (4 8, 4 10))"]]
|
||||
}, {
|
||||
msg: "partial target and source split with target endpoint, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((4 0, 4 2), (4 4, 4 6), (4 8, 4 10))",
|
||||
g2: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
|
||||
exp: [["MULTILINESTRING((4 0, 4 2), (4 4, 4 5))", "MULTILINESTRING((4 5, 4 6), (4 8, 4 10))"], []]
|
||||
}, {
|
||||
msg: "partial target and source split with source vertex, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((0 5, 2 5), (4 5, 5 5, 6 5), (8 5, 10 5))",
|
||||
g2: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
|
||||
exp: [["MULTILINESTRING((0 5, 2 5), (4 5, 5 5))", "MULTILINESTRING((5 5, 6 5), (8 5, 10 5))"], ["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"]]
|
||||
}, {
|
||||
msg: "partial target and source split with target vertex, mutual true",
|
||||
opt: {mutual: true},
|
||||
g1: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
|
||||
g2: "MULTILINESTRING((0 5, 2 5), (4 5, 5 5, 6 5), (8 5, 10 5))",
|
||||
exp: [["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"], ["MULTILINESTRING((0 5, 2 5), (4 5, 5 5))", "MULTILINESTRING((5 5, 6 5), (8 5, 10 5))"]]
|
||||
}];
|
||||
|
||||
|
||||
t.plan(cases.length);
|
||||
var c, parts, part, midparts;
|
||||
for(var i=0; i<cases.length; ++i) {
|
||||
c = cases[i];
|
||||
var g1 = wkt(c.g1);
|
||||
var g2 = wkt(c.g2);
|
||||
var got = g1.split(g2, c.opt);
|
||||
var exp = c.exp;
|
||||
if(got instanceof Array) {
|
||||
parts = [];
|
||||
for(var j=0; j<got.length; ++j) {
|
||||
part = got[j];
|
||||
if(part instanceof Array) {
|
||||
midparts = [];
|
||||
for(var k=0; k<part.length; ++k) {
|
||||
midparts.push(part[k].toString());
|
||||
}
|
||||
parts.push("[" + midparts.join(", ") + "]");
|
||||
} else {
|
||||
parts.push(got[j].toString());
|
||||
}
|
||||
}
|
||||
got = parts.join(", ");
|
||||
}
|
||||
if(exp instanceof Array) {
|
||||
parts = [];
|
||||
for(var j=0; j<exp.length; ++j) {
|
||||
part = exp[j];
|
||||
if(part instanceof Array) {
|
||||
midparts = [];
|
||||
for(var k=0; k<part.length; ++k) {
|
||||
midparts.push(wkt(part[k]).toString());
|
||||
}
|
||||
parts.push("[" + midparts.join(", ") + "]");
|
||||
} else {
|
||||
parts.push(wkt(exp[j]).toString());
|
||||
}
|
||||
}
|
||||
exp = parts.join(", ");
|
||||
}
|
||||
t.eq(got, exp, "case " + i + ": " + c.msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function test_getVertices(t) {
|
||||
t.plan(22);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user