У меня возникают трудности с получением информации из API Here Maps (который имеет дело с JSON). Я пытаюсь преобразовать JSON в строку, чтобы его можно было сохранить в базе данных.
Широта и долгота являются наиболее важными для моего проекта.
$endereco = 'Rua Canapi 193, Guarulhos, Sao Paulo, Brasil';
$endereco = str_replace(" ", "+", $endereco);
$id = 'devportal-demo-20180625';
$cod = '9v2BkviRwi9Ot26kp2IysQ';
// https://geocoder.api.here.com/6.2/geocode.json?app_id=jz23R9Wi89IqwnnxZno0&app_code=g6DikMOdkOUyvGZN3kjW5A&searchtext=425+W+Randolph+Chicago
//$json = file_get_contents("http://autocomplete.geocoder.api.here.com/6.2/suggest.json?app_id=$id&app_code=$cod&query=$endereco&gen=9");//
//$json = file_get_contents("https://geocoder.api.here.com/6.2/geocode.json?searchtext=$endereco&app_id=$id&app_code=$cod&gen=9");
$json = file_get_contents("https://geocoder.api.here.com/6.2/geocode.json?app_id=$id&app_code=$cod&searchtext=$endereco");
echo'<pre>';
//print_r($json = json_decode($json, true));
print_r($json = json_decode($json));
echo'</pre>';
//echo $json->{'suggestions'}[0]->{'label'};
//var_dump( $json->{'Response'}{'MetaInfo'}[0]->{'Timestamp'});
Как вы можете видеть, я пытаюсь использовать другой URL-адрес json, который существует на странице документации. Здесь приведены карты API и есть другие способы, но я хочу использовать тот, который имеет широту и долготу.
Вы используете json_decode () метод как нормальный способ. Это вернет ОБЪЕКТ. Чтобы делать то, что вы хотите, вам нужно пройти правда в качестве второго параметра метода вернуть результат в виде ARRAY.
Кроме того, не делай str_replace () в параметре URI используйте UrlEncode () метод, который будет обрабатывать все специальные символы.
Ваш исправленный код будет:
<?php
$endereco = "Rua Canapi 193, Guarulhos, Sao Paulo, Brasil";
$id = "here_id";
$cod = "here_cod";
$json = json_decode ( file_get_contents ( "https://geocoder.api.here.com/6.2/geocode.json?app_id=" . urlencode ( $id) . "&app_code=" . urlencode ( $cod) . "&searchtext=" . urlencode ( $endereco)), true);
echo "Longitude: " . $json["Response"]["View"][0]["Result"][0]["Location"]["DisplayPosition"]["Longitude"] . "<br />";
echo "Latitude: " . $json["Response"]["View"][0]["Result"][0]["Location"]["DisplayPosition"]["Latitude"] . "<br />";
echo "<pre>";
print_r ( $json);
echo "</pre>";
?>
Я применил ваши данные образца Вот.
Это создает этот предоставленный URL:
https://geocoder.api.here.com/6.2/geocode.json?searchtext=Rua%20Canapi%20193%2C%20Guarulhos%2C%20Sao%20Paulo%2C%20Brasil&app_id=jz23R9Wi89IqwnnxZno0&app_code=g6DikMOdkOUyvGZN3kjW5A&
и сгенерировал эти данные JSON:
{
"Response": {
"MetaInfo": {
"Timestamp": "2018-10-17T03:35:57.353+0000"},
"View": [
{
"_type": "SearchResultsViewType",
"ViewId": 0,
"Result": [
{
"Relevance": 1,
"MatchLevel": "houseNumber",
"MatchQuality": {
"Country": 1,
"State": 1,
"City": 1,
"Street": [
1
],
"HouseNumber": 1
},
"MatchType": "pointAddress",
"Location": {
"LocationId": "NT_ySMW7zgrnTcVMzktS0t7FC_xkzM",
"LocationType": "point",
"DisplayPosition": {
"Latitude": -23.46615,
"Longitude": -46.42356
},
"NavigationPosition": [
{
"Latitude": -23.4662,
"Longitude": -46.42354
}
],
"MapView": {
"TopLeft": {
"Latitude": -23.4650258,
"Longitude": -46.4247855
},
"BottomRight": {
"Latitude": -23.4672742,
"Longitude": -46.4223345
}
},
"Address": {
"Label": "Rua Canapi, 193, Pimentas, Guarulhos - SP, 07272-060, Brasil",
"Country": "BRA",
"State": "SP",
"City": "Guarulhos",
"District": "Pimentas",
"Street": "Rua Canapi",
"HouseNumber": "193",
"PostalCode": "07272-060",
"AdditionalData": [
{
"value": "Brasil",
"key": "CountryName"},
{
"value": "São Paulo",
"key": "StateName"}
]
}
}
}
]
}
]
}
}
Сначала декодируйте JSON в объект или массив. В синтаксисе объектов нет ничего плохого, поэтому я покажу это.
$obj = json_decode($json);
Изолировать Timestamp
значение с использованием объекта ->
синтаксис, не требует фигурных скобок и цитирования, это может выглядеть так: (демонстрация)
echo $obj->Response->MetaInfo->Timestamp;
// 2018-10-17T03:35:57.353+0000
Что бы это ни было: $json->{'suggestions'}[0]->{'label'};
эти данные не доступны.
Для данных широты и долготы, вот полный аккумулятор:
Код: (демонстрация)
echo "Display Position Latitude: " , $obj->Response->View[0]->Result[0]->Location->DisplayPosition->Latitude;
echo "\nDisplay Position Longitude: " , $obj->Response->View[0]->Result[0]->Location->DisplayPosition->Longitude;
echo "\nNavigation Position Latitude: " , $obj->Response->View[0]->Result[0]->Location->NavigationPosition[0]->Latitude;
echo "\nNavigation Position Longitude: " , $obj->Response->View[0]->Result[0]->Location->NavigationPosition[0]->Longitude;
echo "\nMap View Top Left Latitude: " , $obj->Response->View[0]->Result[0]->Location->MapView->TopLeft->Latitude;
echo "\nMap View Top Left Longitude: " , $obj->Response->View[0]->Result[0]->Location->MapView->TopLeft->Longitude;
echo "\nMap View Bottom Right Latitude: " , $obj->Response->View[0]->Result[0]->Location->MapView->BottomRight->Latitude;
echo "\nMap View Bottom Right Longitude: " , $obj->Response->View[0]->Result[0]->Location->MapView->BottomRight->Longitude;
Выход:
Display Position Latitude: -23.46615
Display Position Longitude: -46.42356
Navigation Position Latitude: -23.4662
Navigation Position Longitude: -46.42354
Map View Top Left Latitude: -23.4650258
Map View Top Left Longitude: -46.4247855
Map View Bottom Right Latitude: -23.4672742
Map View Bottom Right Longitude: -46.4223345
Наконец, чтобы сделать задачу построения строки запросов проще / чище, используйте http_build_query()
:
Код: (демонстрация)
$data = [
'searchtext' => 'Rua Canapi 193, Guarulhos, Sao Paulo, Brasil',
'app_id' => 'devportal-demo-20180625',
'app_code' => '9v2BkviRwi9Ot26kp2IysQ'
];
$json = file_get_contents('https://geocoder.api.here.com/6.2/geocode.json?' . http_build_query($data));