Skip to content

Commit

Permalink
bufferstyleparameters is a string
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Sparing committed Jan 21, 2024
1 parent b03d85a commit 7704f2d
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ test_that("scalar vector functions behave as intended", {
sdf <- mutate(sdf, "st_length" = st_length(wkt))
sdf <- mutate(sdf, "st_perimeter" = st_perimeter(wkt))
sdf <- mutate(sdf, "st_buffer" = st_buffer(wkt, as.double(1.1)))
sdf <- mutate(sdf, "st_buffer_optparams" = st_buffer(wkt, as.double(1.1), "endcap=square quad_segs=2"))
sdf <- mutate(sdf, "st_bufferloop" = st_bufferloop(wkt, as.double(1.1), as.double(1.2)))
sdf <- mutate(sdf, "st_convexhull" = st_convexhull(wkt))
sdf <- mutate(sdf, "st_dump" = st_dump(wkt))
Expand Down
21 changes: 9 additions & 12 deletions python/mosaic/api/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,7 @@ def st_concavehull(geom: ColumnOrName, concavity: ColumnOrName, has_holes: Any =
def st_buffer(
geom: ColumnOrName,
radius: ColumnOrName,
quadrant_segments: Any = 8,
end_cap_style: Any = "round",
buffer_style_parameters: Any = "",
) -> Column:
"""
Compute the buffered geometry based on geom and radius.
Expand All @@ -209,10 +208,11 @@ def st_buffer(
The input geometry
radius : Column
The radius of buffering
quadrant_segments : Column
Number of line segments used to approximate a quarter circle (default is 8)
end_cap_style : Column
The end cap style ("round"(default)|"flat"|"square")
buffer_style_parameters : Column
"quad_segs=# endcap=round|flat|square" where "#" is the number of line segments used to
approximate a quarter circle (default is 8); and endcap style for line features is one of
listed (default="round")
Returns
-------
Expand All @@ -221,17 +221,14 @@ def st_buffer(
"""

if isinstance(quadrant_segments, int):
quadrant_segments = lit(quadrant_segments)
if isinstance(end_cap_style, str):
end_cap_style = lit(end_cap_style)
if isinstance(buffer_style_parameters, str):
buffer_style_parameters = lit(buffer_style_parameters)

return config.mosaic_context.invoke_function(
"st_buffer",
pyspark_to_java_column(geom),
pyspark_to_java_column(radius),
pyspark_to_java_column(quadrant_segments),
pyspark_to_java_column(end_cap_style),
pyspark_to_java_column(buffer_style_parameters),
)


Expand Down
4 changes: 4 additions & 0 deletions python/test/test_vector_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ def test_st_bindings_happy_flow(self):
df.withColumn("st_area", api.st_area("wkt"))
.withColumn("st_length", api.st_length("wkt"))
.withColumn("st_buffer", api.st_buffer("wkt", lit(1.1)))
.withColumn(
"st_buffer_optparams",
api.st_buffer("wkt", lit(1.1), lit("endcap=square quad_segs=2"))),
)
.withColumn("st_buffer", api.st_bufferloop("wkt", lit(1.1), lit(1.2)))
.withColumn("st_perimeter", api.st_perimeter("wkt"))
.withColumn("st_convexhull", api.st_convexhull("wkt"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ trait MosaicGeometry extends GeometryWriter with Serializable {

def boundary: MosaicGeometry

def buffer(distance: Double): MosaicGeometry
def buffer(distance: Double, bufferStyleParameters: String = ""): MosaicGeometry

def bufferCapStyle(distance: Double, capStyle: String): MosaicGeometry

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,20 @@ import org.apache.spark.sql.types.DataType
* Expression containing the geometry.
* @param radiusExpr
* The radius of the buffer.
* @param bufferStyleParameters
* 'quad_segs=# endcap=round|flat|square' where "#" is the number of line segments used to
* approximate a quarter circle (default is 8); and endcap style for line features is one of
* listed (default="round")
* @param expressionConfig
* Mosaic execution context, e.g. geometryAPI, indexSystem, etc. Additional
* arguments for the expression (expressionConfigs).
*/
case class ST_Buffer(
inputGeom: Expression,
radiusExpr: Expression,
bufferStyleParametersExpr: Expression,
expressionConfig: MosaicExpressionConfig
) extends UnaryVector1ArgExpression[ST_Buffer](inputGeom, radiusExpr, returnsGeometry = true, expressionConfig) {
) extends UnaryVector2ArgExpression[ST_Buffer](inputGeom, radiusExpr, bufferStyleParametersExpr, returnsGeometry = true, expressionConfig) {

override def dataType: DataType = inputGeom.dataType

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -548,9 +548,13 @@ class MosaicContext(indexSystem: IndexSystem, geometryAPI: GeometryAPI) extends
def flatten_polygons(geom: Column): Column = ColumnAdapter(FlattenPolygons(geom.expr, geometryAPI.name))
def st_area(geom: Column): Column = ColumnAdapter(ST_Area(geom.expr, expressionConfig))
def st_buffer(geom: Column, radius: Column): Column =
ColumnAdapter(ST_Buffer(geom.expr, radius.cast("double").expr, expressionConfig))
st_buffer(geom, radius, lit(""))
def st_buffer(geom: Column, radius: Double): Column =
ColumnAdapter(ST_Buffer(geom.expr, lit(radius).cast("double").expr, expressionConfig))
st_buffer(geom, lit(radius), lit(""))
def st_buffer(geom: Column, radius: Column, buffer_style_parameters: Column): Column =
ColumnAdapter(ST_Buffer(geom.expr, radius.cast("double").expr, buffer_style_parameters.cast("string").expr, expressionConfig))
def st_buffer(geom: Column, radius: Double, buffer_style_parameters: Column): Column =
ColumnAdapter(ST_Buffer(geom.expr, lit(radius).cast("double").expr, lit(buffer_style_parameters).cast("string").expr, expressionConfig))
def st_bufferloop(geom: Column, r1: Column, r2: Column): Column =
ColumnAdapter(ST_BufferLoop(geom.expr, r1.cast("double").expr, r2.cast("double").expr, expressionConfig))
def st_bufferloop(geom: Column, r1: Double, r2: Double): Column =
Expand Down
Loading

0 comments on commit 7704f2d

Please sign in to comment.