Erstellen von Gebäudeschatten mit ArcGIS Desktop?


20

Wie würden Sie Gebäudeschatten aus Gebäudefußabdrücken erzeugen?
Ich habe Attributwerte für die Gebäudehöhen.
Möchte also am liebsten, dass die Schattengrößen darauf basierend variieren.
Der beste Vorschlag für die Verwendung von ArcGIS sind Schlagschatten: http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx


2
ArcMap / Python-Code für eine Lösung finden Sie in der Fortsetzung unter gis.stackexchange.com/questions/19935/… .
Whuber

Können Sie bitte das Skript mit Python für das erste Beispiel bereitstellen, da ich den Schatten einiger Schattierungsgeräte identifizieren muss. Ihre Antwort wird sehr geschätzt

Antworten:


23

Eine schnelle und schmutzige Methode besteht darin, nur die Schatten der Gebäudedächer zu zeichnen, sie in Dunkelgrau zu rendern (vorzugsweise halbtransparent, wenn darunter liegende Grundschichten vorhanden sind) und die Gebäudepolygone darüber zu zeichnen. Die Dachschatten werden erhalten, indem die Gebäudepolygone um die durch die Gebäudehöhen bestimmten Abstände in die Richtung verschoben werden, die durch den Azimut und die Höhe der Lichtquelle (die als unendlich weit entfernt angesehen wird) festgelegt wird. (Eine Formel für den Übersetzungsbetrag wird unten angezeigt.)

Rohe Schatten

Dies funktioniert in der Regel einwandfrei, außer bei niedrigen Höhen oder hohen Gebäuden (z. B. Wolkenkratzern): Sehen Sie, wie die Schatten der höheren, isolierten Gebäude auf der rechten Seite von den Gebäuden selbst getrennt sind.

Um die Schatten ordnungsgemäß mit den Gebäuden zu verbinden, müssen Sie die Schatten der Gebäudewände einbeziehen. Das ist nicht schwer zu tun. Der Schatten der Wand, der sich zwischen einem Punkt bei P und einem anderen Punkt bei Q erstreckt, ist das durch {P, Q, Q ', P'} umrissene Viereck, wobei Q 'der Schatten von Q und P' der Schatten von ist P. Ein polygonales Gebäude ist eine Ansammlung zusammenhängender Polygone, die durch geschlossene Folgen von Punkten (P (1), P (2), ..., P (n)) dargestellt werden. Bilden Sie für jedes dieser Polygone die Vereinigung der Schatten der Kanten (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Dies ist mit einer Schlaufe über den Kanten einfach zu bewerkstelligen.

Für ein Licht mit einem Azimut von einem Grad (östlich von Norden) und eine Höhe von s Graden (vom Horizont), der Schatten eines Punkt P mit projizierten Koordinaten (x, y) und Höhe h (alle in den gleichen Einheiten ausgedrückt , wie Meter) liegt bei P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Sie müssen sin (a) / tan (s) und cos (a) / tan (s) nur einmal für die gesamte Ebene berechnen, und für jedes Polygon müssen Sie diese Faktoren nur einmal mit der Höhe multiplizieren, um die Offsets für zu erhalten jeder Punktschatten im Polygon. (Der tatsächliche Rechenaufwand wird vom GIS getragen, nicht von Ihrem Code, da er die Gewerkschaften aller dieser Vierecke bildet.)

Hier ist ein Beispiel für den Effekt. (Der Azimut und die Höhe haben sich im Vergleich zur ersten Figur geringfügig geändert, aber die Baupolygone und -höhen - die variieren - sind dieselben wie zuvor.)

Gute Schatten

Blinddarm

Als Antwort auf eine Anfrage sehen Sie hier den Code, der zum Erstellen des zweiten Beispiels verwendet wurde. Obwohl fast niemand mehr diese Sprache (Avenue) verwendet, könnte sie als Pseudocode für die Erstellung einer Lösung in Ihrem Lieblings-GIS dienen. (Im Gegensatz zu den meisten anderen Pseudocodes wurde es jedoch getestet, indem es tatsächlich ausgeführt wurde. :-) Es ist so einfach, dass keine Erklärung erforderlich ist. Beachten Sie jedoch, dass die Indizierung mit 0 und nicht mit 1 beginnt und dass Polygonringe explizit geschlossen werden (der letzte Punkt in der Liste stimmt mit dem ersten Punkt überein).

' 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
Wie sehen Gebäude mit Ringlöchern mit diesem Algorithmus aus? Ist es möglich, dass ein nicht beschatteter Bereich beispielsweise in einem Innenhof vorhanden ist, wenn Azimut- und Höhenwerte vorliegen, die dies im wirklichen Leben verursachen würden?
blah238

2
@Blah Ja. In meinen Beispielen sind einige Teilhöfe zu sehen, z. B. die Gebäudegruppen in der unteren linken Ecke.
whuber

Danke für die Hilfe. Ich nehme das gerade in die Hand. Irgendwelche Beispiele, wie man das umsetzt?
Achtzigzwanzig

5
@Eighty Ich gebe zu, dass ich diese Arbeit mit einer Feldberechnung in ArcView 3 mache: Es ist einfach, man kann das Skript schneller schreiben, als es zum Starten von ArcMap erforderlich ist :-), und es wird fast in kürzester Zeit ausgeführt. Das Ausgabe-Shapefile kann dann von ArcMap zum Rendern gelesen werden, wenn Sie möchten.
Whuber

