diff --git a/geoscript/geom/__init__.py b/geoscript/geom/__init__.py index 85ce441..8610d3d 100644 --- a/geoscript/geom/__init__.py +++ b/geoscript/geom/__init__.py @@ -11,7 +11,7 @@ from compoundring import CompoundRing from bounds import Bounds from geom import Geometry -from geom import prepare, simplify, densify, transform, buffer, delaunay, voronoi, randomPoints, createSierpinskiCarpet +from geom import prepare, simplify, densify, transform, buffer, delaunay, voronoi, randomPoints, createSierpinskiCarpet, variableBuffer from io.wkt import readWKT, writeWKT, fromWKT from io.wkb import readWKB, writeWKB, fromWKB, toWKB from io.json import writeJSON, readJSON diff --git a/geoscript/geom/geom.py b/geoscript/geom/geom.py index be8542a..68a658d 100644 --- a/geoscript/geom/geom.py +++ b/geoscript/geom/geom.py @@ -16,6 +16,7 @@ from org.geotools.referencing.operation.transform import AffineTransform2D from org.locationtech.jts.shape.random import RandomPointsBuilder from org.locationtech.jts.shape.fractal import SierpinskiCarpetBuilder +from org.locationtech.jts.operation.buffer import VariableBuffer from geoscript.geom.bounds import Bounds _factory = GeometryFactory() @@ -155,6 +156,21 @@ def buffer(g, distance, singleSided=False): return BufferOp.bufferOp(g, distance, bp) +def variableBuffer(g, distances): + """ + Computes a buffer with variable distances. + + *g* is the :class:`Geometry ` to buffer. + + *distances* is an array of buffer distances + """ + if len(distances) == 2: + return VariableBuffer.buffer(g, distances[0], distances[1]) + elif len(distances) == 3: + return VariableBuffer.buffer(g, distances[0], distances[1], distances[2]) + else: + return VariableBuffer.buffer(g, distances) + def randomPoints(g, number): """ Create a number of random Points within the given Geometry diff --git a/tests/test_geom.py b/tests/test_geom.py index 496a877..cd798a6 100644 --- a/tests/test_geom.py +++ b/tests/test_geom.py @@ -236,3 +236,14 @@ def testCreateSierpinskiCarpet(self): bounds = geom.Bounds(-180,-90,180,90) sierpinskiCarpet = geom.createSierpinskiCarpet(bounds, 50) assert sierpinskiCarpet.getNumGeometries() > 0 + + def testVariableBuffer(self): + line = geom.LineString((1,2), (10,20), (30,50), (100, 150)) + buffer = geom.variableBuffer(line, [10,50]) + assert str(buffer).startswith("POLYGON") + + buffer = geom.variableBuffer(line, [10, 20, 50]) + assert str(buffer).startswith("POLYGON") + + buffer = geom.variableBuffer(line, [10, 20, 50, 75]) + assert str(buffer).startswith("POLYGON")