python两组列表每组列表中的每个元素是一个字典该字典包含点名和高程两个属性两个列表进行匹配;先匹配一遍当满足连续N个点的高程误差在一定范围内且点名也相同时才认为匹配成功。当仍存在未匹配时只匹配高程当满足连续N个点的高程误差在一定范围内时认为匹配对应的点名是同一个点。当匹配结束时还有未匹配成功的点时倒序匹配一次仍有未匹配是将N-1继续匹配。
以下是一个可能的实现:
def match_points(points1, points2, n, tolerance):
# 初始化匹配结果
matched = []
# 先匹配一遍,找出连续N个点高程误差在一定范围内且点名相同的情况
for i in range(len(points1)):
for j in range(len(points2)):
if points1[i]['name'] == points2[j]['name']:
# 计算高程误差
error = abs(points1[i]['elevation'] - points2[j]['elevation'])
# 如果高程误差在容许范围内,将两个点加入匹配结果
if error <= tolerance:
matched.append((i, j))
# 如果匹配成功的点数已经达到N个,返回匹配结果
if len(matched) >= n:
return matched
# 如果还有未匹配的点,只匹配高程,找出连续N个点高程误差在一定范围内的情况
if len(matched) < len(points1):
for i in range(len(points1)):
if i in [m[0] for m in matched]:
# 已经匹配过的点跳过
continue
for j in range(len(points2)):
if j in [m[1] for m in matched]:
# 已经匹配过的点跳过
continue
# 计算高程误差
error = abs(points1[i]['elevation'] - points2[j]['elevation'])
# 如果高程误差在容许范围内,将两个点加入匹配结果
if error <= tolerance:
matched.append((i, j))
# 如果匹配成功的点数已经达到N个,返回匹配结果
if len(matched) >= n:
return matched
# 如果还有未匹配的点,倒序匹配一次
if len(matched) < len(points1):
reversed1 = list(reversed(points1))
reversed2 = list(reversed(points2))
for i in range(len(reversed1)):
if i in [m[0] for m in matched]:
# 已经匹配过的点跳过
continue
for j in range(len(reversed2)):
if j in [m[1] for m in matched]:
# 已经匹配过的点跳过
continue
# 计算高程误差
error = abs(reversed1[i]['elevation'] - reversed2[j]['elevation'])
# 如果高程误差在容许范围内,将两个点加入匹配结果
if error <= tolerance:
matched.append((len(points1) - i - 1, len(points2) - j - 1))
# 如果匹配成功的点数已经达到N个,返回匹配结果
if len(matched) >= n:
return matched
# 如果还有未匹配的点,将N减1,重新匹配
if n > 2:
return match_points(points1, points2, n - 1, tolerance)
# 如果已经尝试了所有可能的匹配,返回匹配结果
return matched
该函数接受三个参数:两个点列表和匹配条件。匹配条件包括连续N个点高程误差容许范围(tolerance)和N的值(n)。函数先尝试匹配连续N个点高程误差在一定范围内且点名相同的情况,如果还有未匹配的点,则尝试匹配连续N个点高程误差在一定范围内的情况,如果还有未匹配的点,则倒序匹配一次。如果还有未匹配的点,则将N减1,重新匹配。如果已经尝试了所有可能的匹配,返回匹配结果。匹配结果是一个元组列表,每个元组包含两个点在两个列表中的索引
原文地址: http://www.cveoy.top/t/topic/huEA 著作权归作者所有。请勿转载和采集!