使用 PHP 的 BING 地图 REST API

Posted

技术标签:

【中文标题】使用 PHP 的 BING 地图 REST API【英文标题】:BING Maps REST API using PHP 【发布时间】:2018-08-06 14:43:44 【问题描述】:

我正在使用 Bing Maps API 对地址进行地理编码。我从这个页面https://msdn.microsoft.com/en-us/library/ff817004.aspx 中取出了一个示例,它是基于表单的过程,您必须在其中提交地址以获得经度和纬度。现在摆在我面前的需求是,我想手动将地址放入php页面并获取经度和纬度。它没有发生。这是我们目前所尝试的:

   $key=key;

   $baseURL = "http://dev.virtualearth.net/REST/v1/Locations";

   $query ="Rajalakshmi Mill Road, Singanallur";
   $findURL = $baseURL."/".$query."?output=xml&key=Aukd2ilaNJexSjdSjdkoGr26cpoqaVUhOg0MbDTZtfPGClozardCt_1iRscSm5Xo";

   $output = file_get_contents($findURL);
   $response = new SimpleXMLElement($output);

   // Extract and pring latitude and longitude coordinates from results
   $latitude = $response->ResourceSets->ResourceSet->Resources->Location->Point->Latitude;
   $longitude = $response->ResourceSets->ResourceSet->Resources->Location->Point->Longitude;
   $longitude = $response->ResourceSets->ResourceSet->Resources->Location->Point->Longitude;
   $address = $response->ResourceSets->ResourceSet->Resources->Location->Address->FormattedAddress->State;

   echo "Latitude: ".$latitude."<br>";
   echo "Longitude: ".$longitude."<br>";
   echo $address1;

我该怎么办?

【问题讨论】:

首先我会删除你的 api 密钥 ;) “它没有发生”到底是什么意思?您尝试过什么来调试您的问题? 我已经更新了这个问题。做检查。 谢谢多梅尼克。我做的很匆忙,弄错了。 您不使用提供的架构:http://dev.virtualearth.net/REST/v1/Locations/countryRegion/adminDistrict/postalCode/locality/addressLine?key=yourBingMapsKey。我还建议在浏览器中输入 url.... 【参考方案1】:

查看 MSDN 页面,我看到您必须在发送查询之前执行此操作,

$query = str_ireplace(" ","%20",$_POST['query']);

该 api 要求您手动将空格字符替换为 %20。您还可以使用 url_encode 作为更安全的选择。

其他选项包括按照@Domenik Reitzner 的建议使用 curl。

$ch = curl_init();

// Set query data here with the URL
curl_setopt($ch, CURLOPT_URL, $findURL); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$content = trim(curl_exec($ch));
curl_close($ch);
$response = new SimpleXMLElement($content);

更新:

我刚刚看到您的答案的更新,并且您在其中包含了一个 URL,当我尝试访问它时,这就是结果。

顺便说一句,我建议您删除您的凭据并生成一个新凭据,并记住下次不要在线发布您的 API 密钥。

更新 2

发现问题,baseUrl应该是

http://dev.virtualearth.net/REST/v1/Locations

而不是

http://dev.virtualearth.net/REST/v1/Routes

您问题中的代码具有正确的 URL,但您得到的错误具有错误的 URL。

这是我查询http://dev.virtualearth.net/REST/v1/Locations/Rajalakshmi%20Mill%20Road,%20Singanallur,%20Coimbatore?output=xml&amp;key=YOURAPIKEY时得到的结果

【讨论】:

糟糕的是,我认为有效凭据是错误的。没想到要多看两眼,哈哈 @DomenikReitzner 似乎他正在查询的baseURL 是问题所在。 @kks21199。谢谢,我可以忍受你的讽刺,因为你给我解决了哈哈。无论如何,谢谢大家的帮助。【参考方案2】:

这是我通过提供的链接得到的回复:

<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1">
    <Copyright>
        Copyright © 2018 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.
    </Copyright>
    <BrandLogoUri>
        http://dev.virtualearth.net/Branding/logo_powered_by.png
    </BrandLogoUri>
    <StatusCode>400</StatusCode>
    <StatusDescription>Bad Request</StatusDescription>
    <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
    <ErrorDetails>
        <string>One or more parameters are not valid.</string>
        <string>
            travelMode: This parameter value has an invalid format.
        </string>
    </ErrorDetails>
    <TraceId>
        dea21427b82347128fc5f7012bda5592|DB40060630|7.7.0.0
    </TraceId>
    <ResourceSets/>
</Response>

这让我回到了预期的 URL 格式:

http://dev.virtualearth.net/REST/v1/Locations/countryRegion/adminDistrict/postalCode/locality/addressLine?key=yourBingMapsKey

【讨论】:

以上是关于使用 PHP 的 BING 地图 REST API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 将 Bing 地图四键转换为缩放级别、x 坐标和 y 坐标?

使用 bing 地图 API,我可以进行服务器端调用并获取给定城市的纬度/经度吗?

OpenLayers 3 - Bing 地图不会在 Windows 应用程序中加载

Xamarin 上的 Bing Speech API/语音服务(无 REST,sdk websocket 来处理连续识别)

s-s-rS 2012 显示 Bing 地图图像

Ruby 地理编码库与最新的 Google 地图、Yahoo 地图、Bing API 兼容