Sản xuất bóng tòa nhà bằng ArcGIS Desktop?


20

Làm thế nào bạn sẽ tạo ra bóng tòa nhà từ dấu chân tòa nhà?
Tôi có các giá trị thuộc tính cho chiều cao của các tòa nhà.
Vì vậy, tốt nhất là muốn có kích thước của bóng tối khác nhau dựa trên đó.
Gợi ý tốt nhất tôi tìm thấy khi sử dụng ArcGIS là thả bóng: http://bloss.esri.com/Support/bloss/mappingcenter/archive/2008/10/21/3d-effect-for-a-building- feetprints.aspx


2
Mã ArcMap / Python cho một giải pháp được cung cấp trong phần tiếp theo tại gis.stackexchange.com/questions/19935/ .
whuber

Bạn có thể vui lòng cung cấp tập lệnh bằng python cho ví dụ đầu tiên không vì tôi cần xác định sắc thái của một số thiết bị tạo bóng. phản hồi của bạn được đánh giá cao

Câu trả lời:


23

Phương pháp nhanh và bẩn là chỉ vẽ bóng của mái nhà, làm cho chúng có màu xám đen (tốt nhất là bán trong suốt nếu có bất kỳ lớp mặt đất nào bên dưới) và vẽ đa giác tòa nhà lên trên chúng. Các bóng mái thu được bằng cách dịch các đa giác của tòa nhà theo khoảng cách được xác định bởi độ cao của tòa nhà theo hướng được thiết lập bởi góc phương vị và độ cao của nguồn sáng (được coi là vô cùng xa). (Một công thức cho số lượng bản dịch xuất hiện bên dưới.)

Bóng thô

Điều này có xu hướng hoạt động tốt, ngoại trừ độ cao thấp hoặc các tòa nhà cao tầng (như tòa nhà chọc trời): xem bóng của các tòa nhà biệt lập cao hơn ở phía bên tay phải được tách ra khỏi các tòa nhà.

Để kết nối bóng tối đúng cách với các tòa nhà, bạn cần bao gồm bóng của các bức tường tòa nhà . Điều này không khó để làm. Bóng của bức tường kéo dài giữa một điểm nằm tại P và một điểm khác nằm ở Q sẽ là tứ giác được vạch ra bởi {P, Q, Q ', P'} trong đó Q 'là bóng của Q và P' là bóng của P. Một tòa nhà đa giác sẽ là một tập hợp các đa giác được kết nối được biểu thị bằng các chuỗi điểm kín (P (1), P (2), ..., P (n)). Đối với mỗi đa giác như vậy, tạo thành sự kết hợp các bóng của các cạnh (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Điều này là đơn giản để thực hiện bằng một vòng lặp trên các cạnh.

Đối với một ánh sáng ở một góc phương vị của một độ (phía đông bắc) và độ cao của độ (từ đường chân trời), cái bóng của một điểm P có tọa độ dự kiến (x, y) và chiều cao h (tất cả được thể hiện trong cùng một đơn vị , chẳng hạn như mét) được đặt tại P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)). Bạn chỉ phải tính sin (a) / tan (s) và cos (a) / tan (s) một lần cho toàn bộ lớp và đối với mỗi đa giác, bạn chỉ phải nhân các yếu tố đó với chiều cao một lần để có được độ lệch cho mỗi điểm bóng trong đa giác. (Khối lượng công việc tính toán thực sự được thực hiện bởi GIS, không phải mã của bạn, vì nó tạo thành các hiệp hội của tất cả các tứ giác này.)

Đây là một ví dụ về hiệu ứng. (Góc phương vị và độ cao đã thay đổi một chút so với hình đầu tiên, nhưng đa giác và chiều cao của tòa nhà - khác nhau - giống như trước đây.)

Bóng tốt

ruột thừa