2
Ich freue mich darauf, das Python-Skript zu sehen, das jemand zusammenstellt, damit dies in ArcMap funktioniert!
RyanDalton

3

Ich glaube nicht, dass das, worüber Sie sprechen (auf der Suche nach), eine Fähigkeit in arcmap (Version?) Sein wird.
Siehe diese Frage für die Einschränkung, die Sie wahrscheinlich nicht wollen.
Mit der Erweiterung "3d Analyst" und " Arcscene" können Sie Licht hinzufügen, aber es gibt immer noch einige Einschränkungen.
Es gibt eine gewisse Esri-Bewegung in Sachen Stadtmotor .
Scrollen Sie nach unten zum Bereich für die Schattengenauigkeit.
Ich war zuvor mit Lightscape in Verbindung gebracht worden (das in den Ruhestand getreten ist und ich bin mir sicher, dass ich innerhalb von 3dsmax weitermache).
Jetzt würde der Weg wahrscheinlich durch die Produktlinie Engineering Visualization führen ...
3ds Max


Vielen Dank für den Überblick über meine Optionen, Brad. Ich benutze Arc 10. Ich glaube nicht, dass ich unbedingt Licht brauche, ich brauche nur 2D-Formen für den Schatten-Footprint. Verbinde die Schattenform von den Ecken des Gebäudes, anstatt das Ergebnis eines Schlagschattens.
Achtzigzwanzig

Ich muss falsch gelesen haben. Ich dachte, Sie müssten den Schatten durch die Höhe bekommen, den eine Lichtquelle erzeugt.
Brad Nesom

2
Ich denke, ich kann die Größe der Schattenformen variieren, indem ich nur die Attributwerte für die Höhe der Gebäude verwende. Mein Problem scheint darin zu bestehen, einen Schatten zu erzeugen, der kein Schlagschatten ist, sondern ein Schatten, der tatsächlich mit den Ecken des Gebäudegrundrisses verbunden ist.
Achtzigzwanzig

1

Die 3D Analyst-Erweiterung verfügt über einige Tools ( Skyline und Skyline Barrier ) zum Erstellen von Silhouetten und Schattenvolumen. Sie wird jedoch wie in einer Skyline auf eine vertikale Ebene projiziert, sodass ich nicht sicher bin, wie oder ob sie leicht angepasst werden kann in diesem Fall (gegen eine horizontale Ebene, den Boden).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.