Comment trouver les bâtiments (polygones) qu'un utilisateur peut voir à partir d'un emplacement (point) et d'une orientation (plage angulaire) donnés?

10

Je voudrais récupérer l'ensemble des bâtiments que je peux voir à partir d'un emplacement donné (point -lat, lng) et de l'orientation (intervalle d'angles) + certainement avec une profondeur donnée (par exemple 100 mètres). Idéalement, je voudrais en sortie quelque chose comme: de l'angle 1 à l'angle2, l'utilisateur peut voir le bâtiment 1, de l'angle 2 à l'angle3, nous voyons le bâtiment 2.

Données = Polygones représentant les bâtiments d'une ville dans un fichier de formes.

entrée: un emplacement et une orientation (plage d'angles) pour représenter la perception visuelle d'une personne.

sortie :
Version 1 - une liste de {BuildingID}
Version 2 (meilleure) - liste de {BuildingID, ensemble de segments visibles pour chaque bâtiment (façade de bâtiments)}
Version 3 (sortie idéale) - une liste de {buildingID, plages d'angles }. (par exemple, de l'angle 1 à l'angle2, l'utilisateur peut voir le bâtiment 1, de l'angle 2 à l'angle3, nous voyons le bâtiment 2, etc.)

Boîte à outils que je peux utiliser: PostGis, QGis, ruby, R

début de la solution pour la sortie v1:
- création d'un triangle représentant la portée visuelle simplifiée de l'utilisateur pour un point et une orientation donnés (intervalle d'angle) et avec un certain rayon / profondeur (par exemple 100 mètres)
- calcul de l'intersection avec des bâtiments (par exemple ST_INTERSECTION ) et la portée visuelle. mais un bâtiment peut en cacher un autre, de sorte que l'intersection pure entre la portée visuelle et les bâtiments peut n'ajouter aucun bâtiment visible. cette question doit être abordée.

mise à jour: solution potentielle 2 - créer un triangle représentant la portée visuelle simplifiée de l'utilisateur pour un point et une orientation donnés (intervalle d'angle) et avec un certain rayon / profondeur (par exemple 100 mètres) - créer n rayons (LIGNE) à différents angles remplir les portées.
- transformer tous les bâtiments (POLYGONS) en SEGMENTS / LIGNES
- pour chaque rayon trouver le SEGMENT le plus proche et l'ID de bâtiment associé. (ST_DISTANCE, ST_DWithin)
à ce stade, nous devrions donc avoir une liste de rayons et l'ID du bâtiment associé.
- alors nous pourrions agréger cette liste {gammes d'angle, ID de bâtiment associé}.

Une idée d'une façon plus efficace de faire?

nmaisonn
la source

Réponses: