查询语句及Filter UDF
● 根据polygon过滤数据 IN_POLYGON(pointList) UDF输入参数:
参数 类型 说明
pointList String 将多个点输入为一个字符串,每个点 以longitude latitude表示。经纬度间 用空格分隔,每对经纬度用逗号分 隔,字符串首尾经纬度一致。
UDF输出参数:
参数 类型 说明
inOrNot Boolean 判断数据是否在指定的polygon_list之 内。
使用示例:
select longitude, latitude from geosot where IN_POLYGON('116.321011 40.123503, 116.137676 39.947911, 116.560993 39.935276, 116.321011 40.123503');
● 根据polygon列表过滤数据。
IN_POLYGON_LIST(polygonList, opType) UDF输入参数:
参数 类型 说明
polygonList String 将多个polygon输入为一个字符串,每 个polygon以POLYGON ((longitude1 latitude1, longitude2 latitude2,
…))表示。注意“POLYGON”后有空 格,经纬度间用空格分隔,每对经纬 度用逗号分隔,一个polygon的首尾经 纬度一致。IN_POLYGON_LIST必须输 入2个以上polygon。
一个polygon示例:
POLYGON ((116.137676 40.163503, 116.137676 39.935276, 116.560993 39.935276, 116.137676 40.163503))
opType String 对多个polygon进行并交差操作。
目前支持的操作类型:
● OR:A U B U C (假设输入了三个 POLYGON,A、B、C)
● AND:A ∩ B ∩ C
UDF输出参数:
参数 类型 说明
inOrNot Boolean 判断数据是否在指定的polygon_list之 内。
使用示例:
select longitude, latitude from geosot where IN_POLYGON_LIST('POLYGON ((120.176433 30.327431,120.171283 30.322245,120.181411 30.314540, 120.190509 30.321653,120.185188 30.329358,120.176433 30.327431)), POLYGON ((120.191603 30.328946,120.184179 30.327465,120.181819 30.321464, 120.190359 30.315388,120.199242 30.324464,120.191603 30.328946))', 'OR');
● 根据polyline列表过滤数据。
IN_POLYLINE_LIST(polylineList, bufferInMeter) UDF输入参数:
参数 类型 说明
polylineList String 将多个polyline输入为一个字符串,每 个polyline以LINESTRING
(longitude1 latitude1, longitude2 latitude2, …)表示。注意
“LINESTRING”后有空格,经纬度间 用空格分隔,每组经纬度用逗号分 隔。
对多个polyline区域内的数据会输出并 集结果。
一个polyline示例:
LINESTRING (116.137676 40.163503,
116.137676 39.935276, 116.260993 39.935276)
bufferInMeter Float polyline的buffer距离,单位为米。末 端使用直角创建缓冲区。
UDF输出参数:
参数 类型 说明
inOrNot Boolean 判断数据是否在指定的polyline_list之 内。
使用示例:
select longitude, latitude from geosot where IN_POLYLINE_LIST('LINESTRING (120.184179 30.327465, 120.191603 30.328946, 120.199242 30.324464, 120.190359 30.315388)', 65);
● 根据GeoId区间列表过滤数据。
IN_POLYGON_RANGE_LIST(polygonRangeList, opType) UDF输入参数:
参数 类型 说明
polygonRangeLis
t String 将多个rangeList输入为一个字符串,
每个rangeList以RANGELIST (startGeoId1 endGeoId1,
startGeoId2 endGeoId2, …)表示。
注意“RANGELIST”后有空格,首尾 GeoId间用空格分隔,每组GeoId range用逗号分隔。
一个rangeList示例:
RANGELIST (855279368848 855279368850, 855280799610 855280799612, 855282156300 855282157400)
参数 类型 说明
opType String 对多个rangeList进行并交差操作。
目前支持的操作类型:
● OR:A U B U C (假设输入了三个 RANGELIST,A、B、C)
● AND:A ∩ B ∩ C
UDF输出参数:
参数 类型 说明
inOrNot Boolean 判断数据是否在指定的polyRange_list 之内。
使用示例:
select mygeosot, longitude, latitude from geosot where IN_POLYGON_RANGE_LIST('RANGELIST (526549722865860608 526549722865860618, 532555655580483584 532555655580483594)', 'OR');
● polygon连接查询
IN_POLYGON_JOIN(GEO_HASH_INDEX_COLUMN, POLYGON_COLUMN) 两张表做join查询,一张表为空间数据表(有经纬度列和GeoHashIndex列),另 一张表为维度表,保存polygon数据。
查询使用IN_POLYGON_JOIN UDF,参数GEO_HASH_INDEX_COLUMN和 polygon表的POLYGON_COLUMN。Polygon_column列是一系列的点(经纬度 列)。Polygon表的每一行的第一个点和最后一个点必须是相同的。Polygon表的 每一行的所有点连接起来形成一个封闭的几何对象。
UDF输入参数:
参数 类型 说明
GEO_HASH_IND
EX_COLUMN Long 空间数据表的GeoHashIndex列。
POLYGON_COLU
MN String Polygon表的polygon列,数据为 polygon的字符串表示。例如,一个 polygon是POLYGON ((longitude1 latitude1, longitude2 latitude2, …))
使用示例:
CREATE TABLE polygonTable(
polygon string, poiType string, poiId String)
STORED AS carbondata;
insert into polygonTable select 'POLYGON ((120.176433 30.327431,120.171283 30.322245,
120.181411 30.314540,120.190509 30.321653,120.185188 30.329358,120.176433 30.327431))','abc','1';
insert into polygonTable select 'POLYGON ((120.191603 30.328946,120.184179 30.327465,
120.181819 30.321464,120.190359 30.315388,120.199242 30.324464,120.191603 30.328946))','abc','2';
select t1.longitude,t1.latitude from geosot t1 inner join
(select polygon,poiId from polygonTable where poitype='abc') t2
on in_polygon_join(t1.mygeosot,t2.polygon) group by t1.longitude,t1.latitude;
● range_list连接查询
IN_POLYGON_JOIN_RANGE_LIST(GEO_HASH_INDEX_COLUMN, POLYGON_COLUMN)
同IN_POLYGON_JOIN,使用IN_POLYGON_JOIN_RANGE_LIST UDF关联空间数 据表和polygon维度表,关联基于Polygon_RangeList。直接使用range list可以避 免polygon到range list的转换。
UDF输入参数:
参数 类型 说明
GEO_HASH_IND
EX_COLUMN Long 空间数据表的GeoHashIndex列。
POLYGON_COLU
MN String Polygon表的rangelist列,数据为 rangeList的字符串。例如,一个 rangelist是RANGELIST (startGeoId1 endGeoId1, startGeoId2 endGeoId2,
…)
使用示例:
CREATE TABLE polygonTable(
polygon string, poiType string, poiId String)
STORED AS carbondata;
insert into polygonTable select 'RANGELIST (526546455897309184 526546455897309284,
526549831217315840 526549831217315850, 532555655580483534 532555655580483584)','xyz','2';
select t1.*
from geosot t1 inner join
(select polygon,poiId from polygonTable where poitype='xyz') t2 on in_polygon_join_range_list(t1.mygeosot,t2.polygon);
空间索引工具类UDF
● GeoID转栅格行列号。
GeoIdToGridXy(geoId) UDF输入参数:
参数 类型 说明
geoId Long 根据GeoId计算栅格行列号。
UDF输出参数:
参数 类型 说明
gridArray Array[Int] 返回该geoid所包含的栅格行列号,以 数组的方式返回,第一位为行,第二 位为列。
使用示例:
select longitude, latitude, mygeohash, GeoIdToGridXy(mygeohash) as GridXY from geoTable;
● 经纬度转GeoID。
LatLngToGeoId(latitude, longitude oriLatitude, gridSize) UDF输入参数:
参数 类型 说明
longitude Long 经度,注:转换后的整数类型。
latitude Long 纬度,注:转换后的整数类型。
oriLatitude Double 原点纬度,计算GeoId需要参数。
gridSize Int 栅格大小,计算GeoId需要参数。
UDF输出参数:
参数 类型 说明
geoId Long 通过编码获得一个表示经纬度的数。
使用示例:
select longitude, latitude, mygeohash, LatLngToGeoId(latitude, longitude, 39.832277, 50) as geoId from geoTable;
● GeoID转经纬度。
GeoIdToLatLng(geoId, oriLatitude, gridSize) UDF输入参数:
参数 类型 说明
geoId Long 根据GeoId计算经纬度。
oriLatitude Double 原点纬度,计算经纬度需要参数。
gridSize Int 栅格大小,计算经纬度需要参数。
说明
由于GeoId由栅格坐标生成,坐标为栅格中心点,则计算出的经纬度是栅格中心点经纬 度,与生成该GeoId的经纬度可能有[0度~半个栅格度数]的误差。
UDF输出参数:
参数 类型 说明
latitudeAndLongi
tude Array[Double] 返回该geoid所表示的栅格的中心点的 经纬度坐标,以数组的方式返回,第 一位为latitude,第二位为longitude。
使用示例:
select longitude, latitude, mygeohash, GeoIdToLatLng(mygeohash, 39.832277, 50) as LatitudeAndLongitude from geoTable;
● 计算金字塔模型向上汇聚一层的GeoID。
ToUpperLayerGeoId(geoId) UDF输入参数:
参数 类型 说明
geoId Long 根据输入GeoId计算金字塔模型上一层
GeoId。
UDF输出参数:
参数 类型 说明
geoId Long 金字塔模型上一层GeoId。
使用示例:
select longitude, latitude, mygeohash, ToUpperLayerGeoId(mygeohash) as upperLayerGeoId from geoTable;
● 输入polygon获得GeoID范围列表。
ToRangeList(polygon, oriLatitude, gridSize) UDF输入参数:
参数 类型 说明
polygon String 输入polygon字符串,用一组经纬度表 示。
经纬度间用空格分隔,每对经纬度间 用逗号分隔,首尾经纬度一致。
oriLatitude Double 原点纬度,计算GeoId需要参数。
gridSize Int 栅格大小,计算GeoId需要参数。
UDF输出参数:
参数 类型 说明
geoIdList Buffer[Array[Lon
g]] 将polygon转换为一串geoid的范围列 表。
使用示例:
select ToRangeList('116.321011 40.123503, 116.137676 39.947911, 116.560993 39.935276, 116.321011 40.123503', 39.832277, 50) as rangeList from geoTable;
● 计算金字塔模型向上汇聚一层的longitude。
ToUpperLongitude (longitude, gridSize, oriLat) UDF输入参数:
参数 类型 说明
longitude Long 输入longitude,用一个长整型表示。
gridSize Int 栅格大小,计算longitude需要参数。
oriLatitude Double 原点纬度,计算longitude需要参数。
UDF输出参数:
参数 类型 说明
longitude Long 返回上一层的longitude。
使用示例:
select ToUpperLongitude (-23575161504L, 50, 39.832277) as upperLongitude from geoTable;
● 计算金字塔模型向上汇聚一层的Latitude。
ToUpperLatitude(Latitude, gridSize, oriLat) UDF输入参数:
参数 类型 说明
latitude Long 输入latitude,用一个长整型表示。
gridSize Int 栅格大小,计算latitude需要参数。
oriLatitude Double 原点纬度,计算latitude需要参数。
UDF输出参数:
参数 类型 说明
Latitude Long 返回上一层的latitude。
使用示例:
select ToUpperLatitude (-23575161504L, 50, 39.832277) as upperLatitude from geoTable;
● 经纬度转GeoSOT
LatLngToGridCode(latitude, longitude, level) UDF输入参数:
参数 类型 说明
latitude Double 输入latitude。
longitude Double 输入longitude。
level Int 输入level,值区间[0-32]。
UDF输出参数:
参数 类型 说明
geoId Long 通过GeoSOT编码获得一个表示经纬度
的数。
使用示例:
select LatLngToGridCode(39.930753, 116.302895, 21) as geoId;