Calculer le graphique de visibilité sur la sphère

9

J'ai une table PostGIS avec quelques polygones (stockés en utilisant le type de données géographiques). Ils représentent des régions sur une terre sphérique.

Pour chaque paire de sommets choisis parmi tous les polygones, je veux calculer si ces deux sommets sont "visibles" l'un pour l'autre. (Il existe n * ( n -1) / 2 paires de ce type, où n est le nombre total de sommets uniques sur tous les polygones du tableau.) Par «visibles les uns pour les autres», je veux dire que le chemin du grand cercle entre les deux sommets n'intersectent aucun des polygones du tableau.

Quel est le moyen le plus rapide de faire ce calcul, de préférence dans PostgreSQL / PostGIS?

J'ai quelque chose qui fonctionne, mais c'est lent. Je viens de parcourir naïvement toutes les paires et de voir si la chaîne de lignes entre elles intersecte des polygones. (Le type de données géographiques de PostGIS gère pour moi toutes les mathématiques difficiles de la sphère.) Je me demande donc s'il existe une structure de données ou un algorithme intelligent qui pourrait accélérer les choses.

csd
la source
6
Concepts pertinents: graphiques de visibilité et, si vous voulez faire ce travail en 2D au lieu de 3D, la projection Gnomonic .
whuber
"itérer sur toutes les paires" signifie que vous avez une boucle FOR dans la procédure qui teste si une ligne intersecte tous les polygones?. Si c'est le cas, c'est (probablement) plus rapide, il suffit de créer une table de chaînes de lignes avec toutes les combinaisons possibles et de faire une requête où vous testez si la ligne croise la table des polygones
simplexio
Pourriez-vous partager une illustration du problème.
addcolor
Vous pouvez exclure tout ce qui se trouve au-delà de l'horizon sphérique (plus le bit pour les objets hauts près du bord), ce qui se fait rapidement avec un cadre de délimitation approximatif des coordonnées. Sinon, je pense que c'est fondamentalement NP difficile.
AnserGIS

Réponses:

1

Déduisez ce qui n'est pas visible. Supposons que vous vous teniez à un sommet sur la plage, en regardant deux sommets éloignés d'un polygone voisin. Ensuite, vous pouvez supposer que tout sommet dans tout le secteur derrière ces sommets est invisible de ce sommet.

peter
la source