Skip to content

Commit

Permalink
Added method extensions
Browse files Browse the repository at this point in the history
Signed-off-by: jpolchlo <jpolchlopek@azavea.com>
  • Loading branch information
jpolchlo authored and echeipesh committed May 11, 2017
1 parent 07ab00e commit afcb399
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ import geotrellis.util.MethodExtensions
import geotrellis.vector.Point

trait EuclideanDistanceTileArrayMethods extends MethodExtensions[Array[Point]] {
@deprecated("call euclideanDistanceTile() on Array[Coordinate] instead", "1.2")
def euclideanDistanceTile(rasterExtent: RasterExtent): Tile = { EuclideanDistanceTile(self, rasterExtent) }
}

trait EuclideanDistanceTileMethods extends MethodExtensions[Traversable[Point]] {
@deprecated("call euclideanDistanceTile() on Traversable[Coordinate] instead", "1.2")
def euclideanDistanceTile(rasterExtent: RasterExtent): Tile = { EuclideanDistanceTile(self.toArray, rasterExtent) }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,7 @@ object EuclideanDistance {
}

def neighborEuclideanDistance(center: DelaunayTriangulation, neighbors: Map[Direction, (BoundaryDelaunay, Extent)], re: RasterExtent): Tile = {
// println(" Forming center-stitched BoundaryDelaunay")
val stitched = StitchedDelaunay(center, neighbors, false)
// println(" -> OK!")
val origin = center.halfEdgeTable.getDest(center.boundary)
val extent = neighbors(Center)._2
val cells = voronoiCells(stitched, origin, extent)
Expand Down Expand Up @@ -107,15 +105,6 @@ object EuclideanDistance {
)

(key, neighborEuclideanDistance(triangulation, borders, re))

// val stitched = StitchedDelaunay(triangulation, borders, false)
// val origin = triangulation.halfEdgeTable.getDest(triangulation.boundary)
// val cells = voronoiCells(stitched, origin, extent)

// val tile = DoubleArrayTile.empty(re.cols, re.rows)
// cells.foreach(EuclideanDistanceTile.rasterizeDistanceCell(re, tile))

// (key, tile)
}}
}, preservesPartitioning = true)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package geotrellis.spark.distance

import com.vividsolutions.jts.geom.Coordinate
import org.apache.spark.rdd.RDD

import geotrellis.raster._
import geotrellis.spark._
import geotrellis.spark.tiling._
import geotrellis.util.MethodExtensions
import geotrellis.vector.{Extent, Point}

trait EuclideanDistanceRDDMethods extends MethodExtensions[RDD[(SpatialKey, Array[Coordinate])]] {
def euclideanDistance(layout: LayoutDefinition): RDD[(SpatialKey, Tile)] = { EuclideanDistance(self, layout) }
}
12 changes: 12 additions & 0 deletions spark/src/main/scala/geotrellis/spark/distance/Implicits.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package geotrellis.spark.distance

import com.vividsolutions.jts.geom.Coordinate
import org.apache.spark.rdd.RDD

import geotrellis.spark._

object Implicits extends Implicits

trait Implicits {
implicit class withEuclideanDistanceRDDMethods(val self: RDD[(SpatialKey, Array[Coordinate])]) extends EuclideanDistanceRDDMethods
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package geotrellis.spark.distance

import com.vividsolutions.jts.geom.Coordinate
import org.apache.spark.rdd.RDD

import geotrellis.raster._
import geotrellis.raster.distance.{EuclideanDistanceTile => RasterEuclideanDistance}
Expand All @@ -9,7 +10,6 @@ import geotrellis.raster.testkit._
import geotrellis.spark._
import geotrellis.spark.buffer.Direction
import geotrellis.spark.buffer.Direction._
import geotrellis.spark.distance.{EuclideanDistance => SparkEuclideanDistance}
import geotrellis.spark.testkit._
import geotrellis.spark.tiling._
import geotrellis.spark.triangulation._
Expand All @@ -20,6 +20,8 @@ import geotrellis.vector.io.wkt.WKT
import scala.util.Random
import scala.math.{Pi, sin, cos, atan, max, pow}

import Implicits._

import org.scalatest._

class EuclideanDistanceSpec extends FunSpec
Expand Down Expand Up @@ -55,18 +57,18 @@ class EuclideanDistanceSpec extends FunSpec
while (i < n) {
val next = proposal
if (next.z > site.z || Random.nextDouble < next.z / site.z) {
if (next.z > site.z)
print("")
else
print("")
// if (next.z > site.z)
// print("↑")
// else
// print("↓")
sample(i) = next
site = next
i += 1
} else {
if (next.z < 0)
print("")
else
print("-")
// if (next.z < 0)
// print("☠")
// else
// print("-")
}
}
println
Expand Down Expand Up @@ -123,7 +125,7 @@ class EuclideanDistanceSpec extends FunSpec
// rasterTile.renderPng(cm).write("base_distance.png")

println(" Forming sparkified EuclideanDistance tile")
val neighborTile = SparkEuclideanDistance.neighborEuclideanDistance(center, bounds, rasterExtent)
val neighborTile = EuclideanDistance.neighborEuclideanDistance(center, bounds, rasterExtent)
// neighborTile.renderPng(cm).write("spark_distance.png")
println(" Finished")

Expand All @@ -134,26 +136,33 @@ class EuclideanDistanceSpec extends FunSpec
// val domain = Extent(-1.0, -0.5, 1.0, 1.0)
val domain = Extent(0, -1.15, 1, -0.05)
val sample = generatePoints(domain, 2500)

val rasterExtent = RasterExtent(domain, 1024, 1024)
val layoutdef = LayoutDefinition(rasterExtent, 256, 256)
val maptrans = layoutdef.mapTransform

val rasterTile = RasterEuclideanDistance(sample, rasterExtent)
val rdd =
val rdd: RDD[(SpatialKey, Array[Coordinate])] =
sc.parallelize(sample.map{ coord => (maptrans(coord.x, coord.y), coord) })
.groupByKey
.map{ case (key, iter) => (key, iter.toArray) }

rdd.foreach{ case (key, arr) => println(s"$key has ${arr.length} coordinates") }

val tileRDD = SparkEuclideanDistance(rdd, layoutdef)
val tileRDD: RDD[(SpatialKey, Tile)] = rdd.euclideanDistance(layoutdef)
val stitched = tileRDD.stitch

// // For to export point data
// val mp = MultiPoint(sample.toSeq.map{ Point.jtsCoord2Point(_)})
// val wktString = geotrellis.vector.io.wkt.WKT.write(mp)
// new java.io.PrintWriter("euclidean_distance_sample.wkt") { write(wktString); close }

// // Image file output
// val maxDistance = rasterTile.findMinMaxDouble._2 + 1e-8
// val cm = ColorMap((0.0 to maxDistance by (maxDistance/512)).toArray, ColorRamps.BlueToRed)
// rasterTile.renderPng(cm).write("distance.png")
// stitched.renderPng(cm).write("stitched.png")
// geotrellis.raster.io.geotiff.GeoTiff(rasterTile, domain, geotrellis.proj4.LatLng).write("distance.tif")

assertEqual(rasterTile, stitched)
}
Expand Down

0 comments on commit afcb399

Please sign in to comment.