91 lines
2.9 KiB
PHP
91 lines
2.9 KiB
PHP
<?php
|
|
|
|
class Crunchbutton_GoogleGeocode
|
|
{
|
|
|
|
const r_Earth_miles = 3958.754641; // 6371000 * 0.000621371;
|
|
|
|
public static function toRadians($deg)
|
|
{
|
|
return $deg * M_PI / 180.0;
|
|
}
|
|
|
|
public static function latlonDistanceInMiles($lat1, $lon1, $lat2, $lon2) {
|
|
$phi1 = self::toRadians($lat1);
|
|
$phi2 = self::toRadians($lat2);
|
|
$dPhi = self::toRadians($lat2 - $lat1);
|
|
$dLambda = self::toRadians($lon2 - $lon1);
|
|
|
|
$a = (sin($dPhi / 2.0) * sin($dPhi / 2.0)) +
|
|
(cos($phi1) * cos($phi2) * sin($dLambda / 2.0) * sin($dLambda / 2.0));
|
|
$c = 2.0 * atan2(sqrt($a), sqrt(1.0 - $a));
|
|
return self::r_Earth_miles * $c;
|
|
}
|
|
|
|
public static function geocode($address)
|
|
{
|
|
$out = null;
|
|
$env = c::getEnv();
|
|
|
|
$rootUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address=';
|
|
$extra_api_text = '&key=';
|
|
|
|
if ($address) {
|
|
$address = str_replace(' ', '+', preg_replace('/\s+/', ' ', trim($address)));
|
|
$address = str_replace('#', '+', $address);
|
|
}
|
|
$url = $rootUrl
|
|
. $address
|
|
. $extra_api_text
|
|
. c::config()->google->{$env}->key;
|
|
$return = Crunchbutton_GoogleGeocode::get_data($url);
|
|
// print "$return\n";
|
|
$return = json_decode($return);
|
|
|
|
// $cmd = 'curl '
|
|
// . $rootUrl
|
|
// . $address
|
|
// . $extra_api_text
|
|
// . c::config()->google->{$env}->key;
|
|
// exec($cmd, $return);
|
|
// $return = json_decode(trim(join('', $return)));
|
|
// print "$url\n";
|
|
// if (isset($return->results)){
|
|
// $count = count($return->results);
|
|
// print "Number of results from Google geocode is $count\n";
|
|
// } else{
|
|
// print "No results from Google geocode\n";
|
|
// }
|
|
if ($return && isset($return->results) && count($return->results) == 1 && isset($return->results[0]->geometry)) {
|
|
$geometry = $return->results[0]->geometry;
|
|
// print_r( $geometry );
|
|
if (isset($geometry->location) && isset($geometry->location->lat) && isset($geometry->location->lng)) {
|
|
$lat = $geometry->location->lat;
|
|
$lon = $geometry->location->lng;
|
|
$out = new Crunchbutton_Order_Location($lat, $lon);
|
|
}
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
|
|
public static function get_data($url)
|
|
{
|
|
$ch = curl_init();
|
|
$timeout = 15;
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
|
curl_setopt($ch, CURLOPT_REFERER, "cockpit.la");
|
|
$data = curl_exec($ch);
|
|
|
|
//getinfo gets the data for the request
|
|
$info = curl_getinfo($ch);
|
|
//output the data to get more information.
|
|
// print_r($info);
|
|
curl_close($ch);
|
|
return $data;
|
|
}
|
|
|
|
}
|