Produrre ombre da costruzione usando ArcGIS Desktop?


20

Come generereste le ombre da costruzione costruendo impronte?
Ho valori di attributo per le altezze degli edifici.
Quindi preferirei che le dimensioni delle ombre cambino in base a ciò.
Il miglior suggerimento che ho trovato usando ArcGIS è ombreggiature: http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx


2
Il codice ArcMap / Python per una soluzione è fornito nella continuazione all'indirizzo gis.stackexchange.com/questions/19935/… .
whuber

Potete per favore fornire lo script usando Python per il primo esempio, poiché devo identificare l'ombra di alcuni dispositivi di ombreggiatura. la tua risposta è molto apprezzata

Risposte:


23

Un metodo rapido e sporco è quello di disegnare solo le ombre dei tetti dell'edificio, renderle in grigio scuro (preferibilmente semitrasparente se ci sono strati di terreno sottostanti) e disegnare i poligoni dell'edificio su di essi. Le ombre del tetto sono ottenute traducendo i poligoni dell'edificio per le distanze determinate dalle altezze dell'edificio nella direzione stabilita dall'azimut e dall'altitudine della sorgente luminosa (considerata infinitamente lontana). (Di seguito viene visualizzata una formula per la quantità di traduzione.)

Ombre grezze

Questo tende a funzionare bene tranne che per le basse altitudini o gli edifici alti (come i grattacieli): guarda come le ombre degli edifici più alti e isolati sul lato destro sono separate dagli edifici stessi.

Per collegare correttamente le ombre agli edifici, è necessario includere le ombre dei muri degli edifici . Questo non è difficile da fare. L'ombra del muro che si estende tra un punto situato in P e un altro punto in Q sarà il quadrilatero delineato da {P, Q, Q ', P'} dove Q 'è l'ombra di Q e P' è l'ombra di P. Un edificio poligonale sarà una raccolta di poligoni collegati rappresentati da sequenze chiuse di punti (P ​​(1), P (2), ..., P (n)). Per ciascuno di questi poligoni, forma l'unione delle ombre dei bordi (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Questo è semplice da fare per mezzo di un cappio sui bordi.

Per una luce a un azimut di un grado (est del nord) e un'altitudine di s gradi (dall'orizzonte), l'ombra di un punto P con coordinate proiettate (x, y) e altezza h (tutte espresse nelle stesse unità , come metri) si trova in P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Devi solo calcolare sin (a) / tan (s) e cos (a) / tan (s) una volta per l'intero strato, e per ogni poligono devi solo moltiplicare quei fattori per l'altezza una volta per ottenere gli offset per ogni ombra del punto nel poligono. (Il vero carico di lavoro computazionale è portato dal GIS, non dal tuo codice, in quanto forma i sindacati di tutti questi quadrilateri.)

Ecco un esempio dell'effetto. (L'azimut e l'altitudine sono leggermente cambiati rispetto alla prima figura, ma i poligoni e le altezze dell'edificio - che variano - sono gli stessi di prima.)

Buone ombre

Appendice

In risposta a una richiesta, ecco il codice utilizzato per creare il secondo esempio. Sebbene quasi nessuno usi più questo linguaggio (Avenue), potrebbe anche servire come pseudocodice per creare una soluzione nel tuo GIS preferito. (A differenza della maggior parte degli pseudocodici, tuttavia, è stato testato eseguendolo effettivamente. :-) È così semplice che non dovrebbe essere necessaria alcuna spiegazione; tieni solo presente che l'indicizzazione inizia con 0, non 1 e che gli anelli poligonali sono esplicitamente chiusi (l'ultimo punto dell'elenco coincide con il primo punto).

' 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

1
Che aspetto hanno gli edifici con buchi di ciambella con questo algoritmo? Permette l'esistenza di un'area non ombreggiata, per esempio, in un cortile, dati i valori di azimut e altitudine che avrebbero causato questo nella vita reale?
blah238,

2
@Blah Sì. Puoi vedere alcuni cortili parziali nei miei esempi, come i gruppi di edifici nell'angolo in basso a sinistra.
whuber

Grazie per l'aiuto. Lo sto solo prendendo in questo momento. Qualche esempio di come implementarlo?
Ottanta,

5
@ Ottanta, confesso di fare questo lavoro con un calcolo sul campo in ArcView 3: è semplice, si può scrivere lo script più velocemente di quanto serve per avviare ArcMap :-), e si esegue in pochissimo tempo. Il file di forma di output può quindi essere letto da ArcMap per il rendering, se lo desideri.
whuber

2
Non vedo l'ora di vedere lo script Python che qualcuno mette insieme per farlo funzionare in ArcMap!
RyanKDalton-OffTheGridMaps

3

Non credo che ciò di cui stai parlando (cercando) sarà una capacità in arcmap (versione?)
Vedi questa domanda probabilmente per la limitazione che non vuoi.
Utilizzando l' estensione Analista 3d e l' arcoscene puoi aggiungere luce ma ci sono ancora alcune limitazioni.
C'è qualche movimento di esri sulla questione con il motore di città .
Scorri verso il basso fino alla sezione della precisione dell'ombra.
In precedenza sono stato associato a Lightscape (che è stato ritirato e sono sicuro che vive all'interno di 3dsmax).
Ora il percorso sarebbe probabilmente attraverso la linea di prodotti di visualizzazione di ingegneria ...
3ds Max


Grazie per il profilo delle mie opzioni, Brad. Sto usando Arc 10. Non penso di aver necessariamente bisogno di luce, ho solo bisogno di forme 2D per l'impronta dell'ombra che collega la forma dell'ombra dagli angoli dell'edificio piuttosto che il risultato prodotto da un'ombra esterna.
Ottanta,

Devo aver letto male. Ho pensato che per ottenere l'ombra in altezza avresti bisogno di quello generato da una fonte di luce.
Brad Nesom,

2
Penso di poter variare la dimensione delle forme d'ombra solo usando i valori degli attributi che ho per l'altezza degli edifici? Il mio problema sembra essere la creazione di un'ombra che non è un'ombra discendente, ma un'ombra che in realtà è collegata agli angoli dell'impronta dell'edificio.
Ottanta,

1

L'estensione 3D Analyst ha alcuni strumenti ( Skyline e Skyline Barrier ) per la produzione di sagome e volumi di ombre, ma è nel contesto di essere proiettata su un piano verticale come in uno skyline, quindi non sono sicuro di come o se possa essere facilmente adattato in questo caso (sporgendo su un piano orizzontale, il terreno).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.