Spark提供DataFrame数据集,并且可以通过SQL语句来操作。GeoSpark在这个基础上实现了一些空间上的函数,可以用于SQL语句中,以下是本节要用到的5个,其余的函数参考GeoSpark SQL
Geospark SQL简介
GeoSpark SQL简介
Spark提供DataFrame数据集,并且可以通过SQL语句来操作。GeoSpark在这个基础上实现了一些空间上的函数,可以用于SQL语句中,以下是本节要用到的5个,其余的函数参考GeoSpark SQL
ST_GeomFromWKT (Wkt:string, UUID1, UUID2, ...)
:从给出的WKT语句中构造GeometryST_Transform (A:geometry, SourceCRS:string, TargetCRS:string, [Optional] UseLongitudeLatitudeOrder:Boolean, [Optional] DisableError)
:默认情况下,ST_Transform
假设经度为x,维度为y,如果你的数据恰好相反, 那么设置UseLongitudeLatitudeOrder
为false
.ST_Contains (A:geometry, B:geometry)
: A是否完全包含BST_PolygonFromEnvelope (MinX:decimal, MinY:decimal, MaxX:decimal, MaxY:decimal, UUID1, UUID2, ...)
: 从给出的MinX,MinY,MinY、MaxY构造Polygon。ST_PointFromText (Text:string, Delimiter:char, UUID1, UUID2, ...)
:从给定的坐标中构建Point
构建数据集,加载CSV文件
1 | SparkSession spark = SparkSession.builder(). |
此时Spark仅仅是构建了这么一个DataFrame,对于_c0来说,他不是Geometry,仅仅是字符串,所以我们需要增加一列geom
1 | +--------------------+---+---+--------+-----+-----------+--------------------+---+---+-----+----+-----+----+----+----------+--------+-----------+------------+ |
构建空间要素
这里用到了ST_GeomFromWKT
这个函数,他读取一个WKT字符串,然后将其转为Geometry
1 | String sqlText = "select ST_GeomFromWKT(_c0) AS countyshape, _c1, _c2, _c6 from rawdf"; |
1 | +--------------------+---+---+ |
我们调用spatialDf.printSchema()
输出每一列的元信息,检验一下是否转换成功,可以看到countyshape那列已经是geometry了。
1 | root |
坐标系转换
我们来尝试使用第一个GeoSpark提供的函数ST_Transform
来完成一个简单的操作:坐标转换。
1 | sqlText = "select ST_Transform(countyshape, 'epsg:4326', 'epsg:3857') as newcountyshape, countyshape, _c1, _c2, _c6 from spatialdf"; |
newcountyshape是转换后的,可以看到坐标已经发生了变化
1 | +--------------------+--------------------+---+---+ |
范围查询
接下来我们尝试使用ST_contains
来进行范围查询,我们首先通过ST_PolygonFromEnvelope
构建一个查询范围,当然你也可以根据自己的需要使用GeoSpark提供的其他SQL函数来构建Polygon、Point、Line等。
1 | sqlText = "select * from spatialdf where ST_contains(ST_PolygonFromEnvelope(-98.0,-97.0,111.0,111.0), countyshape)"; |
查询结果:
1 | +--------------------+--------------------+---+---+ |
KNN临近查询
接下来,我们来使用SQL完成上一节中的KNN临近查询,我们直接对距离排序,然后取出前K个即可。
1 | sqlText = "select _c6 AS countyname, ST_Distance(ST_PointFromText('-98.0,111.0',','), countyshape) AS distance " + |
查询结果如下:
1 | +----------------+-----------------+ |