内容正文:
作业练习
课程基本信息
学科
信息技术
年级
高二
学期
春季
课题
POI数据的组织与应用
教科书
数据与数据结构
学生信息
姓名
学校
班级
学号
作业练习
1.地球上任意位置可以用纬度、经度描述,纬度区间是[-90,90],经度区间是[-180,180]。如:浙江省绍兴市越城区鲁迅故里的纬度是29.9924099,经度为120.58552218。为表达位置间的邻近关系,引入了地理区域编码,GeoHash算法的基本思想如下:
将地理上某点经纬度分别转换成二进制编码。例如,对于给定纬度lat(29. 9924099),编码规则为:
•将区间[-90,90]二分为[-90,0),[0,90],称为左、右区间,lat属于右区间[0,90],标记为1;
•将区间[0,90]二分为 [0,45),[45,90],lat属于左区间 [0,45),标记为0;
•重复上述过程,不断划分区间,lat属于左区间则记录0,属于右区间则记录1。直到达到指定编码长度length(一般为5的倍数)为止。
类似地,可对经度lng(120. 58552218)进行二进制编码。
Base32编码合成为地理区域字符串。以编码长度length=10为例,如前述计算得到,鲁迅故里的纬度编码为10101 01010,经度编码为11010 10110。地理区域字符串生成规则:
•生成新串:奇数位放经度,偶数位放纬度,将2串编码组合:11100 11001 10011 01100;
分组转换:将11100 11001 10011 01100每5位一组转成1个十进制整数,分别对应为28、25、19、12;
•Base32编码:使用数字0~9、小写字母(去掉字母a, i, l, o)这32个字符进行Base32编码(见下表)。十进制整数28、25、19、12对应的编码组合就是“wtmd”,即为该位置的地理区域字符串。
(1)规定编码长度length为5,经度lng为120. 12508258,则经度lng的二进制编码为 。
(2)根据上述描述,设计了一个“利奇马”台风中心途经经纬度转换为地理区域字符串的算法。该算法Python程序实现如下,请在划线处填入合适的代码:
m = 18 #台风途经地点为18个
length = 20 #纬度、经度二进制编码长度均为length
a = [#利奇马台风途经区域,每个区域纬度、经度数据
28.195851,121.502351, #台风登陆前
#29.9919578,120.58526959, #测试用绍兴市
28.297677,121.405765, #温岭市
28.399405,121.203395, #雁荡山
28.501034,121.10221, #仁乡
28.195851,121.502351, #富山乡
28.606624,121.005624, #郑家坑
28.699941,120.899839, #仙居县
28.995563,120.706668, #广度乡
29.096609,120.605483, #磐安县
29.294367,120.600883, #新昌
28.195851,121.502351, #嵊州
29.495762,120.605483, #诸暨
29.696754,120.499698, #越城区
29.897341,120.301927, #富阳
30.097521,120.205341, #杭州
30.205448,120.209941, #萧山
30.301283,120.209941, #拱墅区
30.404997,120.205341 #余杭
]
b = [] #依次记录每个区域的GeoHash编码
base32 = "0123456789bcdefghjkmnpqrstuvwxyz" #Base32编码
#对经度或者纬度二进制编码:value是输入经度或者纬度,upper,lower是区间上下界。
#纬度区间是[-90,90],经度区间是[-180,180]
def DoubleToBits(value=0.0, lower=0.0, upper=0.0):
ret = ""
i = 1
middle = 0
while i <= length:
middle = (upper + lower) / 2
if ① :
lower = middle
ret = ret + "1"
else:
upper = middle
ret = ret + "0"
i = i + 1
return ret
#对所有区域的经纬度进行计算,并将其GeoHash编码存储到b数组中
for i in range(m):
lat = a[2 * i]
lng = a[2 * i + 1]
s = ""
strLat = DoubleToBits(lat, -90, 90) #纬度转换为二进制
strLon = DoubleToBits(lng, -180, 180) #经度转换为二进制
for j in range(length): #将2串二进制编码组合
s = ②
n = 0
code = ""
for j in range(len(s)):
③
if j % 5 == 4:
code = code + base32[n]
n = 0
b.append(code)
#输出所有区域的GeoHash编码
print(b)
参考答案:
(1)11010101011011000001
(2)①value >= middle
②s + strLon[j] + strLat[j]
③n = n * 2 + int(s[j])
学科网(北京)股份有限公司
$$