Поле ГЕОГРАФИЯ не работает в одной таблице, работает в другой? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть две таблицы с одним столбцом GEOGRAPHY, в котором есть строка WRT для Polygon.Запрос по одной таблице работает хорошо, по другим возвращает все строки вместо одной.

Таблица с POLYGON в столбце GEOGRAPHY.Когда запрашивается ST_CONTAINS и одиночная точка возвращает ВСЕ строки вместо одной.Если я преобразую содержимое поля в строку, а затем вернусь в GEO, это будет работать, но ОЧЕНЬ МЕДЛЕННО.У меня есть другая похожая таблица, где она работает очень быстро для большего количества записей.

Запрос, который возвращает все записи:

SELECT count(1) FROM pur.sections WHERE ST_CONTAINS((POLYGON), ST_GEOGPOINT(-121.253763, 38.354874))

Запрос, который работает, но медленно - 23 секунды!:

SELECT polygon FROM pur.sections WHERE ST_CONTAINS(ST_GEOGFROMTEXT(ST_ASTEXT(POLYGON)), ST_GEOGPOINT(-121.253763, 38.354874))

Возвращает:

[
  {
    "polygon": "POLYGON((-121.241934066695 38.3649672043987, -121.241834795711 38.350891363934, -121.260351761597 38.3508607773966, -121.260367162138 38.3649633106378, -121.241934066695 38.3649672043987))"
  }
]

Таблица содержит 164 тыс. Строк.

Первый запрос, который очень быстро возвращает одну строку.

1 Ответ

1 голос
/ 12 июля 2019

У меня есть правдоподобное объяснение, как это могло произойти. Вероятно, проблема в происхождении полигонов:

https://cloud.google.com/bigquery/docs/gis-data#polygon_orientation

Если данные загружались в таблицу из файлов, BigQuery предполагал, что полигоны ориентированы в соответствии с правилом, описанным в этой ссылке:

если вы пересекаете границу многоугольника в порядке входных вершин, внутренняя часть многоугольника находится слева

Вероятно, полигоны имели неправильную ориентацию, и поэтому BigQuery интерпретировал их как огромные дополнительные полигоны, поэтому теперь ST_Contains большую часть времени возвращает true.

Во втором запросе вы печатаете многоугольник, а затем вызываете ST_GEOGFROMTEXT без параметра oriented, здесь BigQuery интерпретирует WKT как описание многоугольника с меньшей площадью, поэтому вы получите ожидаемые результаты.

Вы можете исправить таблицу (при условии, что все многоугольники меньше, чем полусфера, что, вероятно, и так), запустив:

CREATE OR REPLACE pur.sections AS 
SELECT * EXCEPT(POLYGON), ST_GEOGFROMTEXT(ST_ASTEXT(POLYGON)) AS POLYGON
FROM pur.sections

После чего вы должны получить ожидаемый результат от более простого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...