GeoMesa(5)

一、 Feature 抽样

如果有5 个features,抽取10%的话,则可能抽出1、2、3、4、5个(不少于10%)

QueryHints.SAMPLING:值为0-1之间的小数(float)
QueryHints.SAMPLE_BY:值为属性名

import org.locationtech.geomesa.index.conf.QueryHints

// returns 10% of features, threaded by 'track' attribute
query.getHints.put(QueryHints.SAMPLING, 0.1f)//抽取10%
query.getHints().put(QueryHints.SAMPLE_BY, "track");//通过track属性进行抽样

二、查询抽样

如果填充热图或其他预呈现的地图,GeoMesa可以使用服务器端聚合将功能映射到像素。这将大大减少网络流量,从而大大加快查询速度。
密度查询的结果是(x, y, count)的编码迭代器,其中x和y表示像素中心的坐标。

QueryHints.DENSITY_BBOX :值为ReferencedEnvelope类型
QueryHints.DENSITY_WEIGHT :值为String类型
QueryHints.DENSITY_WIDTH :值为Integer类型
QueryHints.DENSITY_HEIGHT :值为Integer类型

import org.geotools.data.Transaction
import org.geotools.geometry.jts.ReferencedEnvelope.ReferencedEnvelope
import org.geotools.referencing.CRS
import org.locationtech.geomesa.accumulo.iterators.DensityIterator
import org.locationtech.geomesa.index.conf.QueryHints

val bounds = new ReferencedEnvelope(-120.0, -110.0, 45.0, 55.0, CRS.decode("EPSG:4326"))
query.getHints.put(QueryHints.DENSITY_BBOX, bounds)
query.getHints.put(QueryHints.DENSITY_WIDTH, 500)
query.getHints.put(QueryHints.DENSITY_HEIGHT, 500)

val reader = dataStore.getFeatureReader(query, Transaction.AUTO_COMMIT)

val decode = KryoLazyDensityIterator.decodeResult(bounds, 500, 500)

while (reader.hasNext) {
    val pts = decode(reader.next())
    while (pts.hasNext) {
        val (x, y, weight) = pts.next()
        // do something with the cell
    }
}
reader.close()

三、统计查询

GeoMesa支持根据数据集生成各种统计信息。这些统计信息是在分布式扫描中生成的,因此提供了内置的并行性,并且需要更少的网络流量。支持以下统计:
1.计数
2.最小值/最大值
3.枚举
4.top-k
5.频率直方图
6.描述性统计

QueryHints.STATS_STRING :值为String类型
QueryHints.ENCODE_STATS :值为Boolean 类型

import org.geotools.data.Transaction
import org.locationtech.geomesa.index.conf.QueryHints
import org.locationtech.geomesa.index.iterators.StatsScan
import org.locationtech.geomesa.utils.stats.Stat

query.getHints.put(QueryHints.STATS_STRING, "Count()")
query.getHints.put(QueryHints.ENCODE_STATS, java.lang.Boolean.TRUE)

val reader = dataStore.getFeatureReader(query, Transaction.AUTO_COMMIT)

val result: Stat = try {
  // stats should always return exactly one result, even if there are no features in the table
  StatsScan.decodeStat(sft)(reader.next.getAttribute(0).asInstanceOf[String])
} finally {
  reader.close()
}

函数:

功能 函数名
数量 Count()
最大值、最小值 MinMax(“foo”)
枚举 Enumeration(“foo”)
top-k TopK(“foo”)
频率 Frequency(“foo”, <precision>)
频率(根据时间周期) Frequency(“foo”,“dtg”,<time period>, < <precision>)
频率Z3 Z3Frequency(“geom”,“dtg”,<time period>, <precision>))
直方图 Histogram(“foo”,<bins>,<min>,<\max>)
Z3 直方图 Z3Histogram(“geom”,“dtg”,<time period>,<bins>)
描述统计 DescriptiveStats(“foo”,“bar”)

其中:
<time period>为 : day, week, month, or year
<precision>为:
1.对于几何和Z3类型,它是z索引要保留的位的数量(最大值为64)。注意,前2位不包含任何信息
2.对于日期类型,它是为分组的毫秒数
3。对于数字类型,它是将组合在一起的数字的数量
4.对于浮点类型,他是小数点位数
5.对于字符串类型,他是字符的数量
<bins>为:直方图分为多少组,
<min>和<max> 为:直方图各组的初始大小

可使用GroupBy,比如GroupBy(“foo”,MinMax(“bar”)).

ENCODE_STATS:控制返回结果是以对象返回还是以json返回,
结果可通过org.locationtech.geomesa.utils.stats.StatSerialize进行反序列化

四、二进制编码

GeoMesa支持以自定义二进制格式(称为BIN)返回feature(每个feature使用16或24字节)。
16字节BIN格式如下:
<4 byte int><4 byte int><4 byte floating point><4 byte floating point>

第一个数为 track ID,通常用于对相关点进行分组。例如,一个行字符串可以转换成几个具有相同track ID的BIN记录。第二个数是一个日期,表示自Java纪元(1970年1月1日)以来的秒数。最后两个浮点数分别表示记录的经纬度。

BIN查询的结果是SimpleFeatures的迭代器,其中每个属性的第一个属性都是包含一个或多个BIN编码特性的字节数组。

QueryHints.BIN_TRACK :值为String 类型
QueryHints.BIN_GEOM :值为String (可选)类型
QueryHints.BIN_DTG :值为String (可选)类型
QueryHints.BIN_LABEL :值为String (可选)类型
QueryHints.BIN_SORT :值为Boolean (可选)类型
QueryHints.BIN_BATCH_SIZE:值为 Integer (可选)类型

其中
BIN_TRACK:用于触发BIN查询。用于为每个记录生成 track ID的属性的名称。
BIN_GEOM:用于每个记录的几何属性。如果省略,则使用feature 类型的默认几何形状。
BIN_DTG:用于每个记录的date属性。如果省略,则使用feature 类型的默认日期。
BIN_LABEL:触发创建24字节的记录,而不是标准的16字节。它是一个属性的名称,作为每条记录的标签。
BIN_SORT:对记录进行排序。它是feature 类型的属性名。
BIN_BATCH_SIZE:控制生成BIN记录时使用的批大小

import java.io.ByteArrayOutputStream
import org.geotools.data.Transaction
import org.locationtech.geomesa.index.conf.QueryHints

query.getHints.put(QueryHints.BIN_TRACK, "name")

val reader = dataStore.getFeatureReader(query, Transaction.AUTO_COMMIT)
val os = new ByteArrayOutputStream()

while (reader.hasNext) {
  os.write(reader.next().getAttribute(0).asInstanceOf[Array[Byte]])
}
reader.close()

// process bytes appropriately

猜你喜欢

转载自blog.csdn.net/qq_21705851/article/details/92730280