
geotrellis.spark.io.index.zcurve.package.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of geotrellis-spark_2.10 Show documentation
Show all versions of geotrellis-spark_2.10 Show documentation
GeoTrellis is an open source geographic data processing engine for high performance applications.
The newest version!
package geotrellis.spark.io.index
package object zcurve {
/**
* Implements the the algorithm defined in: Tropf paper to find:
* LITMAX: maximum z-index in query range smaller than current point, xd
* BIGMIN: minimum z-index in query range greater than current point, xd
*
* @param load: function that knows how to load bits into appropraite dimention of a z-index
* @param xd: z-index that is outside of the query range
* @param rmin: minimum z-index of the query range, inclusive
* @param rmax: maximum z-index of the query range, inclusive
* @return (LITMAX, BIGMIN)
*/
def zdiv(load: (Long, Long, Int, Int) => Long, dims: Int)(xd: Long, rmin: Long, rmax: Long): (Long, Long) = {
require(rmin < rmax, "min ($rmin) must be less than max $(rmax)")
var zmin: Long = rmin
var zmax: Long = rmax
var bigmin: Long = 0L
var litmax: Long = 0L
def bit(x: Long, idx: Int) = {
((x & (1L << idx)) >> idx).toInt
}
def over(bits: Long) = (1L << (bits-1))
def under(bits: Long) = (1L << (bits-1)) - 1
var i = 64
while (i > 0) {
i -= 1
val bits = i/dims+1
val dim = i%dims
( bit(xd, i), bit(zmin, i), bit(zmax, i) ) match {
case (0, 0, 0) =>
// continue
case (0, 0, 1) =>
zmax = load(zmax, under(bits), bits, dim)
bigmin = load(zmin, over(bits), bits, dim)
case (0, 1, 0) =>
// sys.error(s"Not possible, MIN <= MAX, (0, 1, 0) at index $i")
case (0, 1, 1) =>
bigmin = zmin
return (litmax, bigmin)
case (1, 0, 0) =>
litmax = zmax
return (litmax, bigmin)
case (1, 0, 1) =>
litmax = load(zmax, under(bits), bits, dim)
zmin = load(zmin, over(bits), bits, dim)
case (1, 1, 0) =>
// sys.error(s"Not possible, MIN <= MAX, (1, 1, 0) at index $i")
case (1, 1, 1) =>
// continue
}
}
(litmax, bigmin)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy