【问题标题】:Presto SQL - Transforming array(BingTile) into geometryPresto SQL - 将数组(BingTile)转换为几何
【发布时间】:2023-08-10 02:50:01
【问题描述】:

我正在尝试使用地理空间函数(如 bing_tiles_around()、geometry_union() 和 st_area() 以及以下示例数据)来计算城市区域大小。

City ID | Store ID | latitude | longitude | radius (km)
---------------------------------------------------------
12345   | store_01 | 36.1234  | 31.1234   | 3.11
12345   | store_02 | 36.5678  | 31.5678   | 2.52

我相信我应该使用上述函数来计算区域大小。只要我基于this reference 理解,bing_tiles_around() 返回一个数组(BingTile),我需要将其转换为几何类型以同时使用 geometry_union() 和 st_area() 但我不确定如何转换'array(BingTile)' 变成 'geometry' 类型。

with store_info as (
select city_id, store_id, latitude, longitude, radius,
bing_tiles_around(latitude, longitude, 10, radius) as bingTiles_around
from store_detail
)

select city_id, store_id, geometry_union(bingTiles_around)
from store_info

上面的查询是我正在处理的当前查询,当我执行它时它向我显示了以下错误。 (我知道这不是正确的用法,但只是想分享以下错误消息来解决这个问题)

QueryValidation: user_error: Attempt 1: presto: query failed (200 OK): 
"USER_ERROR: com.facebook.presto.sql.analyzer.SemanticException: line 17:70: 
Unexpected parameters (array(BingTile)) for function geometry_union. 
Expected: geometry_union(array(Geometry)) "

最终目标是创建如下示例结果数据集。

City ID | Area_size 
--------------------
12345   | 40.12345
12346   | 50.56789

谁能帮助我使用上述信息创建此表? 任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: sql arrays geometry geospatial presto


    【解决方案1】:

    bing_tiles_around 返回 BingTile 的数组,而 geometry_union 需要 Geometry 的数组,因此您需要将一个数组转换为另一个数组:

    -- sample data
    WITH dataset (City_ID , Store_ID , latitude , longitude , radius ) AS (
        VALUES (12345   , 'store_01' , 36.1234  , 31.1234   , 3.11),
    (12345   , 'store_02' , 36.5678  , 31.5678   , 2.52)
    ) 
    
    --query
    select city_id,
        store_id,
        geometry_union(
            transform(bingTiles_around, t->bing_tile_polygon(t))
        )
    from(
            select city_id,
                store_id,
                latitude,
                longitude,
                radius,
                bing_tiles_around(latitude, longitude, 10, radius) as bingTiles_around
            from dataset
        )
    

    【讨论】: