如何从BigQuery中的GeoJSON中提取单独的值

时间:2019-03-26 18:13:55

标签: sql google-bigquery gis geojson

我有一个用于多点几何的GeoJSON字符串。我想将这些点中的每一个提取到BigQuery中单个点几何的表中

我已经能够实现其中一个点的点几何。我也想以自动化方式为所有其他人执行此操作。我已经尝试过将字符串转换为数组,但是它仍然是大小为1的数组,整个内容都是单个字符串。

这对我有用,因为我能够提取一个点并将其转换为几何图形

WITH temp_table as (select '{ "type": "MultiPoint", "coordinates": [ [ 20, 10 ], [ 30, 5 ], [ 90, 50 ], [ 40, 80 ] ]  }' as string) 

select ST_GEOGPOINT(CAST(JSON_EXTRACT(string, '$.coordinates[0][0]') as FLOAT64), CAST(JSON_EXTRACT(string, '$.coordinates[0][1]') as FLOAT64))  from temp_table

这将导致POINT(20 10)

我可以为这些问题中的每一个编写手动查询,并执行UNION ALL,但每次都无法扩展或工作。我想实现这一目标,以便它能够以自动化的方式做到这一点。出于架构目的,我们无法使用Python之类的语言进行字符串操作。

1 个答案:

答案 0 :(得分:4)

以下是用于BigQuery标准SQL

#standardSQL
SELECT 
  ARRAY(
    SELECT ST_GEOGPOINT(
      CAST(SPLIT(pair)[OFFSET(0)] AS FLOAT64), CAST(SPLIT(pair)[SAFE_OFFSET(1)] AS FLOAT64)) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(JSON_EXTRACT(STRING, '$.coordinates'), r'\[(\d+,\d+)\]')) pair
  ) points
FROM `project.dataset.temp_table`  

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

#standardSQL
WITH `project.dataset.temp_table` AS (
  SELECT '{ "type": "MultiPoint", "coordinates": [ [ 20, 10 ], [ 30, 5 ], [ 90, 50 ], [ 40, 80 ] ]  }' AS STRING
) 
SELECT 
  ARRAY(
    SELECT ST_GEOGPOINT(
      CAST(SPLIT(pair)[OFFSET(0)] AS FLOAT64), CAST(SPLIT(pair)[SAFE_OFFSET(1)] AS FLOAT64)) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(JSON_EXTRACT(STRING, '$.coordinates'), r'\[(\d+,\d+)\]')) pair
  ) points
FROM `project.dataset.temp_table`   

有结果

Row points   
1   POINT(20 10)     
    POINT(30 5)  
    POINT(90 50)     
    POINT(40 80)     

注意:在上述版本中-每个原始行都会生成点数组。显然,您可以按照下面的示例

进行调整以使其变平
#standardSQL
WITH `project.dataset.temp_table` AS (
  SELECT '{ "type": "MultiPoint", "coordinates": [ [ 20, 10 ], [ 30, 5 ], [ 90, 50 ], [ 40, 80 ] ]  }' AS STRING
) 
SELECT 
  ST_GEOGPOINT(
      CAST(SPLIT(pair)[OFFSET(0)] AS FLOAT64), CAST(SPLIT(pair)[SAFE_OFFSET(1)] AS FLOAT64)
  ) points
FROM `project.dataset.temp_table`, UNNEST(REGEXP_EXTRACT_ALL(JSON_EXTRACT(STRING, '$.coordinates'), r'\[(\d+,\d+)\]')) pair   

有结果

Row points   
1   POINT(20 10)     
2   POINT(30 5)  
3   POINT(90 50)     
4   POINT(40 80)