diff options
Diffstat (limited to 'protected/extensions/egmap/EGMapPolygon.php')
| -rw-r--r-- | protected/extensions/egmap/EGMapPolygon.php | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/protected/extensions/egmap/EGMapPolygon.php b/protected/extensions/egmap/EGMapPolygon.php new file mode 100644 index 0000000..6b943c7 --- /dev/null +++ b/protected/extensions/egmap/EGMapPolygon.php @@ -0,0 +1,328 @@ +<?php + +/** + * + * EGMapPolygon + * A GoogleMap Polygon + * + * @author Matt Kay + * + * @since 2011-03-10 + * Added this class based on EGMapMarker + * @TODO: look at event + * @TODO: get static version of an overlay (polygon) + * @TODO: modify $events to CTypeMap('EGMapEvent') (originates from EGMapMarker) + * + * + * @copyright + * + * Copyright (c) 2010 Antonio Ramirez - Matt Kay + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * The above copyright notice and this permission notice shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +class EGMapPolygon extends EGMapBase { + + protected $options = array( + // coordinates of the polygon + 'paths' => null, + // stroke color of the edge of the polygon + 'strokeColor' => '"#FF0000"', + //stroke opacity of the edge of the polygon + 'strokeOpacity' => 0.8, + //stroke weight of the edge of the polygon + 'strokeWeight' => 2, + //fill color of the polygon + 'fillColor' => '"#FF0000"', + //fill opacity of the polygon + 'fillOpacity' => 0.35 + ); + protected $info_window = null; + protected $info_window_shared = false; + protected $events = null; + protected $custom_properties = array(); + protected $polygon_object = 'google.maps.Polygon'; + + /** + * @param string $js_name Javascript name of the polygon + * @param EGMapCoord[] array coordinates of the polygon + * @param string $js_name name of the polygon variable + * @param array $options of the polygon + * @param EGmapEvent[] array of GoogleMap Events linked to the polygon + * @author Matt Kay + */ + public function __construct($coords, $options = array(), $js_name='polygon', $events=array()) + { + if ($js_name !== 'polygon') + $this->setJsName($js_name); + + // coords wont make any difference here + // as it will be set afterwards by setCoords + $this->setOptions($options); + + $this->setCoords($coords); + + $this->events = new CTypedList('EGMapEvent'); + + $this->setEvents($events); + } + + /** + * + * Batch set events by an array of EGMapEvents + * @param array $events + */ + public function setEvents($events) + { + if (!is_array($events)) + throw new CException(Yii::t('EGMap', 'Parameter of "{class}.{method}" {e}.', array('{class}' => get_class($this), '{method}' => 'setEvents', '{e}' => 'must be of type array'))); + if (null === $this->events) + $this->events = new CTypedList('EGMapEvent'); + + foreach ($events as $e) + { + $this->events->add($e); + } + } + + /** + * Adds an event listener to the marker + * + * @param EGMapEvent $event + */ + public function addEvent(EGMapEvent $event) + { + $this->events->add($event); + } + + /** + * @param array $options + * @author fabriceb + * @since 2011-03-10 + * modified for EGMapPolygon by Matt Kay + */ + public function setOptions($options) + { + + $this->options = array_merge($this->options, $options); + } + + /** + * gets the coordinates of the polygon + * + * @param EGMapCoord[] $polygon_coords + * @author Matt Kay + */ + public function getCoords() + { + return $this->options['paths']; + } + + /** + * sets the coordinates of the polygon + * + * @param EGMapCoord[] $polygon_coords + * @author Matt Kay + */ + public function setCoords($coords) + { + $tmp = array(); + // go through array to check for valid EGMapCoord objects + foreach ($coords as $coord) + { + if (is_a($coord, 'EGMapCoord')) + { + $tmp[] = $coord; + } + } + // throw Exception when number of coords is not sufficient for desribing a polygon + if (sizeof($tmp) < 3) + { + throw new CException(Yii::t('EGMapPolygon', 'EGMapPolygon argument #1 has to be an array of minimum three EGMapCoord objects.')); + } + $this->options['paths'] = $tmp; + } + /** + * + * Return center of bounds + */ + public function getCenterOfBounds() + { + return EGMapBounds::getBoundsContainingPolygons(array($this))->getCenterCoord(); + } + /** + * @param string $map_js_name + * @return string Javascript code to create the polygon + * @author Matt Kay + * @since 2011-03-10 + * Added this method based on the one in the class EGMapMarker + * @since 2011-16-12 + * Added Info window support + */ + public function toJs($map_js_name = 'map') + { + $this->options['map'] = $map_js_name; + + $return = ''; + if (null !== $this->info_window) + { + if ($this->info_window_shared) + { + $info_window_name = $map_js_name . '_info_window'; + $this->addEvent( + new EGMapEvent( + 'click', + 'if (' . $info_window_name . ') ' . $info_window_name . '.close();' . PHP_EOL . + $info_window_name . ' = ' . $this->info_window->getJsName() . ';' . PHP_EOL . + $info_window_name . ".setPosition(" . $this->getCenterOfBounds()->toJs() . ");" . PHP_EOL . + $info_window_name . ".open(" . $map_js_name . ");" . PHP_EOL + )); + } + else + $this->addEvent(new EGMapEvent('click', + $this->info_window->getJsName() . ".setPosition(" . $this->getCenterOfBounds()->toJs() . ");" . PHP_EOL . + $this->info_window->getJsName() . ".open(" . $map_js_name . ");" . PHP_EOL + )); + $return .= $this->info_window->toJs(); + } + + $return .='var ' . $this->getJsName() . ' = new ' . $this->polygon_object . '(' . EGMap::encode($this->options) . ');' . PHP_EOL; + foreach ($this->custom_properties as $attribute => $value) + { + $return .= $this->getJsName() . "." . $attribute . " = '" . $value . "';" . PHP_EOL; + } + foreach ($this->events as $event) + { + $return .= $event->getEventJs($this->getJsName()) . PHP_EOL; + } + + $return .= $this->getJsName() . '.setMap(' . $map_js_name . ');'; + + return $return; + } + + /** + * Adds an onlick listener that open a html window with some text + * + * @param EGMapInfoWindow $info_window + * @param boolean $shared among other markers (unique info_window display) + * + * @author Antonio Ramirez + * @since 2011-01-23 Added shared functionality for infoWindows + */ + public function addHtmlInfoWindow(EGMapInfoWindow $info_window, $shared = true) + { + $this->info_window = $info_window; + $this->info_window_shared = $shared; + } + + /** + * + * @return boolean if info window is shared or not + */ + public function htmlInfoWindowShared() + { + return $this->info_window_shared; + } + + /** + * @return EGMapInfoWindow + * @author Antonio Ramirez + */ + public function getHtmlInfoWindow() + { + return $this->info_window; + } + + /** + * + * Sets custom properties to the Marker + * @param array $custom_properties + */ + public function setCustomProperties($custom_properties) + { + if (!is_array($custom_properties)) + throw new CException(Yii::t('EGMap', 'EGMapMarker custom properties must of type array to be set')); + $this->custom_properties = $custom_properties; + } + + /** + * + * @return array custom properties + */ + public function getCustomProperties() + { + + return $this->custom_properties; + } + + /** + * Sets a custom property to the generated javascript object + * + * @param string $name + * @param string $value + */ + public function setCustomProperty($name, $value) + { + $this->custom_properties[$name] = $value; + } + + /** + * + * @param EGMapMarker[] $markers array of Markers + * @return EGMapCoord + * @author fabriceb + * @since 2009-05-02 + * @since 2011-01-25 modified by Antonio Ramirez + * */ + public static function getMassCenterCoord($markers) + { + $coords = array(); + foreach ($markers as $marker) + { + array_push($coords, $marker->position); + } + + return EGMapCoord::getMassCenterCoord($coords); + } + + /** + * + * @param EGMapMarker[] $markers array of MArkers + * @return EGMapCoord + * @author fabriceb + * @since 2009-05-02 + * @since 2011-01-25 modified by Antonio Ramirez + * */ + public static function getCenterCoord($polygons) + { + $bounds = EGMapBounds::getBoundsContainingPolygons($polygons); + + return $bounds->getCenterCoord(); + } + + /** + * + * @param EGMapBounds $gmap_bounds + * @return boolean $is_inside + * @author fabriceb + * @since Jun 2, 2009 fabriceb + */ + public function isInsideBounds(EGMapBounds $gmap_bounds) + { + + return $this->getGMapCoord()->isInsideBounds($gmap_bounds); + } + +} |
