DLA Ganos时空几何模块允许用户基于DLA Spark进行大规模的地理信息数据处理与分析。它基于DLA Spark环境提供了一系列的接口进行数据加载、分析和保存。

DLA Ganos提供了不同级别的数据分析模型,最基础的是GeometryRDD模型,用来实现Ganos数据中SimpleFeature与Spark中RDD模型的之间的转换。在GeometryRDD基础上,DLA Ganos基于DLA Spark SQL设计了一系列用于空间数据表达的UDT与UDF或UDAF,允许用户使用类似SQL结构化查询语言进行数据的查询与分析。

操作步骤

本文以全球船舶轨迹AIS数据集为例展示如何利用DLA Ganos加载GeoMesa中的矢量数据。

  1. 初始化Spark环境。
    //初始化SparkSession
    val spark: SparkSession = {
        val session = SparkSession.builder
          .master("local[*]")
          .config(additionalConf)
          .getOrCreate()
        session
      }
    
    import spark.implicits._
    spark.withGanosGeometry
    //指定HBase连接参数,POINT为Catalog名称
    val params = Map(
          "hbase.catalog" -> "AIS",
          "hbase.zookeepers" -> "zookeeper地址",
    
    //加载AIS数据源
    val dataFrame = sparkSession.read
          .format("ganos-geometry")
          .options(params)
          .option("ganos.feature", "point")
          .load()
      
      dataFrame.createOrReplaceTempView("aispoint");
  2. 时空查询。
    调用st_contains时空算子和between算子对数据进行时间空间过滤,选择出符合条件的数据进行显示:
    //船舶轨迹数据时空查询
    val spatialDf1 = spark.sql(
        """
            |SELECT ship_id,status,dtg,geom FROM aispoint
            |WHERE st_contains(st_makeBBOX(114.00000,22.00000,115.00000,23.00000), geom)
            |AND dtg between cast('2018-09-08T01:00:00Z' as timestamp) AND cast('2018-09-13T01:00:00Z' as timestamp)
          """.stripMargin) 
    println("查询录数:" + spatialDf1.count())
    spatialDf1.createOrReplaceTempView("point")
    spatialDf1.show
  3. 输出结果。
    查询录数:4291
    +---------+------+-------------------+--------------------+
    |  ship_id|status|                dtg|                geom|
    +---------+------+-------------------+--------------------+
    |566652000| 机动船在航|2018-09-08 09:04:00|POINT (114.749211...|
    |566652000| 机动船在航|2018-09-08 09:05:19|POINT (114.74888 ...|
    |566652000| 机动船在航|2018-09-08 09:08:00|POINT (114.74858 ...|
    |413280000|    锚泊|2018-09-08 09:11:39|POINT (114.710655...|
    |566652000| 机动船在航|2018-09-08 09:21:20|POINT (114.746276...|
    |413280000|    锚泊|2018-09-08 09:20:38|POINT (114.710836...|
    |566652000| 机动船在航|2018-09-08 09:27:01|POINT (114.747328...|
    |413280000|    锚泊|2018-09-08 09:32:37|POINT (114.710993...|
    |566652000| 机动船在航|2018-09-08 09:41:01|POINT (114.7508 2...|
    |413280000|    锚泊|2018-09-08 09:38:38|POINT (114.710961...|
    |566652000| 机动船在航|2018-09-08 09:42:50|POINT (114.751018...|
    |566652000| 机动船在航|2018-09-08 09:48:20|POINT (114.750356...|
    |566652000| 机动船在航|2018-09-08 09:50:10|POINT (114.750155...|
    |566652000| 机动船在航|2018-09-08 09:52:00|POINT (114.749886...|
    |413280000|    锚泊|2018-09-08 09:56:38|POINT (114.711043...|
    |566652000| 机动船在航|2018-09-08 10:04:01|POINT (114.748488...|
    |566652000| 机动船在航|2018-09-08 10:07:50|POINT (114.747945...|
    |566652000| 机动船在航|2018-09-08 10:10:19|POINT (114.7476 2...|
    |566652000| 机动船在航|2018-09-08 10:12:09|POINT (114.74736 ...|
    |413280000|    锚泊|2018-09-08 10:05:38|POINT (114.71118 ...|
    +---------+------+-------------------+--------------------+
    only showing top 20 rows
    Leaflet结果展示为:1