Обчислити графік видимості по сфері


9

У мене є таблиця PostGIS з деякими багатокутниками (зберігається з використанням типу даних географії). Вони представляють регіони на сферичній землі.

Для кожної пари вершин, вибраних серед усіх многокутників, я хочу обчислити, чи є ці дві вершини "видимими" один для одного. (Є n * ( n -1) / 2 таких пар, де n - загальна кількість унікальних вершин по всіх багатокутниках у таблиці.) "Видно один одному", я маю на увазі, що шлях великого кола між дві вершини не перетинає жоден з многокутників таблиці.

Який найшвидший спосіб зробити це обчислення, бажано в PostgreSQL / PostGIS?

У мене щось працює, але це повільно. Я просто наївно повторюю всі пари і бачу, чи LineString між ними перетинає якісь багатокутники. (Тип даних географії PostGIS обробляє всю важку математику для сфери для мене.) Тому мені цікаво, чи є розумна структура даних або алгоритм, який може прискорити роботу.


6
Відповідні поняття: графіки видимості та, якщо ви хочете виконати цю роботу в 2D замість 3D, проекція Gnomonic .
whuber

чи "ітерація над усіма парами" означає, що у вас є цикл FOR в процесі перевірки, якщо одна лінія перетинає всі багатокутники ?. Якщо так, то (напевно) швидше просто створіть таблицю рядків рядків з усіма можливими комбінаціями та зробіть один запит, де ви перевіряєте, чи перетинає рядок таблицю полігону
simplexio

Не могли б ви поділитися ілюстрацією проблеми.
addcolor

Ви можете виключити все, що знаходиться за сферичним горизонтом (плюс біт для високих об'єктів біля краю), що швидко робиться за допомогою приблизного обмежувального поля координат. Інакше я думаю, що це принципово НП важко.
AnserGIS

Відповіді:


1

Виведіть те, що не видно. Припустимо, ви стоїте біля вершини на пляжі, дивлячись на дві віддалені вершини сусіднього багатокутника. Тоді ви можете припустити, що будь-яка вершина в цілому секторі за цими вершинами невидима з цієї вершини.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.