有效 WKT 线串的正则表达式(在 BigQuery 中)?
Posted
技术标签:
【中文标题】有效 WKT 线串的正则表达式(在 BigQuery 中)?【英文标题】:Regex for valid WKT Linestrings (in BigQuery)? 【发布时间】:2019-10-30 17:56:24 【问题描述】:到目前为止,我有以下内容:
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
过滤掉 Google BigQuery 中的所有个无效 LINESTRING?我不能使用ST_NUMPOINTS()
,因为它需要一个GEOGRAPHY
对象,如果它无效,我无法将字符串转换为GEOGRAPHY
。
编辑:WKT LINESTRING 具有以下格式:LINESTRING (x1 y1, x2 y2, x3 y3, ..., xn yn)
其中每个 (xn, yn)
对代表第 n 个纬度/经度对。
【问题讨论】:
对于我们当中不知情的人:WKT
线串具有哪种结构?你能提供一些样品吗?
当然!我会相应地编辑问题,对此感到抱歉。
总而言之:我有一些看起来像这样的记录(LINESTRING (1.00 2.00)
),但它们应该有不止一对数字(像这样:LINESTRING (1.00 2.00, 3.00 4.00)
)
【参考方案1】:
不要使用 REGEXP - 它不可能解决所有问题。例如。 WKT 的纬度可能大于 90 度,这会导致 ST_GeogFromText 失败,但在 REGEXP 中几乎不可能捕获。或者你可能有两个相同的点LINESTRING (1 2, 1 2)
,这也是无效的 LineString。
改用SAFE prefix,它会导致函数在输入无效时返回NULL而不是查询失败。这会给你准确的验证!
select SAFE.ST_GeogFromText('foo')
NULL
【讨论】:
【参考方案2】:尝试以下扩展您的原始正则表达式
WHERE REGEXP_CONTAINS(WKT, r'LINESTRING \((?:(?:\.\d+|\d+(?:\.\d*)?) (?:\.\d+|\d+(?:\.\d*)?)(?:, |\)))2,')
【讨论】:
感谢您的回复。事实证明,使用SAFE
前缀对我的用例来说更健壮。此外,如果有人没有该选项,我发现使用 LINESTRING\s\((?:\-?\d1,3(?:\.\d+)?\s\-?\d1,3(?:\.\d+)?)(?:\,\s?\-?\d1,3(?:\.\d+)?\s\-?\d1,3(?:\.\d+)?)+\)
无论如何都更强大,因为它允许捕获可能的值,例如:LINESTRING (-10.00002 111.222222,2 -4,1.646373 -20.555)
。
当然,没问题。我很难想象你不知道 SAFE 前缀。所以我假设您专门寻找正则表达式选项。是的 - 看起来我错过了-?
来解决负值:o)以上是关于有效 WKT 线串的正则表达式(在 BigQuery 中)?的主要内容,如果未能解决你的问题,请参考以下文章