如何使用 PHP 访问 OpenStreetMap API 数据?

mas*_*ool 3 php api openstreetmap

我正在尝试使用 PHP 访问 OpenStreetMap 数据,但我找不到有关如何执行此操作的任何明确答案。当我在浏览器中搜索它时,我试图从中提取数据的 URL。这是我正在尝试的网址:https://nominatim.openstreetmap.org/search?q=jacksonville,florida&format=json

这就是我试图在我的 PHP 文件中访问它的方式,但它总是不返回任何内容。

    $search_url = "https://nominatim.openstreetmap.org/search?q=jacksonville,florida&format=json";
    $json = file_get_contents($search_url);

    print_r($json);
    echo "json=" . $json;
    $decoded = json_decode($json, true);
    $lat = $decoded[0]["lat"];
    $lng = $decoded[0]["lon"];
    echo " latitude=".$lat . " -----" . "longitude=".$lng;
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?我的最终目标是简单地获得一个城市、州的纬度和经度。

Ter*_*nox 5

我怀疑 api 拒绝提供没有有效 User-Agent 标头的请求,尝试设置它并且它应该可以工作,例如:

<?php

$search_url = "https://nominatim.openstreetmap.org/search?q=jacksonville,florida&format=json";

$httpOptions = [
    "http" => [
        "method" => "GET",
        "header" => "User-Agent: Nominatim-Test"
    ]
];

$streamContext = stream_context_create($httpOptions);
$json = file_get_contents($search_url, false, $streamContext);

print_r($json);
echo "json=" . $json;
$decoded = json_decode($json, true);
$lat = $decoded[0]["lat"];
$lng = $decoded[0]["lon"];
echo " latitude=".$lat . " -----" . "longitude=".$lng;
Run Code Online (Sandbox Code Playgroud)

  • User-Agent 标头告诉 Web 服务客户端类型。如果没有设置此标头,许多 API 将拒绝提供服务,因此在进行 API 调用时将其设置为合理的值是一个很好的做法。只要它不为空,您就可以将其设置为几乎任何内容! (2认同)
  • 服务器实际上会告诉你出了什么问题。“*您应该特别验证您是否设置了一个自定义 HTTP 引荐来源网址或 HTTP 用户代理来标识您的应用程序*” `file_get_contents` 只是不会在请求成功时返回任何内容,这与curl 不同。 (2认同)