Produzindo sombras de construção usando o ArcGIS Desktop?

20

Como você geraria sombras de construção a partir de pegadas?
Eu tenho valores de atributo para as alturas dos edifícios.
Então, de preferência, o tamanho das sombras varia com base nisso.
A melhor sugestão que encontrei usando o ArcGIS é sombras: http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx

Oitenta e vinte
fonte
2
O código ArcMap / Python para uma solução é fornecido na continuação em gis.stackexchange.com/questions/19935/… .
whuber
Você pode fornecer o script usando python para o primeiro exemplo, pois preciso identificar a sombra de alguns dispositivos de sombreamento. sua resposta é muito apreciada

Respostas:

23

Um método rápido e sujo é desenhar apenas as sombras dos telhados dos edifícios, transformá-los em cinza escuro (de preferência semitransparentes se houver camadas de solo subjacentes) e desenhar os polígonos do edifício sobre eles. As sombras do telhado são obtidas traduzindo os polígonos do edifício pelas distâncias determinadas pelas alturas do edifício na direção estabelecida pelo azimute e pela altitude da fonte de luz (considerada infinitamente distante). (Uma fórmula para a quantidade de tradução aparece abaixo.)

Sombras brutas

Isso tende a funcionar bem, exceto em baixas altitudes ou prédios altos (como arranha-céus): veja como as sombras dos prédios mais altos e isolados no lado direito são separadas dos prédios.

Para conectar as sombras adequadamente aos edifícios, você precisa incluir as sombras das paredes do edifício . Isso não é difícil de fazer. A sombra da parede que se estende entre um ponto localizado em P e outro ponto localizado em Q será o quadrilátero delineado por {P, Q, Q ', P'} onde Q 'é a sombra de Q e P' é a sombra de P. Um edifício poligonal será uma coleção de polígonos conectados, representados por seqüências fechadas de pontos (P (1), P (2), ..., P (n)). Para cada um desses polígonos, forme a união das sombras das arestas (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Isso é fácil de fazer por meio de um loop sobre as bordas.

Para uma luz com um azimute de um graus (leste do norte) e uma altitude de S graus (a partir do horizonte), a sombra de um ponto P com coordenadas projectadas (x, y) e a altura h (todos expressos nas mesmas unidades , como metros), está localizado em P '= (x - h sen (a) / tan (s), y - h cos (a) / tan (s)). Você só precisa calcular sin (a) / tan (s) e cos (a) / tan (s) uma vez para toda a camada, e para cada polígono, você só precisa multiplicar esses fatores pela altura uma vez para obter as compensações para cada sombra de ponto no polígono. (A carga de trabalho computacional real é transportada pelo GIS, não pelo seu código, pois forma as uniões de todos esses quadriláteros.)

Aqui está um exemplo do efeito. (O azimute e a altitude mudaram ligeiramente em comparação com a primeira figura, mas os polígonos e alturas dos edifícios - que variam - são os mesmos de antes.)

Boas sombras

Apêndice

Em resposta a uma solicitação, aqui está o código usado para criar o segundo exemplo. Embora quase ninguém mais use esse idioma (Avenue), ele poderia servir como pseudocódigo para criar uma solução em seu GIS favorito. (Diferente da maioria dos pseudocódigos, no entanto, ele foi testado com a execução. :-) É tão simples que nenhuma explicação deve ser necessária; apenas lembre-se de que a indexação começa com 0, não 1, e que os anéis dos polígonos são explicitamente fechados (o último ponto da lista coincide com o primeiro).

' 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
fonte
1
Como os edifícios com orifícios de rosca se parecem com esse algoritmo? Permite que exista uma área não sombreada em, digamos, um pátio, dados os valores de azimute e altitude que causariam isso na vida real?
blah238
2
@Blah Yes. Você pode ver alguns pátios parciais em meus exemplos, como os grupos de edifícios no canto inferior esquerdo.
whuber
Obrigado pela ajuda. Eu só estou pegando isso agora. Algum exemplo de como implementar isso?
EightyTwenty
5
@ Oitenta, confesso que faço esse trabalho com um cálculo de campo no ArcView 3: é simples, é possível escrever o script mais rápido do que o necessário para iniciar o ArcMap :-), e ele é executado quase em pouco tempo. O shapefile de saída pode ser lido pelo ArcMap para renderização, se você quiser.
whuber
2
Estou ansioso para ver o script Python que alguém cria para fazer isso funcionar no ArcMap!
RyanKDalton-OffTheGridMaps
3

Eu não acho que o que você está falando (procurando) será uma capacidade de captura no arcmap (versão?)
Veja esta pergunta para provavelmente a limitação que você não está querendo.
Utilizando a extensão e o arcscene do 3d Analyst, você pode adicionar luz, mas ainda existem algumas limitações.
Há algum movimento esri sobre o assunto com o motor da cidade .
Role para baixo até a seção de precisão das sombras.
Eu já havia sido associado ao lightscape (que foi aposentado e tenho certeza que mora dentro do 3dsmax).
Agora, o caminho provavelmente seria através da linha de produtos de visualização de engenharia ...
3ds Max

Brad Nesom
fonte
Obrigado pelo resumo das minhas opções, Brad. Estou usando o Arc 10. Acho que não preciso necessariamente de luz, só preciso de formas 2D para que a pegada da sombra conecte a forma da sombra dos cantos do edifício ao invés do resultado produzido por uma sombra projetada.
EightyTwenty
Eu devo ter lido errado. Eu pensei que, para obter a sombra em altura, você precisaria daquela gerada por uma fonte de luz.
precisa
2
Acho que posso variar o tamanho das formas das sombras usando apenas os valores de atributo que tenho para a altura dos edifícios? Meu problema parece estar na criação de uma sombra que não é uma sombra projetada, mas sim uma sombra que está realmente conectada aos cantos da área de construção.
EightyTwenty
1

A extensão 3D Analyst possui algumas ferramentas ( Skyline e Skyline Barrier ) para produzir silhuetas e volumes de sombra, mas está no contexto de ser projetada em um plano vertical como em um skyline, então não tenho certeza de como ou se poderia ser facilmente adaptado para este caso (projetando contra um plano horizontal, o solo).

blah238
fonte