Đáp lại yêu cầu, đây là mã được sử dụng để tạo ví dụ thứ hai. Mặc dù hầu như không ai sử dụng ngôn ngữ này (Đại lộ) nữa, nhưng nó cũng có thể đóng vai trò là mã giả để tạo ra một giải pháp trong hệ thống GIS yêu thích của bạn. (Tuy nhiên, không giống như hầu hết mã giả, nó đã được kiểm tra bằng cách thực sự chạy nó. :-) Thật đơn giản đến nỗi không cần giải thích; chỉ cần lưu ý rằng việc lập chỉ mục bắt đầu bằng 0, không phải 1 và các vòng đa giác được đóng rõ ràng (điểm cuối cùng trong danh sách trùng với điểm đầu tiên).

' 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
Làm thế nào để các tòa nhà có lỗ bánh rán trông với thuật toán này? Liệu nó có cho phép một khu vực không có bóng tồn tại trong một sân trong, với các giá trị góc phương vị và độ cao sẽ gây ra điều đó trong cuộc sống thực?
blah238

2
@Bmus Có. Bạn có thể thấy một số sân trong một phần trong các ví dụ của tôi, chẳng hạn như các nhóm tòa nhà ở góc dưới bên trái.
whuber

Cảm ơn đã giúp đỡ. Tôi chỉ đang chọn cái này ngay bây giờ. Bất kỳ ví dụ về làm thế nào để thực hiện điều này?
EightyToven

5
@Eighty Tôi thú nhận đã thực hiện công việc này với tính toán trường trong ArcView 3: thật đơn giản, người ta có thể viết tập lệnh nhanh hơn so với khi bắt đầu ArcMap :-) và nó thực thi gần như không mất thời gian. Shapefile đầu ra sau đó có thể được ArcMap đọc để hiển thị nếu bạn muốn.
whuber

2
Tôi mong muốn được thấy tập lệnh Python mà ai đó kết hợp để thực hiện công việc này trong ArcMap!
RyanDalton

3

Tôi không nghĩ những gì bạn đang nói (đang tìm kiếm) sẽ trở thành một khả năng có thể có trong arcmap (phiên bản?)
Xem câu hỏi này có lẽ là giới hạn mà bạn không muốn.
Sử dụng tiện ích mở rộng Phân tích 3darcscene, bạn có thể thêm ánh sáng nhưng vẫn còn một số hạn chế.
Có một số phong trào esri về vấn đề với cityengine .
Cuộn xuống phần chính xác bóng.
Trước đây tôi đã được liên kết với lightcape (đã nghỉ hưu và tôi chắc chắn sống bên trong 3dsmax).
Bây giờ con đường có lẽ sẽ thông qua dòng sản phẩm trực quan kỹ thuật ...
3ds Max


Cảm ơn vì phác thảo các lựa chọn của tôi, Brad. Tôi đang sử dụng Arc 10. Tôi không nghĩ rằng tôi nhất thiết cần ánh sáng, tôi chỉ cần hình dạng 2D cho dấu chân bóng kết nối hình dạng bóng từ các góc của tòa nhà thay vì kết quả được tạo ra bởi bóng đổ.
EightyToven

Tôi phải đọc sai. Tôi nghĩ để có được bóng theo chiều cao, bạn sẽ cần nó được tạo bởi một nguồn sáng.
Brad Nesom

2
Tôi nghĩ rằng tôi có thể thay đổi kích thước của các hình bóng chỉ bằng cách sử dụng các giá trị thuộc tính tôi có cho chiều cao của các tòa nhà? Vấn đề của tôi dường như là tạo ra một cái bóng không phải là một cái bóng, mà là một cái bóng thực sự được kết nối với các góc của dấu chân tòa nhà.
EightyToven

1

Tiện ích mở rộng Phân tích 3D có một số công cụ ( SkylineSkyline Barrier ) để tạo bóng và khối lượng bóng nhưng trong bối cảnh được chiếu lên mặt phẳng thẳng đứng như trên bầu trời, vì vậy tôi không chắc nó có thể dễ dàng thích nghi hay không trong trường hợp này (chiếu vào mặt phẳng nằm ngang, mặt đất).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.