20 votos

¿Producir sombras de edificios con ArcGIS Desktop?

¿Cómo se generan las sombras de los edificios a partir de sus huellas?
Tengo valores de atributo para las alturas de los edificios.
Así que preferiría que el tamaño de las sombras variara en función de eso.
La mejor sugerencia que he encontrado utilizando ArcGIS son las sombras paralelas: http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx

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

23voto

cjstehno Puntos 131

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).

Crude shadows

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).

Good shadows

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

1 votos

¿Cómo se ven los edificios con agujeros de donut con este algoritmo? ¿Permite que exista una zona sin sombra en, digamos, un patio, dados los valores de acimut y altitud que lo provocarían en la vida real?

2 votos

@Blah Sí. Puedes ver algunos patios parciales en mis ejemplos, como los grupos de edificios de la esquina inferior izquierda.

0 votos

Gracias por la ayuda. Estoy empezando con esto ahora mismo. ¿Algún ejemplo de cómo implementar esto?

3voto

Niall C. Puntos 1234

No creo que lo que usted está hablando (buscando) va a ser un capbability en arcmap (versión?)
Ver esto pregunta para probablemente la limitación que no desea.
Utilización de Extensión 3d Analyst y arcscene puedes añadir luz, pero sigue habiendo algunas limitaciones.
Hay algún movimiento de esri al respecto con cityengine .
Desplázate hasta la sección de precisión de las sombras.
Anteriormente he estado asociado con lightscape (que ha sido retirado y estoy seguro de que vive dentro de 3dsmax).
Ahora el camino sería probablemente a través de la línea de productos de visualización de ingeniería...
3ds Max

0 votos

Gracias por el resumen de mis opciones, Brad. Estoy usando Arc 10. No creo que necesito necesariamente la luz, sólo necesito formas 2D para la huella de la sombra conectar la forma de la sombra de las esquinas del edificio en lugar del resultado producido por una sombra de la gota.

0 votos

Debo haber leído mal. Pensaba que para obtener la sombra por altura se necesitaría la generada por una fuente de luz.

2 votos

¿Creo que puedo variar el tamaño de las sombras utilizando los atributos que tengo para la altura de los edificios? Mi problema parece estar en la creación de una sombra que no es una sombra de la gota, pero una sombra que en realidad está conectado a las esquinas de la huella del edificio.

1voto

auramo Puntos 161

La extensión 3D Analyst dispone de algunas herramientas ( Skyline y Barrera Skyline ) para producir siluetas y volúmenes de sombra, pero es en el contexto de proyectarse contra un plano vertical, como en una línea del horizonte, así que no estoy seguro de cómo o si podría adaptarse fácilmente a este caso (proyectarse contra un plano horizontal, el suelo).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X