ArcGIS Desktopを使用して建物の影を作成しますか?


20

建物のフットプリントから建物の影をどのように生成しますか?
建物の高さの属性値があります。
そのため、影のサイズをそれに基づいて変えることが望ましいでしょう。
ArcGISを使用して見つけた最良の提案は、ドロップシャドウです:http : //blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx


2
ソリューションのArcMap / Pythonコードは、gis.stackexchange.com/questions/19935/…の続きで提供されています。
whuber

いくつかのシェーディングデバイスのシェードを識別する必要があるため、最初の例でpythonを使用してスクリプトを提供してください。あなたの応答が高く評価された

回答:


23

すばやく汚い方法は、建物の屋根の影のみを描画し、それらを暗い灰色(下にある地面レイヤーがある場合は半透明が望ましい)でレンダリングし、その上に建物のポリゴンを描画することです。屋根の影は、光源の方位角と高度によって確立された方向の建物の高さによって決定される距離によって建物のポリゴンを変換することによって取得されます(無限に遠いと見なされます)。(翻訳量の式は以下に表示されます。)

粗い影

これは、低高度や高層ビル(高層ビルなど)を除き、問題なく動作する傾向があります。右側の高層ビルの影が建物自体からどのように分離されているかを確認してください。

建物に影を適切接続するには、建物の壁の影を含める必要があります。 これは難しくありません。PにあるポイントとQにある別のポイントとの間に伸びる壁の影は、{P、Q、Q '、P'}で囲まれた四辺形になります。ここで、Q 'はQの影、P'はP.多角形の建物は、閉じた一連のポイント(P(1)、P(2)、...、P(n))で表される接続された多角形のコレクションです。そのようなポリゴンごとに、エッジ(P(1)、P(2))、(P(2)、P(3))、...、(P(n)、P( 1))。これは、エッジをループすることで簡単に行えます。

方位角の光に対して度(北東の)との高度のS(水平から)度、投影座標(x、y)と高さと点Pの影H(全て同じ単位で表現(メートルなど)はP '=(x-h sin(a)/ tan(s)、y-h cos(a)/ tan(s))にあります。レイヤー全体に対して一度だけsin(a)/ tan(s)とcos(a)/ tan(s)を計算する必要があり、各ポリゴンに対して高さを1回掛けるだけでオフセットを取得できますポリゴン内の各ポイントシャドウ。(実際の計算ワークロードは、これらのすべての四辺形の結合を形成するため、コードではなくGISによって実行されます。)

効果の例を次に示します。 (方位角と高度は最初の図と比べてわずかに変化しましたが、建物のポリゴンと高さ(変化します)は以前と同じです。)

良い影

付録

リクエストへの応答として、2番目の例を作成するために使用するコードを次に示します。ほとんど誰もこの言語(Avenue)を使用していませんが、お気に入りのGISでソリューションを作成するための擬似コードとして役立つ可能性があります。(ただし、ほとんどの擬似コードとは異なり、実際に実行してテストされています。:-)非常に単純なので、説明は不要です。インデックスは1ではなく0から始まり、ポリゴンリングは明示的に閉じられていることに注意してください(リストの最後のポイントは最初のポイントと一致します)。

' 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
@ブラーはい。私の例では、左下隅の建物のグループなど、一部の中庭を見ることができます。
whuber

助けてくれてありがとう。私は今これを取り上げています。これを実装する方法の例はありますか?
EightyTwenty

5
@Eighty私は、ArcView 3のフィールド計算を使用してこの作業を行うことを認めています。簡単で、ArcMapを起動するよりも速くスクリプトを記述できます:-)。必要に応じて、出力シェープファイルをArcMapで読み取ってレンダリングできます。
whuber

2
ArcMapでこの作業を行うために誰かがまとめたPythonスクリプトを見るのを楽しみにしています!
ライアンダルトン

3

あなたが話している(探している)ことは、アークマップ(バージョン?)の可能性になるとは思いません。おそらくあなたが望まない制限については、
この質問を参照してください。
利用3D AnalystエクステンションArcSceneのを、あなたは光を追加することができますが、いくつかの制限が残っています。
問題に関するいくつかのESRI動きがありcityengineが
影の精度セクションまでスクロールします。
私は以前lightscapeに関連付けられていました(これは廃止され、3dsmaxの内部に住んでいると確信しています)。
これで、おそらくパスはエンジニアリングビジュアライゼーション製品ラインを経由することになります...
3ds Max


私のオプションの概要をありがとう、ブラッド。アーク10を使用しています。必ずしも光が必要とは思いません。シャドウフットプリントに2Dシェイプが必要なだけで、ドロップシャドウによって生成される結果ではなく、建物のコーナーからシャドウシェイプを接続します。
EightyTwenty

誤読しているに違いありません。光源によって生成される影が必要な高さで影を取得すると考えました。
ブラッドネソム

2
建物の高さの属性値を使用するだけで、影の形状のサイズを変更できると思いますか?私の問題は、ドロップシャドウではなく、実際に建物のフットプリントの角に接続されているシャドウを作成することにあるようです。
EightyTwenty

1

3D Analystエクステンションには、シルエットとシャドウボリュームを作成するためのいくつかのツール(SkylineおよびSkyline Barrier)がありますが、スカイラインのように垂直面に投影されるコンテキストにあるため、どのようにまたは簡単に適応できるかわかりませんこの場合(水平面、地面に対して投影)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.