Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- path_db=r'CN.txt'
- '''
- 部分代码由AI编写
- GeoNames数据库下载:https://download.geonames.org/export/dump/CN.zip
- 解压后请将CN.txt文件放在当前目录下
- 出现“请输入要搜索的城市(啥都不输就退出):”的询问前如果有询问,找到代表省会/首府城市的编号并输入
- 然后输入本省省会的编号,接下来输入城市英文名称(一般是拼音,自治州请输入首府)
- 部分城市无数据
- '''
- import math,unicodedata,sys
- def dis(s, t):
- """
- 计算地球上两点间的大圆距离(单位:公里)
- 参数:
- s: 第一个点的经纬度元组(纬度, 经度),角度制
- t: 第二个点的经纬度元组(纬度, 经度),角度制
- 返回:
- 两点间的大圆距离(公里)
- """
- # 地球平均半径(公里)
- R = 6371.0
- # 将角度转换为弧度
- lat1, lon1 = math.radians(s[0]), math.radians(s[1])
- lat2, lon2 = math.radians(t[0]), math.radians(t[1])
- # 计算经纬度差值
- dlat = lat2 - lat1
- dlon = lon2 - lon1
- # Haversine公式
- a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
- c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
- return R * c
- def normalize(text):
- """
- 将包含特殊字符的文本转换为普通ASCII字符
- 例如:ü → u, ç → c, ß → ss
- """
- # 使用NFKD规范化分解字符后再过滤掉变音符号
- normalized = unicodedata.normalize('NFKD', text)
- return ''.join(
- c for c in normalized
- if not unicodedata.combining(c)
- ).replace('’',"'")
- 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人的行政区划
- print('数据库信息提取成功!')
- d={}
- city_list=[i.split('\t')for i in k]
- def intinput(*_):
- return int(input(*_).strip())
- def search(x,idx=-1,strict=False):
- """
- 根据城市名称搜索城市信息
- """
- if not x.strip():
- sys.exit()
- r=[]
- for i in city_list:
- if strict:
- if normalize(x.lower().strip())==normalize(i[1].lower().strip()):
- r.append(i)
- else:
- if normalize(x.lower().strip()) in normalize(i[1].lower().strip()):
- r.append(i)
- if len(r)==0:
- return []
- if len(r)==1:
- return r[0]
- if idx!=-1:
- return r[idx]
- r.sort()
- for i,j in enumerate(r):
- print(i,':',j)
- return r[intinput('搜索结果有多个城市,请输入编号选择:')]
- def lat_long(x):
- return (float(str(x[4])),float(str(x[5])))
- shsf=[]
- 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']:
- z=search(i,strict=True)
- print(z)
- shsf.append(z)
- for i,j in enumerate(shsf):
- print(i,':',j[1])
- z=intinput('请输入编号选择省会/首府:')
- s=shsf[z]
- while 1:
- w=search(input('请输入要搜索的城市(啥都不输就退出):'))
- if not w:
- print('搜索失败,可能不存在该城市')
- continue
- print('搜索到的城市:',w)
- d=dis(lat_long(w),lat_long(s))
- print('该城市到省会/首府的距离(km):{:.2f}'.format(d))
- mind=minc=None
- for i in shsf:
- if (mind is None) or (mind>dis(lat_long(w),lat_long(i))):
- mind=dis(lat_long(w),lat_long(i))
- minc=i
- if minc[2]==s[2]:
- print('{}是到{}最近的省会/首府!'.format(s[1],w[1]))
- else:
- print('{}不是到{}最近的省会/首府!'.format(s[1],w[1]))
- print('{}到{}的距离比{}到{}的距离更近:{:.2f}km!'.format(minc[1],w[1],s[1],w[1],dis(lat_long(w),lat_long(minc))))
Advertisement
Add Comment
Please, Sign In to add comment