技术研究之智能摆拍航线

标签: 无 分类: 未分类 创建时间:2026-01-13 12:03:39 更新时间:2026-05-27 11:42:29

1.前言

使用司空2有一个功能,就是可以使用智能摆拍功能,绘制一条航线,就可以进行倾斜摄影的处理。但是在官方的文档中,根本就没有想关参数的说明,只能自己猜了。

2.测区外扩

计算每条边的法向量

对于每一条边 Ei = (Vi, Vi+1),计算其单位法向量 Ni。

边向量 Ei_vec = Vi+1 - Vi
法向量 Ni = (-Ei_vec.y, Ei_vec.x) (逆时针旋转90度)
单位法向量 Ni_unit = Ni / ||Ni||

b) 计算偏移后的边

将每条边 Ei 沿着其单位法向量 Ni_unit 方向平移距离 d,得到新的边 E’i。
c) 计算新顶点 (交点)

偏移后的边 E’i 和 E’i+1 会相交于一点 V’i。这个交点就是新多边形的一个顶点。

这里需要解两条直线的交点方程。

d) 处理拐角

在多边形的拐角处,直接平移边可能会导致自相交或“尖角”。因此,需要根据内角大小进行特殊处理:

钝角: 直接连接两个相邻边的偏移线即可。
锐角: 可能需要插入一个圆弧或直接连接,避免产生过大的“凹陷”。
  1. 如何确定外扩距离 d?

这个 d 不是任意值,它是由相机参数和重叠率决定的:

航向间距 (D_h): 相邻两张照片中心点沿飞行方向的距离。
    D_h = GSD * Sensor_Width / (1 - Overlap_H)
    其中 GSD 是地面采样距离,Sensor_Width 是相机传感器宽度(像素数),Overlap_H 是航向重叠率。
旁向间距 (D_w): 相邻航线中心线之间的距离。
    D_w = GSD * Sensor_Height / (1 - Overlap_W)
    其中 Sensor_Height 是相机传感器高度(像素数),Overlap_W 是旁向重叠率。
外扩距离 d:
    为了确保覆盖,通常 d >= D_w / 2。
    更精确地说,d 应该等于 D_w / 2 + margin,其中 margin 是一个安全余量,用于应对定位误差和风的影响。

3.生成平行线

找到多边形 P' 的最小外接矩形(或 bounding box)。
从矩形的一侧开始,按步长 D_w(旁向间距)画出一系列平行于方向 θ 的直线。
这些直线会与多边形 P' 的边界相交,形成一系列线段。

4.生成航点

对于多边形 P' 的每一条边 Ej,计算其与直线 L 的交点 Ij。
收集所有有效的交点 Ij。
将这些交点按照它们在直线 L 上的位置排序。
排序后,相邻的两个交点 Ia 和 Ib 构成一条线段 Sa-b,这条线段就是最终航线的一部分。
如果交点数量为偶数,则 P' 被 L 切割成多个不相连的线段;如果为奇数,则说明 L 穿过了多边形的一个顶点,需要特殊处理。

5.加密航点

a) 计算地面采样距离 (GSD)

GSD(Ground Sample Distance)表示影像上一个像素代表的实际地面距离,单位通常是米/像素 (m/pixel)。

GSD = (飞行高度 * 传感器像元尺寸) / (焦距 * 像素尺寸系数) (具体公式可能因相机而异,有些工具直接用传感器物理尺寸和焦距计算)

GSD 是后续所有距离计算的基础。
b) 计算单张照片覆盖范围

根据相机参数和飞行高度,可以计算出单张照片在地面上覆盖的实际宽度和长度。

照片宽度 (W_photo): W_photo = GSD * 传感器宽度像素数
照片长度 (L_photo): L_photo = GSD * 传感器高度像素数

c) 计算航向间距 (Along-track Spacing) 和 旁向间距 (Cross-track Spacing)

航向间距 (D_h): 相邻两张照片中心点在飞行方向上的距离。
    D_h = L_photo * (1 - 航向重叠率)
    例如:如果照片长度是 50 米,航向重叠率是 80%,那么 D_h = 50 * (1 - 0.8) = 10 米。
旁向间距 (D_w): 相邻航线中心线之间的距离。
    D_w = W_photo * (1 - 旁向重叠率)
    例如:如果照片宽度是 40 米,旁向重叠率是 70%,那么 D_w = 40 * (1 - 0.7) = 12 米。

6.设置航点动作

外扩测区边界一个方向拍摄,测区内三个方向拍摄,原始测区和外扩边界之间的航点有两个动作

6.生成航线文件

生成航线的wpml文件

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件(ititchuan@gmail.com)通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
ititchuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。