¿Produce sombras de edificios con ArcGIS Desktop?

20

¿Cómo generarías sombras de edificios a partir de huellas de edificios?
Tengo valores de atributo para las alturas de los edificios.
Por lo tanto, me gustaría que los tamaños de las sombras varíen en función de eso.
La mejor sugerencia que he encontrado al usar ArcGIS son las sombras paralelas : http://blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx

Ochenta y veinte
fuente
2
El código de ArcMap / Python para una solución se proporciona en la continuación en gis.stackexchange.com/questions/19935/… .
whuber
¿Puede proporcionar el script usando python para el primer ejemplo, ya que necesito identificar el tono de algunos dispositivos de sombreado? su respuesta es muy apreciada

Respuestas:

23

Un método rápido y sucio es dibujar solo las sombras de los techos de los edificios, renderizarlos en gris oscuro (preferiblemente semitransparente si hay capas de suelo subyacentes) y dibujar los polígonos del edificio sobre ellos. Las sombras del techo se obtienen traduciendo los polígonos del edificio por las distancias determinadas por las alturas del edificio en la dirección establecida por el acimut y la altitud de la fuente de luz (considerada infinitamente lejos). (Una fórmula para la cantidad de traducción aparece a continuación).

Sombras crudas

Esto tiende a funcionar bien, excepto en altitudes bajas o edificios altos (como rascacielos): vea cómo las sombras de los edificios aislados más altos en el lado derecho se separan de los edificios mismos.

Para conectar las sombras correctamente a los edificios, debe incluir las sombras de las paredes del edificio . Esto no es difícil de hacer. La sombra de la pared que se extiende entre un punto ubicado en P y otro punto ubicado 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, forme la unión de las sombras de los bordes (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Esto es fácil de hacer mediante un bucle sobre los bordes.

Para una luz en un azimut de un grados (al este del norte) y una altitud de s grados (desde el horizonte), la sombra de un punto P con coordenadas proyectadas (x, y) y la altura h (expresados en las mismas unidades , como metros) se encuentra en P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Solo tiene que calcular sin (a) / tan (s) y cos (a) / tan (s) una vez para toda la capa, y para cada polígono solo tiene que multiplicar esos factores por la altura una vez para obtener las compensaciones para cada punto de sombra en el polígono. (La carga de trabajo computacional real la lleva el SIG, no su código, ya que forma las uniones de todos estos cuadriláteros).

Aquí hay un ejemplo del efecto. (El acimut y la altitud han cambiado ligeramente en comparación con la primera figura, pero los polígonos y las alturas de los edificios, que varían, son los mismos que antes).

Buenas sombras

Apéndice

En respuesta a una solicitud, aquí está el código utilizado para crear el segundo ejemplo. Aunque ya casi nadie usa 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 simple que no se necesita ninguna explicación; solo tenga en cuenta que la indexación comienza con 0, no con 1, y que los anillos de polígono 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
whuber
fuente
1
¿Cómo se ven los edificios con agujeros de rosquilla con este algoritmo? ¿Permite que exista un área no sombreada en, digamos, un patio, dados los valores de acimut y altitud que causarían eso en la vida real?
blah238
2
@Blah Sí. Puedes ver algunos patios parciales en mis ejemplos, como los grupos de edificios en la esquina inferior izquierda.
whuber
Gracias por la ayuda. Solo estoy recogiendo esto ahora mismo. ¿Algún ejemplo de cómo implementar esto?
Ochenta
55
@ Ochenta Confieso que hice este trabajo con un cálculo de campo en ArcView 3: es simple, uno puede escribir el script más rápido de lo que se necesita para iniciar ArcMap :-), y se ejecuta en muy poco tiempo. ArcMap puede leer el archivo de forma de salida para representarlo si lo desea.
whuber
2
¡Espero ver el script de Python que alguien crea para que esto funcione en ArcMap!
RyanKDalton-OffTheGridMaps
3

No creo que de lo que estés hablando (buscando) vaya a ser una capbability en arcmap (¿versión?)
Mira esta pregunta para probablemente la limitación que no deseas.
Utilizando la extensión 3d Analyst y arcscene , puede agregar luz, pero todavía hay algunas limitaciones.
Hay algún movimiento de esri al respecto con cityengine .
Desplácese hacia abajo hasta la sección de precisión de sombra.
Anteriormente me asociaron con Lightscape (que se retiró y estoy seguro de que vive dentro de 3dsmax).
Ahora el camino probablemente sería a través de la línea de productos de visualización de ingeniería ...
3ds Max

Brad Nesom
fuente
Gracias por el resumen de mis opciones, Brad. Estoy usando Arc 10. No creo que necesite necesariamente luz, solo necesito formas 2D para que la huella de la sombra conecte la forma de la sombra desde las esquinas del edificio en lugar del resultado producido por una sombra paralela.
Ochenta
Debo haber leído mal. Pensé que para obtener la sombra por altura necesitarías la generada por una fuente de luz.
Brad Nesom el
2
¿Creo que puedo variar el tamaño de las formas de sombra simplemente usando los valores de atributo que tengo para la altura de los edificios? Mi problema parece estar en crear una sombra que no sea una sombra paralela, sino una sombra que en realidad esté conectada a las esquinas de la huella del edificio.
Ochenta
1

La extensión 3D Analyst tiene algunas herramientas ( Skyline y Skyline Barrier ) para producir siluetas y volúmenes de sombra, pero está en el contexto de ser proyectada contra un plano vertical como en un horizonte, por lo que no estoy seguro de cómo o si podría adaptarse fácilmente en este caso (proyectándose contra un plano horizontal, el suelo).

blah238
fuente