如何用Wikidata API的SPARQL查询获取阿尔及利亚城市坐标
获取阿尔及利亚城市经纬度的SPARQL查询方案
核心SPARQL查询
SELECT ?city ?name ?coord WHERE { ?city wdt:P31 wd:Q515 ; # 筛选实例为“城市”的实体 wdt:P17 wd:Q288 ; # 限定所属国家为阿尔及利亚 wdt:P625 ?coord ; # 获取城市的坐标信息 rdfs:label ?name . # 获取城市名称标签 # 过滤常用语言标签(适配阿尔及利亚的法语/阿拉伯语环境,可按需调整) FILTER(LANG(?name) = "fr" || LANG(?name) = "ar" || LANG(?name) = "en") } ORDER BY ?name
查询字段说明
?city:Wikidata中城市实体的唯一ID(格式如http://www.wikidata.org/entity/Q1234)?name:城市的多语言名称,可根据你数据库中城市名的语言选择对应标签(比如仅保留法语名就把过滤条件改成FILTER(LANG(?name) = "fr"))?coord:城市的经纬度坐标,格式为Point(经度 纬度)
与你的Python代码结合
把上述查询替换到代码的query变量中,循环处理结果时可按以下方式提取数据:
for result in results["results"]["bindings"]: city_wikidata_id = result["city"]["value"] city_name = result["name"]["value"] # 解析坐标:从"Point(xx.xxx yy.yyy)"格式中提取经纬度数值 coord_str = result["coord"]["value"].strip("Point()") longitude, latitude = map(float, coord_str.split()) # 此处写入你的Django数据库更新逻辑,比如根据city_name匹配数据库条目并更新经纬度字段
可选优化(精准匹配)
如果你的数据库中已经存储了城市对应的Wikidata ID,可以直接通过ID批量查询,提升效率:
SELECT ?city ?name ?coord WHERE { VALUES ?city { wd:Q123 wd:Q456 wd:Q789 } # 替换为你数据库中的城市Wikidata ID列表 ?city wdt:P625 ?coord ; rdfs:label ?name . FILTER(LANG(?name) = "fr") }
内容的提问来源于stack exchange,提问作者Mohcen CH
相关产品推荐
相关产品推荐

