1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <?php
- namespace MapBundle\Util;
- class GeoDecode
- {
- /**
- * Calcula la distancia cartografica (NO TOPOGRAFICA) entre 2 coordenadas.
- * @param $lat1
- * @param $lng1
- * @param $lat2
- * @param $lng2
- * @param bool $km Me dice si quiero la distancia en kilometros. Por defecto esta en metros.
- * @return float|int Retorna la distancia en metros
- */
- public function distanceGeoPoints($lat1, $lng1, $lat2, $lng2, $km = false)
- {
- // curvatura de la tierra
- $earthRadius = 3958.75;
- $dLat = deg2rad($lat2 - $lat1);
- $dLng = deg2rad($lng2 - $lng1);
- $a = sin($dLat / 2) * sin($dLat / 2) +
- cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
- sin($dLng / 2) * sin($dLng / 2);
- $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
- $dist = $earthRadius * $c;
- // from miles
- $meterConversion = 1609;
- $geopointDistance = $dist * $meterConversion;
- return round(($km ? ($geopointDistance / 1000) : $geopointDistance), 3, PHP_ROUND_HALF_UP);
- }
- /**
- * Busca la latitud y longitud de acuerdo a la direccion que se pasa como parametro.
- * @param string $address Contiene la direccion.
- * @param string $city Contiene la ciudad.
- * @param string $state Contiene la provincia.
- * @param string $country Contiene el pais.
- * @param string $region Contiene el codigo de la region.
- * @return array Retorna un array con la latitud y longitud.
- */
- public function searchLatLng($address, $city, $state, $country, $region)
- {
- $url = "http://maps.google.com/maps/api/geocode/json?";
- $add = "address=" . $address . "," . $city . "," . $state . "," . $country;
- $add .= "&components=country:" . $region;
- $arrAddress = explode(" ", $add);
- $address = implode("+", $arrAddress);
- $url .= $address;
- $nc = 0;
- while ($nc < 5) {
- $json = $this->curl($url);
- if (strtoupper($json['status']) == 'OVER_QUERY_LIMIT') {
- sleep(1);
- } else if (strtoupper($json['status']) == 'ZERO_RESULTS') {
- break;
- } else if (strtoupper($json['status']) == 'OK') {
- break;
- }
- $nc++;
- }
- if (isset($json['results']) &&
- isset($json['results'][0]) &&
- isset($json['results'][0]['geometry']) &&
- isset($json['results'][0]['geometry']['location']) &&
- isset($json['results'][0]['geometry']['location']['lat']) &&
- isset($json['results'][0]['geometry']['location']['lng'])
- ) {
- return ['address' => $address,
- 'lat' => $json['results'][0]['geometry']['location']['lat'],
- 'lng' => $json['results'][0]['geometry']['location']['lng']];
- } else {
- return null;
- }
- }
- /**
- * @param string $url Contiene la url a buscar.
- * @return mixed Retorna un array con los datos del json.
- */
- private function curl($url)
- {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_URL, $url);
- $result = curl_exec($ch);
- return json_decode($result, true);
- }
- }
|