ArcGIS Desktop을 사용하여 건물 그림자를 생성합니까?


20

건물 외곽 설정에서 건물 그림자를 어떻게 생성 하시겠습니까?
건물 높이에 대한 속성 값이 있습니다.
따라서 그림자 크기는 그에 따라 달라지는 것이 좋습니다.
가장 좋은 제안 I의 한 드롭 그림자는 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)). 이것은 가장자리 위의 루프를 통해 간단합니다.

방위각에서 빛 도 (이스트 북쪽)과 고도 의의 (수평선)에서도, 투영 좌표 (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)을 한 번만 계산하면되고 각 다각형에 대해 오프셋을 얻기 위해 해당 계수에 높이를 한 번만 곱하면됩니다. 다각형의 각 점 그림자. (실제 계산 작업은 코드가 아닌 GIS에 의해 수행되며,이 모든 사변형의 합집합을 형성합니다.)

다음은 효과의 예입니다. (방위와 고도는 첫 번째 그림과 비교하여 약간 변경되었지만 건물 다각형과 높이는 서로 다르지만 이전과 동일합니다.)

좋은 그림자

충수

요청에 대한 응답으로 두 번째 예를 작성하는 데 사용되는 코드는 다음과 같습니다. 더 이상이 언어 (애비뉴)를 사용하는 사람은 거의 없지만 좋아하는 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 스크립트를 기대합니다!
RyanDalton

3

나는 당신이 (찾고있는) 말이 아크 맵 (버전?)의 가능성이 될 것이라고 생각하지 않습니다. 아마도 당신이 원하지 않는 한계에
대해서는이 질문 을 보십시오 .
활용하여 3 차원 분석의 확장arcscene 당신이 빛을 추가 할 수 있지만 몇 가지 제한 사항이 아직 없습니다. cityengine
관련 하여 일부 esri 운동이 있습니다 .
그림자 정확도 섹션으로 스크롤하십시오.
나는 이전에 lightscape와 관련이 있습니다 (이것은 은퇴되었으며 3dsmax 내부에 살고 있음을 확신합니다).
이제는 경로가 엔지니어링 시각화 제품 라인을 통과했을 것입니다 ...
3ds Max


옵션 개요에 대해 감사합니다, 브래드 Arc 10을 사용하고 있습니다. 필연적으로 빛이 필요하다고 생각하지 않습니다. 그림자 발자국에 2D 모양 만 있으면 그림자로 생성 된 결과가 아니라 건물 모서리에서 그림자 모양을 연결합니다.
EightyTwenty

내가 잘못 읽었을 것입니다. 광원으로 생성되는 그림자를 높이로 생각했습니다.
브래드 네섬

2
건물 높이에 대한 속성 값을 사용하여 그림자 모양의 크기를 변경할 수 있다고 생각합니까? 내 문제는 그림자가 아닌 그림자를 만드는 것이지만 실제로 건물 발자국의 모서리에 연결된 그림자입니다.
EightyTwenty

1

3D Analyst 확장에는 실루엣과 그림자 볼륨을 생성하기위한 몇 가지 도구 ( SkylineSkyline Barrier )가 있지만 스카이 라인에서와 같이 수직 평면에 투영되는 상황이므로 쉽게 조정할 수 있는지 여부를 잘 모르겠습니다. 이 경우 (평면,지면에 투사).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.