Regex для действительных строк WKT Linestrings (в BigQuery)? - PullRequest
0 голосов
/ 30 октября 2019

Пока у меня есть следующее:

 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? Я не могу использовать ST_NUMPOINTS(), потому что он принимает объект GEOGRAPHY, и я не могу преобразовать строку в GEOGRAPHY, если она недействительна.

Редактировать: LINKSTRING WKT имеют следующий формат: LINESTRING (x1 y1, x2 y2, x3 y3, ..., xn yn), где каждая пара (xn, yn) представляет n-ю пару Lat / Long.

Ответы [ 2 ]

3 голосов
/ 31 октября 2019

Не используйте REGEXP - вряд ли все проблемы уловятся. Например, WKT может иметь широту больше 90 градусов, что вызывает сбой в ST_GeogFromText, но почти невозможно отловить в REGEXP. Или у вас могут быть две идентичные точки LINESTRING (1 2, 1 2), и это также недопустимо LineString.

Вместо этого используйте БЕЗОПАСНЫЙ префикс , поэтому функция возвращает NULL вместо неудачного запроса, когда ввод неверен,Это дает вам точное подтверждение!

select SAFE.ST_GeogFromText('foo')
NULL
1 голос
/ 30 октября 2019

Попробуйте ниже расширение вашего исходного регулярного выражения

WHERE REGEXP_CONTAINS(WKT, r'LINESTRING \((?:(?:\.\d+|\d+(?:\.\d*)?) (?:\.\d+|\d+(?:\.\d*)?)(?:, |\))){2,}')
...