我正在使用 PHP 通过 OpenStreetMap 对一些地址进行地理编码。这是我的代码:
$addr = 'Brasília/DF, Brasil';
$url = 'https://nominatim.openstreetmap.org/search?q='.str_replace(' ','+',$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);
更改第一行中的
$addr
会产生不同的结果。对于一些人来说,比如Copacabana, Rio de Janeiro/RJ, Brasil
,它给了我完整的结果。对于其他人,例如 Brasília/DF, Brasil
或 Morumbi, São Paulo/SP, Brasil
,它给出 Invalid HTTP request received
,即使这些地址显示在他们的网站上。
还尝试使用 R
download.file
和 geocode_OSM
函数,同样的问题。
按照评论中的建议,我应该在 PHP 中的 URL 变量部分使用
urlencode
。
$url = 'https://nominatim.openstreetmap.org/search?q='.urlencode($addr).'&format=jsonv2&polygon=0&addressdetails=0';
在 R 中,
geocode_OSM
似乎也期望地址首先通过 URLencode
传递(如果帮助解释了这一点,那就太好了)。
library(tmaptools)
d = read.csv('my_data.csv',sep='\t')
d$lat = NA
d$lon = NA
nerr = 0
for (i in 1:nrow(d)) {
print(paste0(i,'/',nrow(d)))
coord = try(geocode_OSM(URLencode(d$addr[i])))
if (inherits(coord, "try-error")) {
nerr = nerr + 1
print(paste0('ERROR 1: ',d$addr[i]))
} else {
if (!is.null(coord)) {
d$lon[i] = coord$coords[1]
d$lat[i] = coord$coords[2]
} else {
print(paste0('ERROR 2: ',d$addr[i]))
}
}
flush.console()
Sys.sleep(1)
}