空间范围查询,顾名思义我们可以给定一个范围(query window),然后查询出包含在当前范围内的地理对象。
1.空间范围查询( Spatial Range Query)
空间范围查询,顾名思义我们可以给定一个范围(query window),然后查询出包含在当前范围内的地理对象。
1.1 数据准备
创建checkin1.csv
在 data/checkin1.csv
路径下:
注意这里故意把bar坐标修改了一下
1 | -88.331492,32.324142,hotel |
1.2 代码示例
considerBoundaryIntersection
参数可以配置查询是否包括query window边界上的地理对象。
1 | package com.suddev.bigdata.query |
🔥这里的rangeQueryWindow
除了支持Envelope外还可以使用Point/Polygon/LineString
点->创建一个Point Query Window:
1 | val geometryFactory = new GeometryFactory() |
多边形->创建一个Polygon Query Window:
1 | val geometryFactory = new GeometryFactory() |
线->创建一个Linestring Query Window:
1 | val geometryFactory = new GeometryFactory() |
1.3 运行效果
可以看到查询结果包含hotel,gas,restaurant
不包含bar
1 | POINT (-88.331492 32.324142) hotel |
2.空间临近查询(Spatial KNN Query)
空间临近算法,我们可以给的一个中心点的坐标,然后找出该点相邻的K个地理对象
2.1 数据准备
创建checkin2.csv
在 data/checkin2.csv
路径下:
1 | -88.331492,32.324142,hotel |
2.2 代码示例
k参数可以设置限制查询k个结果
🙃这里吐槽一下,如果查询结果为5个,但是我们k设置的大于5就会报空指针异常hhh,不能查到多少返回多少么
🙃再吐槽一下,它这种设计一次只能查询一个点,实际生产上肯定是一批点和另外一批点做KNN匹配,而他这个不支持两个RDD查询,如果有感兴趣的两个RDD做KNN匹配的请给我留言,我单独写一篇文章
1 | package com.suddev.bigdata.query |
2.3 运行效果
可以看到查询结果包含gas3,gas1
两个点
1 | POINT (-88.331492 32.324142) hotel |
3.空间连接查询(Spatial Join Query)
空间连接查询算法,类似于数据库中的Join操作, 有Spatial RDD A and B,遍历A中的几何对象去匹配B中覆盖或相交的几何对象。
3.1 数据准备
创建checkin3.csv在 data/checkin3.csv路径下:
1 | -88.331492,32.324142,1.hotel |
创建checkin4.csv
在 data/checkin4.csv
路径下:
1 | -88.175933,32.360763,2.gas |
3.2 代码示例
1 | package com.suddev.bigdata.query |
3.3 运行效果
可以看到两边的gas,bar
Join关联上了
1 | POINT (-88.331492 32.324142) 1.hotel |
4.距离连接查询(Distance Join Query)
距离联接查询将两个Spatial RDD A和B和一个距离作为输入。对于A中的每个几何对象,找到B中都在给定距离之内的集合对象。
⚠️关于距离说明:
GeoSpark不会控制SpatialRDD中所有几何的坐标单位(基于度或基于米)。GeoSpark中所有相关距离的单位与SpatialRDD中所有几何的单位()相同。
转换参考坐标系(Coordinate Reference System)代码:
1 | val sourceCrsCode = "epsg:4326" // WGS84, the most common degree-based CRS |
参考资料:
GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857
4.1 数据准备
创建checkin5.csv
在 data/checkin5.csv
路径下:
1 | -89.331492,32.324142,1.hotel |
创建checkin6.csv
在 data/checkin6.csv
路径下:
1 | -88.175933,32.360763,2.gas |
4.2 代码示例
1 | package com.suddev.bigdata.query |
4.3 运行效果
可以看到1.gas
匹配到了2.gas,2.restaurant
两个点1.bar
匹配到了2.bar,2.bus
两个点
1 | POINT (-89.331492 32.324142) 1.hotel |