dcn*_*n23 5 python gis visibility trigonometry arcgis
我试图从多个角度找到自然环境的可见度.我有一个DEM和一个定义自然环境的栅格.对于每个细胞,我有坡度,高度,方位和距离观点的距离.我想计算视点和每个单元格之间的角度.
我最初通过获取视点的x,y,z坐标以及倾斜单元格的底部和顶部来实现此目的.然后获取每个坐标之间的3D距离并使用这些距离来获得角度.然后,我将对每个单元格求和以获得总可见度.
问题是这种方法仅在视点和可见单元之间的方位与坐标系的x和y轴对齐时才起作用.这是因为为了计算单元角的点坐标,我减去并将单元分辨率/ 2添加到单元质心.
代码如下
def Cell_Loc (VPX, VPY, VPZ, cell_x, cell_y, cell_z, aspect, cell_resolution, bearing):
import math
from math import sqrt
#Get change in height of cell using slope and cell resolution (trig)
AspectTan = math.tan(math.radians(aspect))
Opposite = (AspectTan * cell_res)
#Get coordinates for cell corners
CloseCornerX = cent_x - 2.5
CloseCornerY = cent_y - 2.5
FarCornerX = cent_x + 2.5
FarCornerY = cent_y + 2.5
CloseCornerZ = cent_z - (Opposite/2)
FarCornerZ = cent_z + (Opposite/2)
#Get Distance between coordinates
VP = (VPX, VPY, VPZ) #data point 1
cellcrner1 = (CloseCornerX, CloseCornerY, CloseCornerZ) #data point 2
cellcrner2 = (FarCornerX, FarCornerY, FarCornerZ)
dist_to_far_corner = sqrt(sum( (VP - cellcrner2)**2 for VP, cellcrner2 in zip(VP, cellcrner2)))
dist_to_close_corner = sqrt(sum( (VP - cellcrner1)**2 for VP, cellcrner1 in zip(VP, cellcrner1)))
cell_dist = sqrt(sum( (cellcrner1 - cellcrner2)**2 for cellcrner1, cellcrner2 in zip(cellcrner1, cellcrner2)))
#Input above distances into ViewAngle to find angle
def ViewAngle (a, b, c):
"calculates the viewing angle of each visible cell"
import math
a2 = a*a
b2 = b*b
c2 = c*c
VA = (a2-b2+c2)/ (2.0 * (a*c))
rads = math.acos(VA)
return math.degrees(rads)
Run Code Online (Sandbox Code Playgroud)
如何改进此代码,或者另一种方法是更好的方法.我需要的输出是说"对于这个观点,可见自然环境有X度数".我再次看到,DEM是视域分析,视角和细胞质心之间的斜率,方位和距离的可见区域.我使用python编程语言并将ArcGIS10.2与arcpy配合使用
一项改进是使用坐标和内积而不是距离来计算角度:这将有助于避免一些(尽管不是全部)昂贵且混乱的平方根。因此,如果您的视点位于v=(x,y,z),另外两个点是P=(a,b,c)和Q=(d,e,f),则对角就是acos(sqrt(((V-P)(V-Q))^2/(V-P)^2(V-Q)^2))=acos(sqrt(<(V-P),(V-Q)>^2/<(V-P),(V-P)><(V-Q),(V-Q)>))(内部)乘积为内积的位置,即PQ = ad + be + cf。此外,一些产品和内部产品可以“回收”而不是重新计算。
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |