BigQuery - ST_MAKEPOLYGON () завершается с ошибкой цикла многоугольника - PullRequest
1 голос
/ 16 апреля 2020

Я последовал за блестящим сообщением Как отловить ошибку ST_MAKEPOLYGON в BigQuery
, которая устраняет большинство проблем, но я все еще сталкиваюсь с пограничной ситуацией, когда ST_MAKEPOLYGONS () не работает с:

Недопустимый многоугольник l oop.

enter image description here

У меня вопрос двоякий.

  • Что означает сообщение об ошибке.
  • Как я могу обнаружить такую ​​ситуацию, чтобы избежать ошибок такого типа.

Я следовал совету в ссылочном посте, а также ввел еще одну меру пресечения, но все же столкнулся с проблемой.

-- remove invalid ratio
    SELECT * 
    FROM(SELECT *,
         SAFE_DIVIDE(ST_DISTANCE(centroid, anchor) , ST_DISTANCE(centroid, location)) AS ratio 
         FROM X4) 
         WHERE ratio BETWEEN -1 AND 1

1 Ответ

2 голосов
/ 16 апреля 2020

Что означает сообщение об ошибке.

Ошибка означает, что ввод функции недействителен, как определено Стандарты доступа к простым функциям (либо ISO или OG C версия). Многоугольник должен быть описан как оболочка (al oop без самопересечений) и необязательно отверстия (опять же, al oop без самопересечений, дыры не могут пересекать друг друга или оболочку).

У вас есть дубликаты вершин и, следовательно, самопересечения в l oop. Это часто означает цифру 8 oop. Это недопустимый многоугольник, такая форма должна быть описана двумя многоугольниками, с отдельным многоугольником, представляющим каждый круг в «8».

Т.е. POLYGON((0 0, 1 1, 2 0, 2 2, 1 1, 0 2, 0 0)) не является правильным, но MULTIPOLYGON(((0 0, 1 1, 0 2, 0 0)), ((1 1, 2 0, 2 2, 1 1))) является правильным, даже если некоторые инструменты могут показывать их одинаково.

То, как вы исправите этот ввод на практике, зависит от того, откуда поступают данные и как они генерируются. Если вы просто хотите обнаружить и обойти ошибку в нескольких строках, используйте SAFE.ST_MakePolygon - она ​​возвращает NULL вместо сбоя, поэтому по крайней мере другие строки будут в порядке.

...