为什么有些地址(而不是其他地址)在 nominatim.openstreetmap.org 上给出错误?

问题描述 投票:0回答:1

我正在使用 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 curl openstreetmap geocoding
1个回答
0
投票

按照评论中的建议,我应该在 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.