从 Line 中提取 n 个坐标 - Bigquery

Ale*_*lex 2 sql google-bigquery

我想从我在大查询中拥有的地理对象(一条线)中提取 n 个坐标(纬度、经度)。

有没有办法指定st_geogpoint我想要获得多少?(可以多于或少于st_geogpoint用于创建线条的st_makeline

例子:

LINESTRING(-115.2893119 36.218517, -115.2892195 36.2184946, -115.2879825 36.2184996, -115.2871506 36.2185021, -115.2870766 36.2185255)  
Run Code Online (Sandbox Code Playgroud)

我希望能够从该行中提取n(其中 n>=2)st_geogpoint。是否可以?

如果 n=2,则预期输出

[POINT(-115.2893119 36.218517), POINT(-115.2870766 36.2185255)]
Run Code Online (Sandbox Code Playgroud)

如果 n=10,则预期输出

[POINT(-115.2893119 36.218517),
POINT_2,
POINT_3,
POINT_4,
POINT_5,
POINT_6,
POINT_7,
POINT_8,
POINT_9,
POINT(-115.2870766 36.2185255) ]
Run Code Online (Sandbox Code Playgroud)

我不能给出第一个和最后一个之间的点的例子,因为我期望它们是根据n的值从 LINE 中提取的

Mik*_*ant 5

下面是 BigQuery 标准 SQL

#standardSQL
SELECT 
  SAFE.ST_GEOGFROMTEXT(CONCAT('POINT(', point, ')')) geo_object
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(ST_ASTEXT(geo_object), r'[^,\(\)]+')) point WITH OFFSET pos
WHERE pos BETWEEN 1 AND 3
Run Code Online (Sandbox Code Playgroud)

您可以使用您的问题中的示例数据进行测试,使用上面的示例数据,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT ST_GEOGFROMTEXT('LINESTRING(-115.2893119 36.218517, -115.2892195 36.2184946, -115.2879825 36.2184996, -115.2871506 36.2185021, -115.2870766 36.2185255)') geo_object
)
SELECT 
  SAFE.ST_GEOGFROMTEXT(CONCAT('POINT(', point, ')')) geo_object
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(ST_ASTEXT(geo_object), r'[^,\(\)]+')) point WITH OFFSET pos
WHERE pos BETWEEN 1 AND 3   
Run Code Online (Sandbox Code Playgroud)

结果

Row geo_object   
1   POINT(-115.2893119 36.218517)    
2   POINT(-115.2892195 36.2184946)   
3   POINT(-115.2879825 36.2184996)     
Run Code Online (Sandbox Code Playgroud)

显然,通过在下面的行中调整 1 和 3,您可以控制要输出的点数

WHERE pos BETWEEN 1 AND 3   
Run Code Online (Sandbox Code Playgroud)

如果您希望输出与数组在同一行中 - 请参见下文

#standardSQL
WITH `project.dataset.table` AS (
  SELECT ST_GEOGFROMTEXT('LINESTRING(-115.2893119 36.218517, -115.2892195 36.2184946, -115.2879825 36.2184996, -115.2871506 36.2185021, -115.2870766 36.2185255)') geo_object
)
SELECT 
  ARRAY(
    SELECT SAFE.ST_GEOGFROMTEXT(CONCAT('POINT(', point, ')'))
    FROM UNNEST(REGEXP_EXTRACT_ALL(ST_ASTEXT(geo_object), r'[^,\(\)]+')) point WITH OFFSET pos
    WHERE pos BETWEEN 1 AND 3  
    AND NOT point IS NULL
  ) geo_objects
FROM `project.dataset.table`
Run Code Online (Sandbox Code Playgroud)

这个产生数组

Row geo_objects  
1   POINT(-115.2893119 36.218517)    
    POINT(-115.2892195 36.2184946)   
    POINT(-115.2879825 36.2184996)      
Run Code Online (Sandbox Code Playgroud)