Skip to content

Commit

Permalink
conforming triangulation appears to be working
Browse files Browse the repository at this point in the history
  • Loading branch information
sllynn committed Jul 15, 2024
1 parent 3752a33 commit 9b13f08
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.databricks.labs.mosaic.core.geometry.api.GeometryAPI
import com.databricks.labs.mosaic.core.geometry.linestring.MosaicLineString
import com.databricks.labs.mosaic.core.geometry.multilinestring.MosaicMultiLineString
import com.databricks.labs.mosaic.core.geometry.multipoint.MosaicMultiPoint
import com.databricks.labs.mosaic.core.geometry.point.MosaicPoint
import com.databricks.labs.mosaic.core.types.model.GeometryTypeEnum.{MULTIPOINT, POINT}
import com.databricks.labs.mosaic.expressions.base.{GenericExpressionFactory, WithExpressionInfo}
import com.databricks.labs.mosaic.expressions.geometry.base.VectorExpression
Expand Down Expand Up @@ -49,10 +50,29 @@ case class ST_Triangulate (
.eval(input)
.asInstanceOf[ArrayData]
.toObjectArray(firstElementType)
.map(geometryAPI.geometry(_, firstElementType))
.map({
obj =>
val g = geometryAPI.geometry(obj, firstElementType)
g.getGeometryType.toUpperCase(Locale.ROOT) match {
case "POINT" => g.asInstanceOf[MosaicPoint]
case _ => throw new UnsupportedOperationException("ST_Triangulate requires Point geometry as masspoints input")
}
})

val multiPointGeom = geometryAPI.fromSeq(pointsGeom, MULTIPOINT).asInstanceOf[MosaicMultiPoint]
val linesGeom = inputLinesArray.eval(input).asInstanceOf[ArrayData].toObjectArray(secondElementType).map(geometryAPI.geometry(_, secondElementType).asInstanceOf[MosaicLineString])
val linesGeom =
inputLinesArray
.eval(input)
.asInstanceOf[ArrayData]
.toObjectArray(secondElementType)
.map({
obj =>
val g = geometryAPI.geometry(obj, secondElementType)
g.getGeometryType.toUpperCase(Locale.ROOT) match {
case "LINESTRING" => g.asInstanceOf[MosaicLineString]
case _ => throw new UnsupportedOperationException("ST_Triangulate requires LINESTRING geometry as breakline input")
}
})

val triangles = multiPointGeom.triangulate(linesGeom, inputTolerance.eval(input).asInstanceOf[Double])

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,30 @@ trait ST_TriangulateBehaviours extends QueryTest {

}

def conformingTriangulateBehavior(indexSystem: IndexSystem, geometryAPI: GeometryAPI): Unit = {

val mc = mosaicContext
import mc.functions._
val sc = spark
import sc.implicits._
mc.register(spark)

val pointsPath = "src/test/resources/binary/elevation/sd46_dtm_point.shp"
val linesPath = "src/test/resources/binary/elevation/sd46_dtm_breakline.shp"
val points = MosaicContext.read.option("asWKB", "true").format("multi_read_ogr").load(pointsPath)
val breaklines = MosaicContext.read.option("asWKB", "true").format("multi_read_ogr").load(linesPath)
val linesDf = breaklines
.where(st_geometrytype($"geom_0") === "LINESTRING")
.groupBy()
.agg(collect_list($"geom_0").as("breaklines"))
val result = points
.groupBy()
.agg(collect_list($"geom_0").as("masspoints"))
.crossJoin(linesDf)
.withColumn("mesh", st_triangulate($"masspoints", $"breaklines", lit(0.01)))
.drop($"masspoints", $"breaklines")
noException should be thrownBy result.collect()

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ import org.apache.spark.sql.test.SharedSparkSession

class ST_TriangulateTest extends QueryTest with SharedSparkSession with ST_TriangulateBehaviours {
test("Testing ST_Triangulate (H3, JTS) to produce unconstrained triangulation") { simpleTriangulateBehavior(H3IndexSystem, JTS)}
test("Testing ST_Triangulate (H3, JTS) to produce conforming triangulation") { conformingTriangulateBehavior(H3IndexSystem, JTS)}

}

0 comments on commit 9b13f08

Please sign in to comment.