forked from bozdoz/wp-plugin-leaflet-map
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
bozdoz
committed
Aug 7, 2017
1 parent
7292587
commit 6653761
Showing
14 changed files
with
1,651 additions
and
1,309 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
<?php | ||
/** | ||
* Geocoder | ||
* | ||
* calls the specific geocoder function (chosen in admin or default: google_geocode) | ||
* | ||
* todo: candidate for separate class | ||
* | ||
* @param string $address the requested address to look up | ||
*/ | ||
|
||
class Leaflet_Geocoder { | ||
/** | ||
* Geocoder should return this on error/not found | ||
* @var array $not_found | ||
*/ | ||
private $not_found = array('lat' => 0, 'lng' => 0); | ||
/** | ||
* Latitude | ||
* @var float $lat | ||
*/ | ||
public $lat = 0; | ||
/** | ||
* Longitude | ||
* @var float $lng | ||
*/ | ||
public $lng = 0; | ||
|
||
public function __construct ($address) { | ||
$settings = Leaflet_Map_Plugin_Settings::init(); | ||
$address = urlencode( $address ); | ||
|
||
$geocoder = $settings->get('geocoder'); | ||
|
||
$cached_address = 'leaflet_' . $geocoder . '_' . $address; | ||
|
||
/* retrieve cached geocoded location */ | ||
$found_cache = get_option( $cached_address ); | ||
|
||
if ( $found_cache ) { | ||
return $found_cache; | ||
} | ||
|
||
$geocoding_method = $geocoder . '_geocode'; | ||
|
||
try { | ||
$location = (Object) $this->$geocoding_method( $address ); | ||
|
||
/* add location */ | ||
add_option($cached_address, $location); | ||
|
||
/* add option key to locations for clean up purposes */ | ||
$locations = get_option('leaflet_geocoded_locations', array()); | ||
array_push($locations, $cached_address); | ||
update_option('leaflet_geocoded_locations', $locations); | ||
} catch (Exception $e) { | ||
$location = $this->not_found; | ||
} | ||
// set variables | ||
$this->lat = $location->lat; | ||
$this->lng = $location->lng; | ||
} | ||
|
||
/** | ||
* Used by geocoders to make requests via curl or file_get_contents | ||
* | ||
* includes a try/catch | ||
* | ||
* @param string $url the urlencoded request url | ||
* @return varies object from API or null (failed) | ||
*/ | ||
private function get_url( $url ) { | ||
if (in_array('curl', get_loaded_extensions())) { | ||
/* try curl */ | ||
$ch = curl_init(); | ||
|
||
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); | ||
curl_setopt($ch, CURLOPT_HEADER, 0); | ||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||
curl_setopt($ch, CURLOPT_URL, $url); | ||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); | ||
|
||
$data = curl_exec($ch); | ||
curl_close($ch); | ||
|
||
return $data; | ||
} else if (ini_get('allow_url_fopen')) { | ||
/* try file get contents */ | ||
return file_get_contents( $url ); | ||
} | ||
|
||
$error_msg = 'Could not get url: ' . $url; | ||
throw new Exception( $error_msg ); | ||
} | ||
|
||
/** | ||
* Google geocoder (https://developers.google.com/maps/documentation/geocoding/start) | ||
* | ||
* @param string $address the urlencoded address to look up | ||
* @return varies object from API or null (failed) | ||
*/ | ||
|
||
private function google_geocode ( $address ) { | ||
$geocode_url = 'https://maps.googleapis.com/maps/api/geocode/json?address='; | ||
$geocode_url .= $address; | ||
$json = $this->get_url($geocode_url); | ||
|
||
if ($json) { | ||
$json = json_decode($json); | ||
/* found location */ | ||
if ($json->{'status'} == 'OK') { | ||
|
||
$location = $json->{'results'}[0]->{'geometry'}->{'location'}; | ||
|
||
return (Object) $location; | ||
} | ||
} | ||
|
||
return $this->not_found; | ||
} | ||
|
||
/** | ||
* OpenStreetMap geocoder Nominatim (https://nominatim.openstreetmap.org/) | ||
* | ||
* @param string $address the urlencoded address to look up | ||
* @return varies object from API or null (failed) | ||
*/ | ||
|
||
private function osm_geocode ( $address ) { | ||
$geocode_url = 'https://nominatim.openstreetmap.org/?format=json&limit=1&q='; | ||
$geocode_url .= $address; | ||
$json = $this->get_url($geocode_url); | ||
$json = json_decode($json); | ||
|
||
if (is_array($json) && | ||
is_object($json[0]) && | ||
$json[0]->lat) { | ||
// found location | ||
return (Object) array( | ||
'lat' => $json[0]->lat, | ||
'lng' => $json[0]->lon, | ||
); | ||
} | ||
|
||
return $this->not_found; | ||
} | ||
|
||
/** | ||
* Danish Addresses Web Application | ||
* (https://dawa.aws.dk) | ||
* | ||
* @param string $address the urlencoded address to look up | ||
* @return varies object from API or null (failed) | ||
*/ | ||
|
||
private function dawa_geocode ( $address ) { | ||
$geocode_url = 'https://dawa.aws.dk/adresser?format=json&q='; | ||
$geocode_url .= $address; | ||
$json = $this->get_url($geocode_url); | ||
$json = json_decode($json); | ||
|
||
if (is_array($json) && | ||
is_object($json[0]) && | ||
$json[0]->status == 1) { | ||
/* found location */ | ||
$location = (Object) array( | ||
'lat' => $json[0]->adgangsadresse->adgangspunkt->koordinater[1], | ||
'lng' => $json[0]->adgangsadresse->adgangspunkt->koordinater[0] | ||
); | ||
|
||
return $location; | ||
} | ||
|
||
return $this->not_found; | ||
} | ||
} |
Oops, something went wrong.