# leaflet-map/2.10.0/class.geocoder.php

Leaflet Map, version 2.10.0. 195 lines.

- Page: https://pluginprobe.com/plugins/leaflet-map/2.10.0/code/class.geocoder.php
- Raw: https://pluginprobe.com/plugins/leaflet-map/2.10.0/raw/class.geocoder.php
- Modified: 2018-01-25T22:29:34+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/leaflet-map/2.10.0/code/class.geocoder.php#L10-L20`.

```php
<?php
/**
* Geocoder
*
* calls the specific geocoder function (chosen in admin or default: google_geocode)
*
*/

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;

	/**
	* new Geocoder from address
	*
	* handles url encoding and caching
	*
	* @param string $address the requested address to look up
	* @return NOTHING
	*/
	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 ) {
			$location = $found_cache;
		} else {
			// try geocoding
			$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) {
				// failed
			    $location = $this->not_found;
			}
		}

		// set variables
		$this->lat = $location->lat;
		$this->lng = $location->lng;
	}

	/**
	* Removes location caches
	*/
	public static function remove_caches () {
		$addresses = get_option('leaflet_geocoded_locations', array());
		foreach ($addresses as $address) {
			delete_option($address);
		}
		delete_option('leaflet_geocoded_locations');
	}

	/**
	* 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;
	}
}
```
