使用Python reverse_geocoder验证日本城市名称正确性
完成日本城市名称验证的Python代码指导
嘿,我来帮你把这段日本城市名称的验证逻辑补全!你已经搭好基础框架了,接下来咱们一步步完成剩下的部分,高效搞定城市名的验证工作:
1. 批量查询反向地理编码结果
reverse_geocoder的search()方法支持批量传入坐标列表,比你原来写的循环逐个查询效率高太多了!直接把打包好的coord列传进去就行:
# 批量查询经纬度对应的地理信息,返回字典列表 results = rg.search(df['coord'].tolist())
返回的results里,每个字典都包含了name(匹配到的城市名)、admin1(一级行政区,比如日本的都道府县)、cc(国家代码)这些关键信息,刚好用来和你的原始数据做对比。
2. 把验证结果合并到表格里
我们把查询到的真实城市名、行政区等信息提取出来,作为新列加到原DataFrame中,方便后续对比:
# 提取验证后的城市名、行政区和国家代码 df['verified_city'] = [res['name'] for res in results] df['verified_admin'] = [res['admin1'] for res in results] df['country_code'] = [res['cc'] for res in results]
3. 标记原始城市名是否匹配
接下来核心的一步:对比原始城市名和验证后的城市名,标记是否匹配。考虑到日文可能有汉字、平假名、片假名混合的情况,咱们可以用jaconv库统一格式,减少误判(先装库:pip install jaconv):
import jaconv # 这里把'city'换成你Excel里实际的城市名称列名! df['match'] = np.where( # 统一转成平假名并去除空格后对比 jaconv.kata2hira(df['city']).strip() == jaconv.kata2hira(df['verified_city']).strip(), '匹配', '不匹配' )
如果你的数据是英文城市名,直接转成小写对比就行,去掉jaconv的部分即可。
4. 处理查询异常情况
有些经纬度可能在海洋或者偏远无人区,reverse_geocoder可能返回空值,咱们加一列标记查询状态,方便后续排查:
# 标记每个坐标的查询是否成功 df['query_status'] = ['成功' if res['name'] else '查询失败' for res in results]
完整代码整合
把上面的步骤拼起来,就是完整的验证代码了:
import reverse_geocoder as rg import pandas as pd import numpy as np import jaconv # 处理日文格式用,不需要的话可以删掉 # 读取Excel表格 df = pd.read_excel('desktop/japan.xlsx') # 合并经纬度为坐标对 df['coord'] = list(zip(df.lat, df.long)) # 批量查询反向地理编码 results = rg.search(df['coord'].tolist()) # 提取验证信息到表格 df['verified_city'] = [res['name'] for res in results] df['verified_admin'] = [res['admin1'] for res in results] df['country_code'] = [res['cc'] for res in results] # 验证城市名称匹配(替换'city'为你的实际列名) df['match'] = np.where( jaconv.kata2hira(df['city']).strip() == jaconv.kata2hira(df['verified_city']).strip(), '匹配', '不匹配' ) # 标记查询状态 df['query_status'] = ['成功' if res['name'] else '查询失败' for res in results] # 预览前5行结果 print(df[['city', 'verified_city', 'match', 'query_status']].head()) # 保存验证后的表格到本地 df.to_excel('desktop/japan_verified.xlsx', index=False)
一些实用提示
- 确保
reverse_geocoder已经安装:pip install reverse_geocoder,它用的是本地数据库,不需要联网,速度很快 - 如果遇到“不匹配”的行,别直接判定原始数据错了——有可能是经纬度对应的是城市郊区,反向编码返回了市中心的名称,需要手动检查
- 如果需要更实时的地理数据,可以考虑用OpenStreetMap的Nominatim或者Google Maps API,但这些需要API密钥,还有请求次数限制
内容的提问来源于stack exchange,提问作者Liu Yu




