diff --git a/doc/api/geom/geometry.rst b/doc/api/geom/geometry.rst index a347ac1..a1922f7 100644 --- a/doc/api/geom/geometry.rst +++ b/doc/api/geom/geometry.rst @@ -99,6 +99,14 @@ Common Geometry Methods Construct a geometry that buffers this geometry by the given width. +.. function:: Geometry.variableBuffer + + :arg distances: ``Array`` An array of distances. + + :returns: :class:`geom.Geometry` + + Construct a geometry that buffers this geometry with an array of distances. + .. function:: Geometry.clone :returns: :class:`geom.Geometry` diff --git a/src/main/java/org/geoscript/js/geom/Geometry.java b/src/main/java/org/geoscript/js/geom/Geometry.java index 61bb04d..35bb87e 100644 --- a/src/main/java/org/geoscript/js/geom/Geometry.java +++ b/src/main/java/org/geoscript/js/geom/Geometry.java @@ -34,6 +34,7 @@ import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.operation.buffer.VariableBuffer; import org.locationtech.jts.operation.buffer.BufferOp; import org.locationtech.jts.operation.buffer.BufferParameters; import org.locationtech.jts.triangulate.VoronoiDiagramBuilder; @@ -257,6 +258,21 @@ public Geometry buffer(double distance, NativeObject options) { return wrapped; } + @JSFunction + public Geometry variableBuffer(NativeArray distances) { + if (distances.size() == 2) { + return (Geometry) GeometryWrapper.wrap(getParentScope(), VariableBuffer.buffer(getGeometry(), getDouble(distances.get(0)), getDouble(distances.get(1)))); + } else if (distances.size() == 3) { + return (Geometry) GeometryWrapper.wrap(getParentScope(), VariableBuffer.buffer(getGeometry(), getDouble(distances.get(0)), getDouble(distances.get(1)), getDouble(distances.get(2)))); + } else { + return (Geometry) GeometryWrapper.wrap(getParentScope(), VariableBuffer.buffer(getGeometry(), distances.stream().mapToDouble(d -> getDouble(d)).toArray())); + } + } + + private double getDouble(Object obj) { + return ((Number) obj).doubleValue(); + } + @JSGetter public Projection getProjection() { return projection; diff --git a/src/test/resources/org/geoscript/js/tests/geoscript/test_geom.js b/src/test/resources/org/geoscript/js/tests/geoscript/test_geom.js index 5cbbf78..769a387 100644 --- a/src/test/resources/org/geoscript/js/tests/geoscript/test_geom.js +++ b/src/test/resources/org/geoscript/js/tests/geoscript/test_geom.js @@ -22,7 +22,7 @@ exports["test: create(point)"] = function() { exports["test: create(linestring)"] = function() { var type = "LineString"; - var coordinates = [[0, 1], [1, 2]]; + var coordinates = [[0, 1], [1, 2]]; var o, g; // create a linestring @@ -196,6 +196,19 @@ exports["test: create non-conforming delaunay triangles"] = function() { } +exports["test: variable buffer"] = function() { + + var geom = new GEOM.LineString([[1,2], [10,20], [30,50], [100, 150]]); + var buffer = geom.variableBuffer([10,50]) + ASSERT.ok(buffer instanceof GEOM.Polygon) + + buffer = geom.variableBuffer([10, 20, 50]) + ASSERT.ok(buffer instanceof GEOM.Polygon) + + buffer = geom.variableBuffer([10, 20, 50, 75]) + ASSERT.ok(buffer instanceof GEOM.Polygon) + +} exports["test: Point"] = require("./geom/test_point"); exports["test: LineString"] = require("./geom/test_linestring");