sfcurve

2022-04-27  本文已影响0人  hehehehe

https://www.jianshu.com/p/915572c61f9a

Z3索引:将二维空间点和时间点编码到一维空间,它可以加快点对象的时空范围查询。具有几何类型Point和时间属性的对象可以创建Z3索引。地理空间是明确的经纬度边界(-180,180),(-90,90)。但是,时间是没有边界的。因此为了能递归分解时间,我们从1970-01-01 00:00:00开始(计算纪元时间),将时间按照固定周期(time period)进行切分, 每个周期都会有确定的边界。JUST引擎可设置time period为day、week、month、year。我们用T表示一个时间周期,T.s表示该周期开始时刻,T.e表示该周期结束时刻。在一个时间周期里,Z3索引首先将T从中间(T.m)分开,如果时间点小于T.m,那么编码为0,否则编码为1。然后按同样的二分规则划分经纬度。因此,我们可用三位编码(时间在前,经纬度在后)来表示时空点所在区域。然后,递归划分子时空区域,直到达到最大递归层级。如图中所示,最大递归次数为r=3, time period为day(24小时),时空点p(t:10,lng:-73.97,lat:40.78)在第一层r=1时处于“001” 区域(t:0,lng:0,lat:1),在第二层时处于“001” 区域的“110”子区域,最后在最大层级r=3时处于“001 110” 区域的“101” 区域。最终,我们用“001 110 101”来表示p.

image.png

XZ2 索引:XZ2索引使用XZ-Ordering来索引非点空间对象,它可以加快非点对象的空间范围查询。XZ-Ordering是Z-Ordering的一种扩展,用于索引空间扩展的对象(即非点空间对象,如线串或多边形)。如果具有非点几何形状的对象,则可创建此索引。它用于有效地回答非点空间对象的空间查询。如下图(a)所示,XZ-Ordering的子空间(图(b))由Z-Ordering的子空间(图(a))扩大一倍得到,然后XZ-Ordering索引利用其恰好能完全包含非点空间对象的最小子空间来表示这个对象,如图(c)中,o1由“303”表示,o2由“033”表示。

image.png
<dependency>
    <groupId>org.locationtech.geomesa</groupId>
    <artifactId>geomesa-z3_2.12</artifactId>
    <version>3.3.0</version>
</dependency>
package org.gis.spark

import org.locationtech.geomesa.curve.{XZ2SFC, Z2SFC}
import org.locationtech.sfcurve.zorder.Z2

import scala.collection.mutable.ArrayBuffer
import scala.util.control.NonFatal

object XZ2Test {

  def main(args: Array[String]): Unit = {
    val sfc = XZ2SFC(12)
    val poly = sfc.index(115.3, 35.3, 115.6, 35.6)

    println(poly)

    val ranges = sfc.ranges(Seq((115.0, 35.0, 117.0, 36.0)))
    println(ranges)
    for (elem <- ranges) {
      println(elem)
    }


    //    val envelope = geom.getEnvelopeInternal
    //    val xz = sfc.index(envelope.getMinX, envelope.getMinY, envelope.getMaxX, envelope.getMaxY, lenient)

  }

}

上一篇 下一篇

猜你喜欢

热点阅读