none-None1

车牌歌,但该市市中心的距离到其他省会或首府的距离比到本省省会或自治区首府的距离更近就切歌

Aug 22nd, 2025
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. path_db=r'CN.txt'
  2. '''
  3. 部分代码由AI编写
  4.  
  5. GeoNames数据库下载:https://download.geonames.org/export/dump/CN.zip
  6. 解压后请将CN.txt文件放在当前目录下
  7.  
  8. 出现“请输入要搜索的城市(啥都不输就退出):”的询问前如果有询问,找到代表省会/首府城市的编号并输入
  9.  
  10. 然后输入本省省会的编号,接下来输入城市英文名称(一般是拼音,自治州请输入首府)
  11.  
  12. 部分城市无数据
  13. '''
  14. import math,unicodedata,sys
  15.  
  16. def dis(s, t):
  17. """
  18. 计算地球上两点间的大圆距离(单位:公里)
  19. 参数:
  20. s: 第一个点的经纬度元组(纬度, 经度),角度制
  21. t: 第二个点的经纬度元组(纬度, 经度),角度制
  22. 返回:
  23. 两点间的大圆距离(公里)
  24. """
  25. # 地球平均半径(公里)
  26. R = 6371.0
  27.  
  28. # 将角度转换为弧度
  29. lat1, lon1 = math.radians(s[0]), math.radians(s[1])
  30. lat2, lon2 = math.radians(t[0]), math.radians(t[1])
  31.  
  32. # 计算经纬度差值
  33. dlat = lat2 - lat1
  34. dlon = lon2 - lon1
  35.  
  36. # Haversine公式
  37. a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
  38. c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
  39.  
  40. return R * c
  41.  
  42. def normalize(text):
  43. """
  44. 将包含特殊字符的文本转换为普通ASCII字符
  45. 例如:ü → u, ç → c, ß → ss
  46. """
  47. # 使用NFKD规范化分解字符后再过滤掉变音符号
  48. normalized = unicodedata.normalize('NFKD', text)
  49. return ''.join(
  50. c for c in normalized
  51. if not unicodedata.combining(c)
  52. ).replace('’',"'")
  53. k=list(filter(lambda x:(x.split('\t')[6]=='P'and (int(x.split('\t')[-5])>8000 or x.split('\t')[7]in ['PPLA2','PPLA3'])),open(path_db,encoding='utf-8').read().strip().split('\n'))) # 过滤掉所有非行政区划条目和人口小于8000人的行政区划
  54. print('数据库信息提取成功!')
  55. d={}
  56. city_list=[i.split('\t')for i in k]
  57. def intinput(*_):
  58. return int(input(*_).strip())
  59. def search(x,idx=-1,strict=False):
  60. """
  61. 根据城市名称搜索城市信息
  62. """
  63. if not x.strip():
  64. sys.exit()
  65. r=[]
  66. for i in city_list:
  67. if strict:
  68. if normalize(x.lower().strip())==normalize(i[1].lower().strip()):
  69. r.append(i)
  70. else:
  71. if normalize(x.lower().strip()) in normalize(i[1].lower().strip()):
  72. r.append(i)
  73. if len(r)==0:
  74. return []
  75. if len(r)==1:
  76. return r[0]
  77. if idx!=-1:
  78. return r[idx]
  79. r.sort()
  80. for i,j in enumerate(r):
  81. print(i,':',j)
  82. return r[intinput('搜索结果有多个城市,请输入编号选择:')]
  83. def lat_long(x):
  84. return (float(str(x[4])),float(str(x[5])))
  85. shsf=[]
  86. for i in ['Jinan','Taiyuan','Shijiazhuang','Zhengzhou','Kunming','Nanjing','Hefei','Guangzhou','Changsha','Hangzhou','Haikou','Hohhot',"Xi'an","Harbin",'Changchun','Shenyang','Urumqi','Lanzhou','Nanning','Nanchang','Fuzhou','Chengdu','Guiyang','Wuhan','Xining','Lhasa','Yinchuan']:
  87. z=search(i,strict=True)
  88. print(z)
  89. shsf.append(z)
  90. for i,j in enumerate(shsf):
  91. print(i,':',j[1])
  92. z=intinput('请输入编号选择省会/首府:')
  93. s=shsf[z]
  94. while 1:
  95. w=search(input('请输入要搜索的城市(啥都不输就退出):'))
  96. if not w:
  97. print('搜索失败,可能不存在该城市')
  98. continue
  99. print('搜索到的城市:',w)
  100. d=dis(lat_long(w),lat_long(s))
  101. print('该城市到省会/首府的距离(km):{:.2f}'.format(d))
  102. mind=minc=None
  103. for i in shsf:
  104. if (mind is None) or (mind>dis(lat_long(w),lat_long(i))):
  105. mind=dis(lat_long(w),lat_long(i))
  106. minc=i
  107. if minc[2]==s[2]:
  108. print('{}是到{}最近的省会/首府!'.format(s[1],w[1]))
  109. else:
  110. print('{}不是到{}最近的省会/首府!'.format(s[1],w[1]))
  111. print('{}到{}的距离比{}到{}的距离更近:{:.2f}km!'.format(minc[1],w[1],s[1],w[1],dis(lat_long(w),lat_long(minc))))
  112.  
  113.  
Tags: Automation
Advertisement
Add Comment
Please, Sign In to add comment