private function executeQuery($query)
{
$request = $this->getMessageFactory()->createRequest('GET', $query);
$content = (string) $this->getHttpClient()->sendRequest($request)->getBody();
if (empty($content)) {
throw new NoResult(sprintf('Could not execute query "%s".', $query));
}
$json = json_decode($content, true);
// See https://mapzen.com/documentation/search/api-keys-rate-limits/
if (isset($json['meta'])) {
switch ($json['meta']['status_code']) {
case 403:
throw new InvalidCredentials('Invalid or missing api key.');
case 429:
throw new QuotaExceeded('Valid request but quota exceeded.');
}
}
if (!isset($json['type']) || $json['type'] !== 'FeatureCollection' || !isset($json['features']) || count($json['features']) === 0) {
throw new NoResult(sprintf('Could not find results for query "%s".', $query));
}
$locations = $json['features'];
if (empty($locations)) {
throw new NoResult(sprintf('Could not find results for query "%s".', $query));
}
$results = [];
foreach ($locations as $location) {
$bounds = [];
if (isset($location['bbox'])) {
$bounds = ['south' => $location['bbox'][3], 'west' => $location['bbox'][2], 'north' => $location['bbox'][1], 'east' => $location['bbox'][0]];
}
$props = $location['properties'];
$adminLevels = [];
foreach (['region', 'locality', 'macroregion', 'country'] as $i => $component) {
if (isset($props[$component])) {
$adminLevels[] = ['name' => $props[$component], 'level' => $i + 1];
}
}
$results[] = array_merge($this->getDefaults(), array('latitude' => $location['geometry']['coordinates'][1], 'longitude' => $location['geometry']['coordinates'][0], 'bounds' => $bounds ?: [], 'streetNumber' => isset($props['housenumber']) ? $props['housenumber'] : null, 'streetName' => isset($props['street']) ? $props['street'] : null, 'subLocality' => isset($props['neighbourhood']) ? $props['neighbourhood'] : null, 'locality' => isset($props['locality']) ? $props['locality'] : null, 'postalCode' => isset($props['postalcode']) ? $props['postalcode'] : null, 'adminLevels' => $adminLevels, 'country' => isset($props['country']) ? $props['country'] : null, 'countryCode' => isset($props['country_a']) ? strtoupper($props['country_a']) : null));
}
return $this->returnResults($results);
}