Geospark空间查询java代码示例。
Geospark空间查询
GeoSpark空间索引
- GeoSpark提供两种空间索引:Quad-Tree和R-Tree
- 和上一节一样,我们初始化一个SparkContext,并调用GeoSpark的ShapefileReader,将我们的Shape文件导入。
1 | SparkConf conf = new SparkConf(); |
构建索引
1 | // 构建索引 |
使用索引查询
1 | // 查询 |
1 | 查询结果总数为: 62 |
3. 输出查询结果
1 | // 遍历查询结果 |
1 | POLYGON ((-123.15566057081632 49.26206733490204, -123.15564728017853 49.26241791476514, -123.15548939905344 49.262415429329856, -123.15550257747702 49.26206484963618, -123.15566057081632 49.26206733490204)) 1 -9999 Kitsilano N |
KNN临近查询
KNN临近查询用于查询距指定点最近的K个Geometry,在本案例中我们指定中心点为(-123.1,49.2),我们来查询距离这个点最近的5个公园的分布。
注意:QTREE索引不支持KNN查询,所以在使用KNN的时候,可以选择R-Tree索引。
1 | // 临近查询(KNN) |
1 | 距离点(-123.1,49.2)最近的五个公园是: |
空间关联查询(Spatial Join Query)
空间关联查询:创建一个表联接(类似于SQL语句中的join关联),其中根据两层中特性的相对位置,将一个图层属性表中的字段追加到另一个图层层属性表中。
现在我们有两个图层,一个是公园(polygon),另外一个是公园里一些点(point),现在我们要把这些点所在公园的属性赋给这些点,用到的就是空间关联查询。
1 | // 空间关联查询 |
SpatialJoinQuery返回一个类似于Map集合的RDD,其中Key是SpatialJoinQuery中的第一个RDD,也就是我们的pointRDD,Value是一个Set集合,集合里面每个元素都是来自于SpatialJoinQuery中的第二个RDD,也就是parkRDD,在我们这个案例下,我们的key、value都是一一对应的,但是当我们反过来执行JoinQuery.SpatialJoinQuery(pointRdd, parkRdd, usingIndex, considerBoundaryIntersection)
,那此时key和value就是一对多关系了,因此一个公园里会有很多个点,但是一个点只会属于一个公园(边界上的点除外)。
1 | {5}--{[POLYGON... 62 201 English Bay Beach Park West End Beach Avenue Bidwell Street N Y Y]} |