Produire des ombres de construction à l'aide d'ArcGIS Desktop?

20

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

EightyTwenty
la source
2
Le code ArcMap / Python pour une solution est fourni dans la suite à gis.stackexchange.com/questions/19935/… .
whuber
Pouvez-vous s'il vous plaît fournir le script en utilisant python pour le premier exemple car j'ai besoin d'identifier la nuance de certains périphériques d'ombrage. votre réponse est très appréciée

Réponses:

23

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

Ombres brutes

Cela a tendance à fonctionner correctement, sauf pour les basses altitudes ou les grands bâtiments (tels que les gratte-ciel): voyez comment les ombres des bâtiments isolés les plus hauts du 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 des murs du bâtiment . 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 bords (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). C'est simple à faire au moyen d'une boucle sur les bords.

Pour une lumière selon un azimut de un degré (est du nord) et une altitude de s degrés ( à partir de l'horizon), l'ombre d'un point P de coordonnées projetées (x, y) et de hauteur h (toutes exprimées dans les mêmes unités , comme les mètres) est situé à P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Il suffit de calculer sin (a) / tan (s) et cos (a) / tan (s) une fois pour toute la couche, et pour chaque polygone, il suffit de multiplier ces facteurs par la hauteur une fois pour obtenir les décalages pour chaque ombre ponctuelle dans le polygone. (La véritable charge de travail informatique est supporté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 des bâtiments - qui varient - sont les mêmes qu'avant.)

Bonnes ombres

appendice

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

' S
' Return the shadow of a shape.

' Field calculator example:
' av.run("S", {[shape], [height], 200, 35})
'======================================================================'
theShape = SELF.Get(0) ' A projected polygon
xHeight = SELF.Get(1)  ' Expressed in the projected units
xAzimuth = SELF.Get(2).AsRadians  ' Any angle (in degrees) east of north
xAltitude = SELF.Get(3).AsRadians ' Angle between 0 and 90 (vertical)
'
' Compute the shadow offsets.
'
xSpread = 1/xAltitude.Tan
x = -xHeight * xSpread * xAzimuth.Sin
y = -xHeight * xSpread * xAzimuth.Cos
xy = x@y
'
' Begin with the original shape.
'
p = theShape.Clone
'
' Adjoin the wall shadows.
'
for each lPts in theShape.AsList   ' Loop over the rings
  for each i in 1..(lPts.Count-1)  ' Loop over edges in this ring
    l = {lPts.Get(i-1), lPts.Get(i), lPts.Get(i)+xy, lPts.Get(i-1)+xy}
    p = p.ReturnUnion(Polygon.Make({l}))
  end
end
return p
' end of script
whuber
la source
1
À quoi ressemblent les bâtiments avec des trous de donut avec cet algorithme? Est-ce que cela permet à une zone non ombragée d'exister dans, disons, une cour, étant donné des valeurs d'azimut et d'altitude qui provoqueraient cela dans la vie réelle?
blah238
2
@Blah Oui. Vous pouvez voir quelques cours partielles dans mes exemples, comme les groupes de bâtiments dans le coin inférieur gauche.
whuber
Merci pour l'aide. Je ne fais que reprendre ça maintenant. Des exemples de la façon de mettre en œuvre cela?
EightyTwenty
5
@Eighty J'avoue avoir fait ce travail avec un calcul de champ dans ArcView 3: c'est simple, on peut écrire le script plus vite qu'il ne faut pour démarrer ArcMap :-), et il s'exécute en un rien de temps. Le fichier de formes en sortie peut ensuite être lu par ArcMap pour le rendu si vous le souhaitez.
whuber
2
J'ai hâte de voir le script Python que quelqu'un a créé pour que cela fonctionne dans ArcMap!
RyanKDalton-OffTheGridMaps
3

Je ne pense pas que ce dont vous parlez (cherchez) 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 y a encore quelques limitations.
Il y a un certain mouvement esri sur la question 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

Brad Nesom
la source
Merci pour le plan de mes options, Brad. J'utilise Arc 10. Je ne pense pas que j'ai nécessairement besoin de lumière, j'ai juste besoin de formes 2D pour que l'empreinte de l'ombre relie la forme de l'ombre des coins du bâtiment plutôt que le résultat produit par une ombre portée.
EightyTwenty
Je dois avoir mal lu. Je pensais que pour obtenir l'ombre en hauteur, vous auriez besoin de celle générée par une source de lumière.
Brad Nesom
2
Je pense que je peux varier la taille des formes d'ombre en utilisant simplement les valeurs d'attribut que j'ai pour la hauteur des bâtiments? Mon problème semble être de créer une ombre qui n'est pas une ombre portée, mais une ombre qui est en fait connectée aux coins de l'empreinte du bâtiment.
EightyTwenty
1

L'extension 3D Analyst dispose de certains 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 un skyline, donc je ne sais pas comment ni s'il pourrait être facilement adapté dans ce cas (projetant contre un plan horizontal, le sol).

blah238
la source