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 中提取的
下面是 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)
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |