MAPREDUCE服务 MRS-CarbonData表空间索引语法说明:不规则空间集合的聚合查询

时间:2024-05-30 16:45:28

不规则空间集合的聚合查询

查询语句及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输入参数:

    参数

    类型

    说明

    polygonRangeList

    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_INDEX_COLUMN

    Long

    空间数据表的GeoHashIndex列。

    POLYGON_COLUMN

    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_INDEX_COLUMN

    Long

    空间数据表的GeoHashIndex列。

    POLYGON_COLUMN

    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输出参数:

    参数

    类型

    说明

    latitudeAndLongitude

    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[Long]]

    将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;
support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1451.html