From 36c46e1f10b7a5ffeb983bdb83c6c387f8835e2c Mon Sep 17 00:00:00 2001 From: Seth Fitzsimmons Date: Wed, 3 Jul 2019 15:49:50 -0700 Subject: [PATCH] Attempt to fix invalid way geometries --- CHANGELOG.md | 2 ++ src/main/scala/vectorpipe/internal/package.scala | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3dea6d3..da7e4bfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adds `riverbank`, `stream_end`, `dam`, `weir`, `waterfall`, and `pressurised` to the list of waterway features - Populates `nds` and `members` for deleted elements from the previous version +- Attempt to fix invalid way geometries by buffering them (this will result in + more way geometries for certain datasets) ### Fixed diff --git a/src/main/scala/vectorpipe/internal/package.scala b/src/main/scala/vectorpipe/internal/package.scala index 44190be3..00189a36 100644 --- a/src/main/scala/vectorpipe/internal/package.scala +++ b/src/main/scala/vectorpipe/internal/package.scala @@ -5,6 +5,7 @@ import java.sql.Timestamp import org.locationtech.jts.{geom => jts} import geotrellis.vector._ import org.apache.log4j.Logger +import org.apache.spark.internal.Logging import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.encoders.RowEncoder import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema @@ -17,14 +18,12 @@ import vectorpipe.functions.asDouble import vectorpipe.functions.osm._ import vectorpipe.relations.{MultiPolygons, Routes} -package object internal { +package object internal extends Logging { val NodeType: Byte = 1 val WayType: Byte = 2 val RelationType: Byte = 3 val MultiPolygonRoles: Seq[String] = Set("", "outer", "inner").toSeq - @transient lazy val logger: Logger = Logger.getLogger(getClass) - lazy val BareElementSchema = StructType( StructField("changeset", LongType, nullable = false) :: StructField("id", LongType, nullable = false) :: @@ -332,6 +331,16 @@ package object internal { } val geometry = geom match { case Some(g) if g.isValid => g + case Some(g) if !g.isEmpty => + val buffered = g.buffer(0) + + if (buffered.isValid) { + logWarning(s"Invalid way geometry, fixed by buffering: $id@$version ($updated): $g)") + buffered + } else { + logWarning(s"Invalid way geometry: $id@$version ($updated): $g)") + null + } case _ => null } new GenericRowWithSchema(Array(changeset, id, version, updated, geometry), BareElementSchema): Row