系列目录
带你入门GeoSpark系列之一【环境篇】
带你入门GeoSpark系列之二【Spatial RDD篇】
带你入门GeoSpark系列之三【空间查询篇】
1.空间范围查询( Spatial Range Query)
空间范围查询,顾名思义我们可以给定一个范围(query window),然后查询出包含在当前范围内的地理对象。

1.1 数据准备
创建checkin1.csv在 data/checkin1.csv路径下:
注意这里故意把bar坐标修改了一下
-88.331492,32.324142,hotel
-88.175933,32.360763,gas
-99.388954,32.357073,bar
-88.221102,32.35078,restaurant
1.2 代码示例
considerBoundaryIntersection参数可以配置查询是否包括query window边界上的地理对象。
package com.suddev.bigdata.query
import com.vividsolutions.jts.geom.Envelope
import org.apache.spark.serializer.KryoSerializer
import org.apache.spark.{
SparkConf, SparkContext}
import org.datasyslab.geospark.enums.FileDataSplitter
import org.datasyslab.geospark.serde.GeoSparkKryoRegistrator
import org.datasyslab.geospark.spatialOperator.RangeQuery
import org.datasyslab.geospark.spatialRDD.PointRDD
/**
* Spatial Range Query
* @author Rand
* @date 2020/4/16 0016
*/
object SpatialRangeQueryApp {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().
setAppName("SpatialRangeQueryApp").setMaster("local[*]").
set("spark.serializer",classOf[KryoSerializer].getName).
set("spark.kryo.registrator", classOf[GeoSparkKryoRegistrator].getName)
implicit val sc = new SparkContext(conf)
val objectRDD = createPointRDD
objectRDD.rawSpatialRDD.rdd.collect().foreach(println)
// 定义QueryWindow
val rangeQueryWindow = new Envelope(-90.01, -80.01, 30.01, 40.01)
// 是否考虑边界
val considerBoundaryIntersection = false
val usingIndex = false
val queryResult = RangeQuery.SpatialRangeQuery(objectRDD, rangeQueryWindow, considerBoundaryIntersection, usingIndex)
queryResult.rdd.collect().foreach(println)
}
def createPointRDD(implicit sc:SparkContext): PointRDD ={
val pointRDDInputLocation = "data/checkin1.csv"
// 这个变量控制我们的地理经度和纬度在数据的哪两列,我们这里是第0,1列,Offset就设置为0
val pointRDDOffset = 0
val pointRDDSplitter = FileDataSplitter.CSV
// 这个参数允许我们除了经纬度外还可以携带其他自定义数据
val carryOtherAttributes = true
val objectRDD = new PointRDD(sc, pointRDDInputLocation,pointRDDOffset, pointRDDSplitter, carryOtherAttributes)
objectRDD
}
}
🔥这里的rangeQueryWindow除了支持Envelope外还可以使用Point/Polygon/LineString
点->创建一个Point Query Window:
val geometryFactory = new GeometryFactory()
val pointObject = geometryFactory.createPoint(new Coordinate(-84.01, 34.01))
多边形->创建一个Polygon Query Window:
val geometryFactory = new

本文深入解析GeoSpark中的四种核心空间查询技术:空间范围查询、空间临近查询、空间连接查询及距离连接查询,通过实例代码展示如何进行地理数据的空间分析。
最低0.47元/天 解锁文章
826





