Suite

Produire des ombres de bâtiment à l'aide d'ArcGIS Desktop ?

Produire des ombres de bâtiment à l'aide d'ArcGIS Desktop ?


Comment généreriez-vous des ombres de bâtiment à partir des empreintes de bâtiment ?
J'ai des valeurs d'attribut pour les hauteurs des bâtiments.
J'aimerais donc de préférence que la taille des ombres varie en fonction de cela.
La meilleure suggestion que j'ai trouvée en utilisant ArcGIS est celle des ombres portées : http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx


Une méthode rapide et sale consiste à dessiner uniquement les ombres des toits des bâtiments, à les rendre en gris foncé (de préférence semi-transparent s'il existe des couches de sol sous-jacentes) et à dessiner les polygones de construction par-dessus. Les ombres du toit sont obtenues en traduisant les polygones du bâtiment par les distances déterminées par les hauteurs des bâtiments dans la direction établie par l'azimut et l'altitude de la source lumineuse (considérée comme infiniment lointaine). (Une formule pour le montant de la traduction apparaît ci-dessous.)

Cela a tendance à fonctionner correctement, sauf pour les basses altitudes ou les grands bâtiments (comme les gratte-ciel) : voyez comment les ombres des bâtiments isolés les plus hauts sur le côté droit sont séparées des bâtiments eux-mêmes.

Pour connecter correctement les ombres aux bâtiments, vous devez inclure les ombres du bâtiment des murs. Ce n'est pas difficile à faire. L'ombre du mur s'étendant entre un point situé en P et un autre point situé en Q sera le quadrilatère délimité par {P, Q, Q', P'} où Q' est l'ombre de Q et P' est l'ombre de P. Un bâtiment polygonal sera une collection de polygones connectés représentés par des séquences fermées de points (P(1), P(2),… , P(n)). Pour chacun de ces polygones, formez l'union des ombres des arêtes (P(1), P(2)), (P(2), P(3)),… , (P(n), P(1) ). Ceci est simple à faire au moyen d'une boucle sur les bords.

Pour une lumière à un azimut de une degrés (à l'est du nord) et une altitude de s degrés (depuis l'horizon), l'ombre d'un point P avec les coordonnées projetées (x,y) et la hauteur h (tous exprimés dans les mêmes unités, comme les mètres) est situé à P' = (x - hsin(a)/tan(s), y - hcos(a)/tan(s)). Vous n'avez qu'à calculer sin(a)/tan(s) et cos(a)/tan(s) une fois pour toute la couche, et pour chaque polygone, vous n'avez qu'à multiplier ces facteurs par la hauteur une fois pour obtenir les décalages pour chaque point d'ombre dans le polygone. (La vraie charge de travail de calcul est portée par le SIG, pas par votre code, car il forme les unions de tous ces quadrilatères.)

Voici un exemple de l'effet. (L'azimut et l'altitude ont légèrement changé par rapport à la première figure, mais les polygones et les hauteurs du bâtiment - qui varient - sont les mêmes qu'auparavant.)

Annexe

En réponse à une requête, voici le code utilisé pour créer le deuxième exemple. Bien que presque plus personne n'utilise ce langage (Avenue), il pourrait bien servir de pseudo-code pour créer une solution dans votre SIG préféré. (Contrairement à la plupart des pseudocodes, cependant, il a été testé en l'exécutant réellement. :-) C'est si simple qu'aucune explication ne devrait être nécessaire ; sachez simplement que l'indexation commence par 0, pas 1, et que les anneaux de polygone sont explicitement fermés (le dernier point de la liste coïncide avec le premier point).

' S ' Renvoie l'ombre d'une forme. ' Exemple de calculateur de champ : ' av.run("S", {[forme], [hauteur], 200, 35}) '===================== =================================================' theShape = SELF.Get(0) ' Un polygone projeté xHeight = SELF.Get(1) ' Exprimé dans les unités projetées xAzimuth = SELF.Get(2).AsRadians ' Tout angle (en degrés) à l'est du nord xAltitude = SELF. Get(3).AsRadians 'Angle entre 0 et 90 (vertical)"Calculez les décalages d'ombre. 'xSpread = 1/xAltitude.Tan x = -xHeight * xSpread * xAzimuth.Sin y = -xHeight * xSpread * xAzimuth.Cos xy = [email protected]"Commencez par la forme d'origine. ' p = theShape.Clone"Adjoin the wall shadows. ' for each lPts in theShape.AsList ' Boucle sur les anneaux pour chaque i en 1… (lPts.Count-1) ' Boucle sur les bords de cet anneau l = {lPts. Obtenir(i-1), lPts.Get(i), lPts.Get(i)+xy, lPts.Get(i-1)+xy} p = p.ReturnUnion(Polygon.Make({l})) end fin retour p ' fin de script

Je ne pense pas que ce dont vous parlez (recherchez) va être une capacité dans arcmap (version?)
Voir cette question pour probablement la limitation que vous ne voulez pas.
En utilisant l'extension 3d Analyst et l'arcscene, vous pouvez ajouter de la lumière, mais il existe encore des limitations.
Il y a un certain mouvement esri sur le sujet avec cityengine.
Faites défiler jusqu'à la section de précision de l'ombre.
J'ai déjà été associé à lightscape (qui a été retiré et je suis sûr qu'il vit à l'intérieur de 3dsmax).
Maintenant, le chemin serait probablement à travers la gamme de produits de visualisation d'ingénierie…
3ds max


L'extension 3D Analyst a quelques outils (Skyline et Skyline Barrier) pour produire des silhouettes et des volumes d'ombre mais c'est dans le contexte d'être projeté contre un plan vertical comme dans une ligne d'horizon, donc je ne sais pas comment ou si cela pourrait être facilement adapté à ce cas (projection contre un plan horizontal, le sol).