如何从LocationIQ API返回的JSON结果中提取lat与lon字段
提取LocationIQ API返回结果中的lat和lon字段
直接提取法(最简洁高效)
API返回的是包含单个字典的列表,无需借助pandas的read_json或json_normalize,直接通过列表索引+字典键访问即可,同时建议把字符串类型的经纬度转为数值类型:
修改后的完整代码:
import pandas as pd import requests # 读取建筑文件CSV(UTF-8编码) df = pd.read_csv('Building(LocationIQ).csv') # 循环调用API获取经纬度并写入DataFrame for i, row in df.iterrows(): api_address = str(df.at[i, 'Address']) url = "https://us1.locationiq.com/v1/search" params = { 'key': '******************', 'q': api_address, 'format': 'json', 'limit': 1 } response = requests.get(url, params=params) data = response.json() # 直接使用requests内置的JSON解析方法 # 确保返回结果非空(避免地址解析失败报错) if data: lat = float(data[0]['lat']) lon = float(data[0]['lon']) # 将经纬度存入原DataFrame df.at[i, '纬度'] = lat df.at[i, '经度'] = lon print(f"地址: {api_address} -> 纬度: {lat}, 经度: {lon}") # 保存带经纬度的结果到新CSV df.to_csv('Building_With_LatLon.csv', index=False)
使用json_normalize的方法(如果偏好pandas操作)
如果你坚持要用json_normalize,只需将返回的列表直接传入方法,再提取对应字段即可:
# 在循环内解析完data之后添加这段代码 if data: normalized_df = pd.json_normalize(data) # 提取第一条结果的lat和lon lat = float(normalized_df['lat'].iloc[0]) lon = float(normalized_df['lon'].iloc[0]) print(lat, lon)
为什么之前的方法失败?
pd.read_json更适合处理完整的JSON文件或批量JSON字符串,单条列表形式的JSON用它处理反而繁琐;- 若之前用
json_normalize失败,大概率是没有正确传入列表格式的data(比如误传了字典而非列表)。
内容的提问来源于stack exchange,提问作者Thomas Wong
相关产品推荐
相关产品推荐

