В политике использования OSM Nominatim указано, что вам необходимо предоставить заголовок запроса User-Agent
или HTTP-Referer
для идентификации приложения.Таким образом, использование пользовательского агента для маскировки под браузер конечного пользователя - не очень хороший этикет.
Вы можете найти политику использования здесь .В нем также говорится, что значения по умолчанию, используемые библиотеками http (например, используемые simplexml_load_file()
), недопустимы.
Вы говорите, что используете simplexml_load_string()
, но не можете сказать, как вы получаете XML дляэта функция.Но наиболее вероятный сценарий заключается в том, что какой бы метод вы не использовали для получения XML-файла, вы также пренебрегаете передачей обязательных заголовков.
Поэтому я бы создал запрос, используя php-curl, предоставьте один из этих заголовков для идентификации вашего приложения;и проанализируйте полученную строку XML с помощью simplexml_parse_string()
.
Например:
// setup variables
$nominatim_url = 'https://nominatim.openstreetmap.org/search?postalcode=28217&country=DE&format=xml&polygon=1&addressdetails=1&boundary=postalcode';
$user_agent = 'ID_Identifying_Your_App v100';
$http_referer = 'http://www.urltoyourapplication.com';
$timeout = 10;
// curl initialization
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $nominatim_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
// this is are the bits you are missing
// Setting curl's user-agent
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
// you an also use this one (http-referer), it's up to you. Either one or both.
curl_setopt($ch, CURLOPT_REFERER, $http_referer);
// get the XML
$data = curl_exec($ch);
curl_close($ch);
// load it in simplexml
$xml = simplexml_load_string($data);
// This was your code, left as it was
if (false === $xml) {
$errors = libxml_get_errors();
var_dump($errors);
}