有效 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