У меня есть таблица PostGIS с некоторыми полигонами (хранится с использованием типа данных географии). Они представляют регионы на сферической земле.
Для каждой пары вершин, выбранных из всех многоугольников, я хочу вычислить, являются ли эти две вершины «видимыми» друг другу. (Существует n * ( n -1) / 2 таких пар, где n - общее количество уникальных вершин во всех многоугольниках в таблице.) Под «видимыми друг другу» я подразумеваю, что путь большого круга между две вершины не пересекаются ни с одним из многоугольников в таблице.
Какой самый быстрый способ сделать это вычисление, предпочтительно в PostgreSQL / PostGIS?
У меня есть кое-что, что работает, но это медленно. Я просто наивно перебираю все пары и вижу, пересекает ли LineString между ними многоугольники. (Географический тип данных PostGIS обрабатывает всю сложную математику для сферы.) Поэтому мне интересно, есть ли умная структура данных или алгоритм, который мог бы ускорить процесс.
Ответы:
Выведите что не видно. Предположим, вы стоите в вершине на пляже и смотрите на две удаленные вершины соседнего многоугольника. Тогда вы можете предположить, что любая вершина во всем секторе за этими вершинами невидима из этой вершины.
источник