使用ArcGIS Desktop生成建筑物阴影?


20

您将如何从建筑脚印生成建筑阴影?
我有建筑物高度的属性值。
因此,最好使阴影的大小基于此而变化。
使用ArcGIS找到的最佳建议是阴影:http : //blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx


2
gis.stackexchange.com/questions/19935/…的续篇提供了用于解决方案的ArcMap / Python代码。
whuber

您能否为第一个示例提供使用python的脚本,因为我需要识别某些阴影设备的阴影。非常感谢您的回复

Answers:


23

一种快速且肮脏的方法是仅绘制建筑物屋顶的阴影,将其渲染为深灰色(如果存在任何底层地面,则最好为半透明),然后在其上绘制建筑物多边形。屋顶阴影是通过在由光源的方位角和海拔高度(被认为是无限远的)确定的方向上将建筑物多边形平移建筑物高度确定的距离而获得的。(下面显示了翻译量的公式。)

粗阴影

除了低海拔或较高的建筑物(例如摩天大楼)外,这似乎都可以正常工作:请查看右侧较高的隔离建筑物的阴影如何与建筑物本身分开。

要将阴影正确连接到建筑物,您需要包括建筑物墙壁的阴影 这并不难。在位于P的一个点和位于Q的另一个点之间延伸的墙的阴影将是{P,Q,Q',P'}所描绘的四边形,其中Q'是Q的阴影,P'是Q的阴影P。多边形建筑物将是由闭合的点序列(P(1),P(2),...,P(n))表示的连接多边形的集合。对于每个这样的多边形,形成边缘(P(1),P(2)),(P(2),P(3)),...,(P(n),P( 1))。通过边缘上的循环可以很容易地做到这一点。

对于在方位光一个度(东北部)和海拔小号度(从地平线),点P与投影坐标(x,y)和高度的阴影ħ(在相同的单元中的所有表达,例如米)位于P'=(x-h sin(a)/ tan(s),y-h cos(a)/ tan(s))。您只需为整个层计算一次sin(a)/ tan(s)和cos(a)/ tan(s),并且对于每个多边形,您只需要将这些因子乘以高度即可获得多边形中的每个点阴影。(真正的计算工作量由GIS承担,而不是您的代码,因为它形成了所有这些四边形的并集。)

这是效果的一个例子。 (与第一个数字相比,方位角和高度略有变化,但是建筑物的多边形和高度(有所不同)与以前相同。)

好阴影

附录

响应请求,以下是用于创建第二个示例的代码。尽管几乎没有人再使用此语言(Avenue),但它很可能用作在您喜欢的GIS中创建解决方案的伪代码。(但是,与大多数伪代码不同,它已经通过实际运行进行过测试。:-)它是如此简单,不需要解释;请注意,索引从0而不是1开始,并且多边形环显式闭合(列表中的最后一点与第一个点重合)。

' 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
使用该算法的甜甜圈孔建筑物看起来如何?给定在现实生活中会造成方位角和高度值的情况,它是否允许在院子中存在非阴影区域?
blah238

2
@布拉是的。在我的示例中,您可以看到一些局部庭院,例如左下角的建筑物群。
ub

谢谢您的帮助。我现在就接了。如何实施此示例?
2011年

5
@Eighty我承认用ArcView 3中的字段计算来完成这项工作,这很简单,一个人编写脚本的速度比启动ArcMap的速度要快:-),而且几乎没有时间执行。如果需要,ArcMap可以读取输出的shapefile进行渲染。
Whuber

2
我期待看到有人将Python脚本放在一起以在ArcMap中完成这项工作!
RyanDalton

3

我认为您所说的(寻找)不会成为arcmap(版本?)的功能。
请参阅此问题,以了解您可能不需要的限制。
利用3d Analyst扩展arcscene,您可以添加光,但是仍然存在一些限制。
关于cityengine的事情有一些esri运动。
向下滚动到阴影精度部分。
我以前曾与lightscape相关联(已经退休,并且我确定自己生活在3dsmax内部)。
现在,路径可能会通过工程可视化产品线...
3ds Max


谢谢您的选择概述,布拉德。我正在使用Arc10。我认为我不一定需要光,我只需要2D形状的阴影覆盖区即可将阴影形状从建筑物的各个角落连接起来,而不是连接阴影所产生的结果。
2011年

我一定读错了。我认为要按高度获得阴影,就需要光源产生的阴影。
Brad Nesom

2
我想我可以仅使用建筑物高度的属性值来改变阴影形状的大小?我的问题似乎在于创建一个阴影,该阴影不是投影,而是实际上连接到建筑物占地面积角落的阴影。
2011年

1

3D Analyst扩展程序具有一些工具(“ 天际线”和“ 天际线屏障”),用于生成轮廓和阴影体积,但是它是像在天际线中那样在垂直平面上投影的,因此我不确定如何或是否可以轻松地对其进行修改这种情况(相对于水平面,地面投影)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.