为何部分地址调用Nominatim.openstreetmap.org时返回错误?
问题分析
你的问题出在地址字符串的URL编码不完整:只手动替换了空格为+,但像Brasília里的í、São Paulo里的ã这类非ASCII字符没有做URL编码,直接传入请求URL会导致Nominatim服务器识别为无效HTTP请求。官网能正常查询是因为浏览器自动完成了完整的URL编码,而你的代码没做这一步。
修复方案
不要手动替换空格,改用PHP的urlencode()函数对整个地址字符串做编码,确保所有特殊字符都符合URL规范。修改后的代码如下:
$addr = 'Brasília/DF, Brasil'; // 用urlencode处理完整地址,自动编码所有特殊字符和空格 $url = 'https://nominatim.openstreetmap.org/search?q=' . urlencode($addr) . '&format=jsonv2&polygon=0&addressdetails=0'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = [ 'Accept: text/html,application/xhtml+xml,application/xml', 'Accept-Language: en-US,en,pt-BR', 'Content-Type: text/html;charset=utf-8', 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $server_output = curl_exec($ch); curl_close($ch); var_export($server_output);
补充说明
urlencode()会把空格转换成+,同时编码所有非ASCII字符和特殊符号,完全符合URL规范。- 如果你用R语言的
download.file或geocode_OSM,同样需要确保地址参数做了完整的URL编码,比如R里用URLencode()函数处理地址字符串后再传入请求。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

