Tworzysz cienie budynków za pomocą ArcGIS Desktop?

20

Jak wygenerowałbyś cienie budynków na podstawie śladów budynków?
Mam wartości atrybutów wysokości budynków.
Dlatego najlepiej byłoby, gdyby rozmiary cieni różniły się w zależności od tego.
Najlepszą propozycją, którą znalazłem za pomocą ArcGIS, są cienie: http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx

Osiemdziesiąt Dwadzieścia
źródło
2
Kod ArcMap / Python rozwiązania jest w przedłużeniu w gis.stackexchange.com/questions/19935/... .
whuber
Czy możesz podać skrypt za pomocą Pythona w pierwszym przykładzie, ponieważ muszę zidentyfikować odcień niektórych urządzeń zacieniających. Twoja odpowiedź jest bardzo mile

Odpowiedzi:

23

Szybką i brudną metodą jest rysowanie cieni tylko dachów budynków, renderowanie ich w kolorze ciemnoszarym (najlepiej półprzezroczystym, jeśli znajdują się pod nimi warstwy gruntu) i rysowanie na nich wielokątów budynku. Cienie dachu są uzyskiwane przez przełożenie wielokątów budynku na odległości określone wysokościami budynków w kierunku ustalonym przez azymut i wysokość źródła światła (uważane za nieskończenie daleko). (Poniżej znajduje się wzór na ilość tłumaczeń.)

Surowe cienie

Zwykle działa to dobrze, z wyjątkiem niskich wysokości lub wysokich budynków (takich jak drapacze chmur): zobacz, jak cienie wyższych izolowanych budynków po prawej stronie są oddzielone od samych budynków.

Aby prawidłowo połączyć cienie z budynkami, musisz uwzględnić cienie ścian budynku . Nie jest to trudne. Cień ściany rozciągający się między punktem położonym w punkcie P a innym punktem położonym w punkcie Q będzie czworobokiem wyznaczonym przez {P, Q, Q ', P'}, gdzie Q 'jest cieniem Q, a P' jest cieniem P. Wieloboczny budynek będzie zbiorem połączonych wielokątów reprezentowanych przez zamknięte sekwencje punktów (P (1), P (2), ..., P (n)). Dla każdego takiego wielokąta utwórz połączenie cieni krawędzi (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Można to zrobić za pomocą pętli na krawędziach.

Dla światła na azymut a ° (wschód od północy) i wysokości s stopni (od Horizon), cień punktu P z przewidywanymi współrzędnych (x, y), a wysokość h (wszystko wyrażone w takich samych jednostkach , takie jak metry) znajduje się w punkcie P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Musisz obliczyć sin (a) / tan (s) i cos (a) / tan (s) tylko raz dla całej warstwy, a dla każdego wielokąta wystarczy tylko pomnożyć te czynniki przez wysokość, aby uzyskać przesunięcia dla każdy punkt cienia w wielokącie. (Rzeczywiste obciążenie obliczeniowe jest przenoszone przez GIS, a nie twój kod, ponieważ tworzy związki wszystkich tych czworoboków).

Oto przykład efektu. (Azymut i wysokość zmieniły się nieznacznie w porównaniu z pierwszą figurą, ale wielokąty i wysokości budynków - które się różnią - są takie same jak wcześniej.)

Dobre cienie

dodatek

W odpowiedzi na żądanie oto kod użyty do utworzenia drugiego przykładu. Chociaż prawie nikt już nie używa tego języka (Avenue), może on również służyć jako pseudokod do tworzenia rozwiązania w twoim ulubionym GIS. (W przeciwieństwie do większości pseudokodów, został on jednak przetestowany przez jego uruchomienie. :-) Jest to tak proste, że nie trzeba go tłumaczyć; pamiętaj tylko, że indeksowanie zaczyna się od 0, a nie 1, i że pierścienie wielokątów są jawnie zamknięte (ostatni punkt na liście pokrywa się z pierwszym punktem).

' 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
źródło
1
Jak wyglądają budynki z otworami na pączki przy użyciu tego algorytmu? Czy pozwala istnieć obszar bez cieni, powiedzmy, na dziedzińcu, biorąc pod uwagę wartości azymutu i wysokości, które spowodowałyby to w prawdziwym życiu?
blah238,
2
@Blah Tak. W moich przykładach można zobaczyć częściowe dziedzińce, takie jak grupy budynków w lewym dolnym rogu.
whuber
Dzięki za pomoc. Właśnie to odbieram. Jakieś przykłady tego, jak to wdrożyć?
EightyTwenty
5
@Eighty Przyznaję się do wykonania tej pracy z obliczeniem pola w ArcView 3: to proste, można napisać skrypt szybciej niż potrzeba, aby uruchomić ArcMap :-), i wykonuje się go w krótkim czasie. Wyjściowy plik kształtów może być następnie odczytany przez ArcMap do renderowania, jeśli chcesz.
whuber
2
Nie mogę się doczekać, aby zobaczyć skrypt w języku Python, który ktoś stworzy, aby działał w ArcMap!
RyanKDalton-OffTheGridMaps
3

Nie sądzę, że to, o czym mówisz (szukasz), będzie możliwe w arcmap (wersja?)
Zobacz to pytanie, aby zobaczyć prawdopodobnie ograniczenie, którego nie chcesz.
Korzystając z rozszerzenia 3d Analyst i arcscene , możesz dodać światło, ale nadal istnieją pewne ograniczenia.
W mieście występuje pewien ruch esri .
Przewiń w dół do sekcji dokładności cienia.
Wcześniej byłem związany z Lightscape (który został wycofany i jestem pewien, że żyje wewnątrz 3dsmax).
Teraz ścieżka prawdopodobnie prowadziłaby przez linię produktów do wizualizacji inżynierskiej ...
3ds Max

Brad Nesom
źródło
Dzięki za zarys moich opcji, Brad. Używam Arc 10. Nie sądzę, że potrzebuję światła, po prostu potrzebuję kształtów 2D, aby ślad cienia łączył kształt cienia z narożników budynku, a nie wynik wytworzony przez cień.
EightyTwenty
Musiałem źle odczytać. Pomyślałem, aby uzyskać cień według wysokości, który byłby potrzebny przez źródło światła.
Brad Nesom,
2
Myślę, że mogę zmieniać rozmiar kształtów cienia, korzystając tylko z wartości atrybutów, które mam dla wysokości budynków? Moim problemem wydaje się być tworzenie cienia, który nie jest cieniem upuszczającym, ale cieniem, który faktycznie jest połączony z narożnikami śladu budynku.
EightyTwenty
1

Rozszerzenie 3D Analyst ma pewne narzędzia ( Skyline i Bariera Skyline ) do tworzenia sylwetek i objętości cieni, ale jest to w kontekście projekcji na płaszczyznę pionową, jak na linii horyzontu, więc nie jestem pewien, jak lub czy można ją łatwo dostosować w tym przypadku (rzut na płaszczyznę poziomą, ziemię).

blah238
źródło