有效 WKT 线串的正则表达式(在 BigQuery 中)?
Regex for valid WKT Linestrings (in BigQuery)?
到目前为止我有以下内容:
select WKT, column1, column2
from table
where REGEXP_CONTAINS(WKT, r"-?(?:\.\d+|\d+(?:\.\d*)?)") is true
这解决了大多数情况,但我仍然收到以下错误:
ST_GeogFromText failed: Linestring should have at least two unique points, but had 1
如何使用 regex
过滤掉 所有 BigQuery 中的无效 LINESTRING?我不能使用 ST_NUMPOINTS()
,因为它需要一个 GEOGRAPHY
对象,如果字符串无效,我无法将其转换为 GEOGRAPHY
。
编辑:WKT LINESTRING 具有以下格式:LINESTRING (x1 y1, x2 y2, x3 y3, ..., xn yn)
其中每个 (xn, yn)
对代表第 n 个 Lat/Long 对。
尝试以下对原始正则表达式的扩展
WHERE REGEXP_CONTAINS(WKT, r'LINESTRING \((?:(?:\.\d+|\d+(?:\.\d*)?) (?:\.\d+|\d+(?:\.\d*)?)(?:, |\))){2,}')
不要使用 REGEXP - 它不可能捕获所有问题。例如。 WKT 的纬度可能大于 90 度,这会导致 ST_GeogFromText 失败,但几乎不可能在 REGEXP 中捕获。或者您可能有两个相同的点 LINESTRING (1 2, 1 2)
,这也是无效的 LineString。
改用SAFE prefix,当输入无效时,它会导致函数return NULL而不是查询失败。这给了你准确的验证!
select SAFE.ST_GeogFromText('foo')
NULL
到目前为止我有以下内容:
select WKT, column1, column2
from table
where REGEXP_CONTAINS(WKT, r"-?(?:\.\d+|\d+(?:\.\d*)?)") is true
这解决了大多数情况,但我仍然收到以下错误:
ST_GeogFromText failed: Linestring should have at least two unique points, but had 1
如何使用 regex
过滤掉 所有 BigQuery 中的无效 LINESTRING?我不能使用 ST_NUMPOINTS()
,因为它需要一个 GEOGRAPHY
对象,如果字符串无效,我无法将其转换为 GEOGRAPHY
。
编辑:WKT LINESTRING 具有以下格式:LINESTRING (x1 y1, x2 y2, x3 y3, ..., xn yn)
其中每个 (xn, yn)
对代表第 n 个 Lat/Long 对。
尝试以下对原始正则表达式的扩展
WHERE REGEXP_CONTAINS(WKT, r'LINESTRING \((?:(?:\.\d+|\d+(?:\.\d*)?) (?:\.\d+|\d+(?:\.\d*)?)(?:, |\))){2,}')
不要使用 REGEXP - 它不可能捕获所有问题。例如。 WKT 的纬度可能大于 90 度,这会导致 ST_GeogFromText 失败,但几乎不可能在 REGEXP 中捕获。或者您可能有两个相同的点 LINESTRING (1 2, 1 2)
,这也是无效的 LineString。
改用SAFE prefix,当输入无效时,它会导致函数return NULL而不是查询失败。这给了你准确的验证!
select SAFE.ST_GeogFromText('foo')
NULL