如何使用Python和folium获取手机号追踪的正确坐标?现有代码异常
号码定位代码问题修复方案
问题根源
你的代码存在以下关键问题,导致坐标、运营商信息不准确,城市名称无法显示:
- 号码解析缺少国家码:
phonenumbers.parse()必须解析带国家码的号码(如+86138xxxxxxx),否则无法正确识别归属地和运营商 - 变量名冲突:用
geocoder变量覆盖了phonenumbers的geocoder模块,导致后续调用逻辑混乱 - 位置查询逻辑错误:仅用模糊的
location字符串查询坐标,若location为空或仅包含国家/地区,返回的坐标必然不准确 - 无异常处理:号码格式错误、API返回空结果时会直接崩溃
修复后的完整代码
import phonenumbers from phonenumbers import geocoder from phonenumbers import carrier from opencage.geocoder import OpenCageGeocode import folium # 替换为你的OpenCage API密钥 key = "YOUR_OPENCAGE_KEY" # 提示用户输入带国家码的号码 number = input("请输入带国家码的电话号码(如+86138xxxxxxx):") try: # 解析号码(必须带国家码) parsed_number = phonenumbers.parse(number) # 获取号码归属地(支持多语言,如"zh"返回中文) location = geocoder.description_for_number(parsed_number, "zh") print(f"归属地:{location}") # 获取运营商信息 service_name = carrier.name_for_number(parsed_number, "zh") print(f"运营商:{service_name}") # 初始化OpenCage地理编码器(避免变量名冲突) oc_geocoder = OpenCageGeocode(key) # 用归属地查询坐标,若归属地为空则用号码的国家码信息 query = location if location else phonenumbers.region_code_for_number(parsed_number) result = oc_geocoder.geocode(query, language="zh") if not result: print("无法获取坐标信息") else: lat = result[0]['geometry']['lat'] lng = result[0]['geometry']['lng'] print(f"坐标:{lat}, {lng}") # 生成地图 my_map = folium.Map(location=[lat, lng], zoom_start=12) folium.Marker([lat, lng], popup=f"{location}\n{service_name}").add_to(my_map) my_map.save("location.html") print("位置地图已生成,保存为location.html") except phonenumbers.NumberParseException: print("号码格式错误,请输入带国家码的有效电话号码") except Exception as e: print(f"程序出错:{str(e)}") print("感谢使用")
关键修复点说明
- 强制带国家码输入:明确提示用户输入如
+86138xxxxxxx格式的号码,确保phonenumbers能正确解析归属地和运营商 - 变量名重命名:将OpenCage的实例改为
oc_geocoder,避免覆盖phonenumbers的geocoder模块 - 多语言支持:将查询语言改为
"zh",返回中文归属地和运营商名称,更符合国内使用场景 - 异常处理:捕获号码解析错误、API调用异常等情况,避免程序崩溃并给出明确提示
- 容错逻辑:若归属地为空,自动用号码的国家码作为查询条件,确保能获取到基础坐标信息
内容的提问来源于stack exchange,提问作者TechExplorer
相关产品推荐
相关产品推荐

