laravel-geolocation-api/Services/GeolocationApiService.php

101 lines
2.8 KiB
PHP
Raw Permalink Normal View History

2025-03-05 19:49:29 -06:00
<?php
namespace Koneko\GeolocationApi\Services;
use Illuminate\Support\Facades\Http;
class GeolocationApiService
{
/**
* Obtiene la configuración del servicio de geolocalización.
*/
protected function getConfig()
{
return [
'enabled' => Setting::getValue('geolocation.enabled', false),
'provider' => Setting::getValue('geolocation.provider', 'locationiq'),
'api_keys' => json_decode(Setting::getValue('geolocation.api_keys', '{}'), true),
'language' => Setting::getValue('geolocation.language', 'es'),
'country_bias' => Setting::getValue('geolocation.country_bias', 'MX'),
];
}
/**
* Obtiene coordenadas a partir de una dirección.
*/
public function getCoordinates(string $address, ?string $provider = null)
{
$config = $this->getConfig();
if (!$config['enabled']) {
return null;
}
$provider = $provider ?: $config['provider'];
$apiKey = $config['api_keys'][$provider] ?? null;
if (!$apiKey) {
return null;
}
return match ($provider) {
'locationiq' => $this->getLocationIQCoordinates($address, $apiKey, $config),
'google' => $this->getGoogleCoordinates($address, $apiKey, $config),
default => null,
};
}
/**
* Llama a la API de LocationIQ para obtener coordenadas.
*/
protected function getLocationIQCoordinates(string $address, string $apiKey, array $config)
{
$url = "https://us1.locationiq.com/v1/search.php";
$response = Http::get($url, [
'key' => $apiKey,
'q' => $address,
'format' => 'json',
'accept-language' => $config['language'],
'countrycodes' => $config['country_bias']
]);
if ($response->successful()) {
$data = $response->json();
return [
'lat' => $data[0]['lat'] ?? null,
'lng' => $data[0]['lon'] ?? null,
];
}
return null;
}
/**
* Llama a la API de Google Maps para obtener coordenadas.
*/
protected function getGoogleCoordinates(string $address, string $apiKey, array $config)
{
$url = "https://maps.googleapis.com/maps/api/geocode/json";
$response = Http::get($url, [
'key' => $apiKey,
'address' => $address,
'language' => $config['language'],
'region' => $config['country_bias']
]);
if ($response->successful()) {
$data = $response->json();
return [
'lat' => $data['results'][0]['geometry']['location']['lat'] ?? null,
'lng' => $data['results'][0]['geometry']['location']['lng'] ?? null,
];
}
return null;
}
}