123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?php
- /*
- * (c) Camptocamp <info@camptocamp.com>
- * (c) Patrick Hayes
- *
- * This code is open-source and licenced under the Modified BSD License.
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * PHP Google Geocoder Adapter
- *
- *
- * @package geoPHP
- * @author Patrick Hayes <patrick.d.hayes@gmail.com>
- */
- class GoogleGeocode extends GeoAdapter
- {
- /**
- * Read an address string or array geometry objects
- *
- * @param string - Address to geocode
- * @param string - Type of Geometry to return. Can either be 'points' or 'bounds' (polygon)
- * @param Geometry|bounds-array - Limit the search area to within this region. For example
- * by default geocoding "Cairo" will return the location of Cairo Egypt.
- * If you pass a polygon of illinois, it will return Cairo IL.
- * @param return_multiple - Return all results in a multipoint or multipolygon
- * @return Geometry|GeometryCollection
- */
- public function read($address, $return_type = 'point', $bounds = FALSE, $return_multiple = FALSE) {
- if (is_array($address)) $address = join(',', $address);
-
- if (gettype($bounds) == 'object') {
- $bounds = $bounds->getBBox();
- }
- if (gettype($bounds) == 'array') {
- $bounds_string = '&bounds='.$bounds['miny'].','.$bounds['minx'].'|'.$bounds['maxy'].','.$bounds['maxx'];
- }
- else {
- $bounds_string = '';
- }
-
- $url = "http://maps.googleapis.com/maps/api/geocode/json";
- $url .= '?address='. urlencode($address);
- $url .= $bounds_string;
- $url .= '&sensor=false';
- $this->result = json_decode(@file_get_contents($url));
-
- if ($this->result->status == 'OK') {
- if ($return_multiple == FALSE) {
- if ($return_type == 'point') {
- return $this->getPoint();
- }
- if ($return_type == 'bounds' || $return_type == 'polygon') {
- return $this->getPolygon();
- }
- }
- if ($return_multiple == TRUE) {
- if ($return_type == 'point') {
- $points = array();
- foreach ($this->result->results as $delta => $item) {
- $points[] = $this->getPoint($delta);
- }
- return new MultiPoint($points);
- }
- if ($return_type == 'bounds' || $return_type == 'polygon') {
- $polygons = array();
- foreach ($this->result->results as $delta => $item) {
- $polygons[] = $this->getPolygon($delta);
- }
- return new MultiPolygon($polygons);
- }
- }
- }
- else {
- if ($this->result->status) throw new Exception('Error in Google Geocoder: '.$this->result->status);
- else throw new Exception('Unknown error in Google Geocoder');
- return FALSE;
- }
- }
- /**
- * Serialize geometries into a WKT string.
- *
- * @param Geometry $geometry
- * @param string $return_type Should be either 'string' or 'array'
- *
- * @return string Does a reverse geocode of the geometry
- */
- public function write(Geometry $geometry, $return_type = 'string') {
- $centroid = $geometry->getCentroid();
- $lat = $centroid->getY();
- $lon = $centroid->getX();
-
- $url = "http://maps.googleapis.com/maps/api/geocode/json";
- $url .= '?latlng='.$lat.','.$lon;
- $url .= '&sensor=false';
- $this->result = json_decode(@file_get_contents($url));
-
- if ($this->result->status == 'OK') {
- if ($return_type == 'string') {
- return $this->result->results[0]->formatted_address;
- }
- if ($return_type == 'array') {
- return $this->result->results[0]->address_components;
- }
- }
- else {
- if ($this->result->status) throw new Exception('Error in Google Reverse Geocoder: '.$this->result->status);
- else throw new Exception('Unknown error in Google Reverse Geocoder');
- return FALSE;
- }
- }
-
- private function getPoint($delta = 0) {
- $lat = $this->result->results[$delta]->geometry->location->lat;
- $lon = $this->result->results[$delta]->geometry->location->lng;
- return new Point($lon, $lat);
- }
- private function getPolygon($delta = 0) {
- $points = array (
- $this->getTopLeft($delta),
- $this->getTopRight($delta),
- $this->getBottomRight($delta),
- $this->getBottomLeft($delta),
- $this->getTopLeft($delta),
- );
- $outer_ring = new LineString($points);
- return new Polygon(array($outer_ring));
- }
- private function getTopLeft($delta = 0) {
- $lat = $this->result->results[$delta]->geometry->bounds->northeast->lat;
- $lon = $this->result->results[$delta]->geometry->bounds->southwest->lng;
- return new Point($lon, $lat);
- }
- private function getTopRight($delta = 0) {
- $lat = $this->result->results[$delta]->geometry->bounds->northeast->lat;
- $lon = $this->result->results[$delta]->geometry->bounds->northeast->lng;
- return new Point($lon, $lat);
- }
-
- private function getBottomLeft($delta = 0) {
- $lat = $this->result->results[$delta]->geometry->bounds->southwest->lat;
- $lon = $this->result->results[$delta]->geometry->bounds->southwest->lng;
- return new Point($lon, $lat);
- }
- private function getBottomRight($delta = 0) {
- $lat = $this->result->results[$delta]->geometry->bounds->southwest->lat;
- $lon = $this->result->results[$delta]->geometry->bounds->northeast->lng;
- return new Point($lon, $lat);
- }
- }
|