Un método rápido y sucio es dibujar sólo las sombras de los tejados de los edificios, renderizarlos en gris oscuro (preferiblemente semitransparentes si hay alguna capa de suelo subyacente) y dibujar los polígonos de los edificios sobre ellos. Las sombras de los tejados se obtienen trasladando los polígonos de los edificios las distancias determinadas por las alturas de los edificios en la dirección establecida por el acimut y la altitud de la fuente de luz (que se considera infinitamente lejana). (Más adelante aparece una fórmula para la cantidad de traslación).
Esto suele funcionar bien, excepto en altitudes bajas o edificios altos (como rascacielos): observe cómo las sombras de los edificios aislados más altos de la derecha se separan de los propios edificios.
Para conectar correctamente las sombras a los edificios, es necesario incluir las sombras del edificio paredes. No es difícil. La sombra de la pared que se extiende entre un punto situado en P y otro punto situado en Q será el cuadrilátero delineado por {P, Q, Q', P'} donde Q' es la sombra de Q y P' es la sombra de P. Un edificio poligonal será una colección de polígonos conectados representados por secuencias cerradas de puntos (P(1), P(2), ..., P(n)). Para cada uno de estos polígonos, formaremos la unión de las sombras de las aristas (P(1), P(2)), (P(2), P(3)), ..., (P(n), P(1)). Esto es sencillo de hacer mediante un bucle sobre las aristas.
Para una luz a un acimut de a grados (este del norte) y una altitud de s grados (desde el horizonte), la sombra de un punto P con coordenadas proyectadas (x,y) y altura h (todos expresados en las mismas unidades, como metros) se encuentra en P' = (x - h sen(a)/tan(s), y - h cos(a)/tan(s)). Sólo tienes que calcular sin(a)/tan(s) y cos(a)/tan(s) una vez para toda la capa, y para cada polígono sólo tienes que multiplicar esos factores por la altura una vez para obtener los desplazamientos para cada sombra de punto en el polígono. (La verdadera carga de trabajo computacional la lleva el SIG, no tu código, al formar las uniones de todos estos cuadriláteros).
He aquí un ejemplo del efecto. (El acimut y la altitud han cambiado ligeramente con respecto a la primera figura, pero los polígonos de los edificios y las alturas -que varían- son los mismos que antes).
Anexo
En respuesta a una petición, aquí está el código utilizado para crear el segundo ejemplo. Aunque ya casi nadie utiliza este lenguaje (Avenue), bien podría servir como pseudocódigo para crear una solución en su SIG favorito. (Sin embargo, a diferencia de la mayoría de los pseudocódigos, se ha probado ejecutándolo realmente. :-) Es tan sencillo que no debería ser necesaria ninguna explicación; sólo tenga en cuenta que la indexación empieza por 0, no por 1, y que los anillos de polígonos están explícitamente cerrados (el último punto de la lista coincide con el primer 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
2 votos
El código ArcMap/Python para una solución se proporciona en la continuación en gis.stackexchange.com/questions/19935/ .
0 votos
¿Puede usted por favor proporcionar la secuencia de comandos utilizando python para el primer ejemplo que necesito para identificar la sombra de algunos dispositivos de sombreado. su respuesta es muy apreciada