123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179 |
- <?php
- /**
- * @defgroup openlayers OpenLayers provides an API and
- * Modules to interface with OpenLayers
- */
- /**
- * @file
- * Main OpenLayers API File
- *
- * This file holds the main Drupal hook functions,
- * and the openlayers API functions for the openlayers module.
- *
- * @ingroup openlayers
- */
- /**
- * OpenLayers hosted default library.
- */
- define('OPENLAYERS_DEFAULT_LIBRARY', 'http://openlayers.org/api/2.12/OpenLayers.js');
- /**
- * OpenLayers library compatible suggestion.
- */
- define('OPENLAYERS_SUGGESTED_LIBRARY', 2.12);
- /**
- * OpenLayers hosted API version. What version is used when going to
- * http://openlayers.org/api/OpenLayers.js
- */
- define('OPENLAYERS_HOSTED_API_LIBRARY', 2.12);
- /**
- * Implements hook_help().
- */
- function openlayers_help($path, $arg) {
- switch ($path) {
- case 'admin/help#openlayers':
- return '<p>' . t('The OpenLayers module is the base module for the
- OpenLayers suite of modules, and provides the main API.') . '</p>';
- }
- return '';
- }
- /**
- * Implements hook_theme().
- */
- function openlayers_theme($existing, $type, $theme, $path) {
- return array(
- 'openlayers_map' => array(
- 'arguments' => array(
- 'map' => array(),
- ),
- 'file' => 'includes/openlayers.theme.inc',
- 'template' => '/templates/openlayers-map'
- ),
- 'openlayers_styles' => array(
- 'arguments' => array(
- 'styles' => array(),
- 'map' => array(),
- ),
- 'file' => 'includes/openlayers.theme.inc',
- ),
- );
- }
- /**
- * Implements hook_ctools_plugin_directory().
- */
- function openlayers_ctools_plugin_directory($module, $plugin) {
- if ($plugin == 'content_types' && !empty($plugin)) {
- return 'includes/' . $plugin;
- }
- if ($module == 'openlayers' && !empty($plugin)) {
- return 'plugins/' . $plugin;
- }
- }
- /**
- * Implements hook_ctools_plugin_type().
- */
- function openlayers_ctools_plugin_type() {
- // For backwards compatability, we allow for the use
- // of hooks to define these plugins.
- //
- // This should be removed in 7.x-3.x
- return array(
- 'behaviors' => array(
- 'use hooks' => TRUE,
- 'classes' => array('behavior'),
- ),
- 'layer_types' => array(
- 'use hooks' => TRUE,
- 'classes' => array('layer_types'),
- )
- );
- }
- /**
- * Include necessary CSS and JS for rendering maps
- *
- * @ingroup openlayers_api
- */
- function openlayers_include() {
- // Use a static variable to prevent running URL check code repeatedly.
- static $once;
- if (!isset($once)) {
- $once = TRUE;
- $path = check_plain(variable_get('openlayers_source', OPENLAYERS_DEFAULT_LIBRARY));
- // Correctly handle URLs beginning with a double backslash, see RFC 1808 Section 4
- if (substr($path, 0, 2) == '//') {
- $http_protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
- $path = $http_protocol .':'. $path;
- }
- // Check for full URL and include it manually if external.
- if (valid_url($path, TRUE)) {
- drupal_add_js($path, 'external');
- }
- else {
- drupal_add_js($path);
- }
- drupal_add_css(drupal_get_path('module', 'openlayers') .
- '/css/openlayers.css', 'file');
- drupal_add_js(drupal_get_path('module', 'openlayers') .
- '/js/openlayers.js', 'file');
- }
- }
- /**
- * Prepare a map for rendering.
- *
- * Takes a map array and builds up the data given the
- * reference to objects like styles, layers, and behaviors.
- *
- * @ingroup openlayers_api
- *
- * @param $map
- * Array of map settings
- * @return
- * Filled in map array.
- */
- function openlayers_build_map($map = array()) {
- // Get the necessary parts
- openlayers_include();
- module_load_include('inc', 'openlayers', 'includes/openlayers.render');
- // If no map is specified, use the default map.
- if (empty($map)) {
- if ($loaded_map = openlayers_map_load(
- variable_get('openlayers_default_map', 'default'))) {
- $map = $loaded_map->data;
- }
- }
- // Create ID for map as this will help with alters.
- $map['id'] = !isset($map['id']) ?
- _openlayers_create_map_id() : $map['id'];
- // Hook to alter map before main processing. Styles, behaviors,
- // layers may all be added here.
- // hook_openlayers_map_preprocess_alter($map)
- drupal_alter('openlayers_map_preprocess', $map);
- // Styles and layer styles are not required parameters
- $map['styles'] = isset($map['styles']) ? $map['styles'] : array();
- $map['layer_styles'] = isset($map['layer_styles']) ? $map['layer_styles'] : array();
- $map['layer_styles_select'] = isset($map['layer_styles_select']) ? $map['layer_styles_select'] : array();
- // Process map parts.
- $map['layers'] = _openlayers_layers_process($map['layers'], $map);
- $map['behaviors'] = _openlayers_behaviors_render($map['behaviors'], $map);
- $map['styles'] = _openlayers_styles_process($map['styles'], $map['layer_styles'], $map['layer_styles_select'], $map);
- // Hook to alter map one last time. Final modification to existing
- // styles, behaviors, layers can happen here, but adding new styles,
- // behaviors will not get rendered.
- // hook_openlayers_map_alter($map)
- drupal_alter('openlayers_map', $map);
- // Check map for errors
- $map['errors'] = openlayers_error_check_map($map);
- return $map;
- }
- /**
- * Render map array
- *
- * Given a map array, render into HTML to display
- * a map.
- *
- * @ingroup openlayers_api
- *
- * @param $map
- * Associative array of map paramters.
- * @return
- * Map HTML.
- */
- function openlayers_render_map_data($map = array()) {
- // Run map through build process
- $map = openlayers_build_map($map);
- $output = '';
- // Given hide_empty_map flag, check if the map has any features
- // defined. If not, assume it is an empty map and shouldn't be displayed.
- if (isset($map['hide_empty_map']) && $map['hide_empty_map'] == TRUE) {
- $empty = TRUE;
- foreach ($map['layers'] as $layer) {
- if (isset($layer['features']) && count($layer['features'])) {
- $empty = FALSE;
- }
- }
- if ($empty) {
- return '';
- }
- }
- // Return themed map if no errors found
- if (empty($map['errors'])) {
- $js = array('openlayers' => array('maps' => array($map['id'] => $map)));
- drupal_add_js($js, 'setting');
- // Push map through theme function and return
- $output = theme('openlayers_map', array(
- 'map' => $map,
- ));
- }
- return $output;
- }
- /**
- * Render a map by name
- *
- * Given a map name render it into a full map object.
- *
- * @ingroup openlayers_api
- *
- * @param $map
- * Name of the map
- * @return
- * Map HTML.
- */
- function openlayers_render_map($map = '') {
- // If it's an array, then we have been passed the map data array
- if (is_array($map)) {
- return openlayers_render_map_data($map);
- }
- // If it's a string, then we are passing a map name instead of the whole map object
- // so we need to load the object
- if (!$map || is_string($map)) {
- $map_name = $map;
- if (!$map_name) {
- $map_name = variable_get('openlayers_default_map', 'default');
- }
- $map = openlayers_map_load($map_name);
- }
- return openlayers_render_map_data($map->data);
- }
- /**
- * Get layer object
- *
- * @ingroup openlayers_api
- * @param $reset
- * Boolean whether to reset cache or not
- * @return array
- * array of layer info
- */
- function openlayers_get_layer_object($layer, $map = array()) {
- // Static cache because this function will possibly be called in big loops
- static $layer_types;
- if (!isset($layer_types)) {
- $layer_types = openlayers_layer_types();
- }
- $layer->title = t($layer->title);
- $layer->description = t($layer->description);
- // Attempt to get ctool class
- if (isset($layer_types[$layer->data['layer_type']]) &&
- $class = ctools_plugin_get_class(
- $layer_types[$layer->data['layer_type']],
- 'layer_type')
- ) {
- $layer_object = new $class($layer, $map);
- return $layer_object;
- }
- else {
- watchdog('openlayers', 'Layer !layer_name is unavailable because its
- layer type or the module that provides its layer type is missing',
- array('!layer_name' => $layer->title),
- WATCHDOG_ERROR);
- return FALSE;
- }
- }
- /**
- * Menu loader for layers. (%openlayers_layer)
- * @ingroup openlayers_api
- *
- * @param $name
- * Layer name
- * @return array
- * Layer export
- */
- function openlayers_layer_load($name, $reset = FALSE) {
- ctools_include('export');
- if ($reset) ctools_export_load_object_reset('openlayers_layers');
- $layer = ctools_export_load_object('openlayers_layers', 'names', array($name));
- if (is_array($layer) && isset($layer[$name])) {
- $layer_object = openlayers_get_layer_object($layer[$name]);
- if (openlayers_layer_sanity_check($layer_object)) {
- // Automatic layer load for layers.
- /*
- $definitions = ctools_get_plugins('openlayers', 'layer_types');
- $type = get_class($layer_object);
- $base = basename($definitions[$type]['file'], '.inc');
- $js = $definitions[$type]['path'] . '/' . $base .'.js';
- $css = $definitions[$type]['path'] . '/' . $base .'.css';
- drupal_add_js($js);
- drupal_add_css($css);
- */
- return $layer_object;
- }
- }
- else {
- return FALSE;
- }
- }
- /**
- * Get all openlayers layers as objects.
- * @ingroup openlayers_api
- *
- * @param $reset
- * Boolean whether to reset cache or not
- * @return array
- * array of layer info
- */
- function openlayers_layers_load($reset = FALSE) {
- ctools_include('export');
- $layer_objects = array();
- if ($reset) ctools_export_load_object_reset('openlayers_layers');
- $layers = ctools_export_load_object('openlayers_layers', 'all', array());
- foreach ($layers as $layer) {
- $layer_objects[$layer->name] = openlayers_get_layer_object($layer);
- }
- return array_filter($layer_objects, 'openlayers_layer_sanity_check');
- }
- /**
- * Check the plugin definition of a layer.
- * Some field *MUST* be there to work correctly with OL.
- *
- * @ingroup openlayers_api
- * @param $definition
- * @return bool
- */
- function openlayers_layer_definition_check($definition) {
- $mandatory_fields = array(
- array('title'),
- array('description'),
- array('name'),
- array('path'),
- array('layer_type', 'file'),
- array('layer_type', 'class'),
- array('layer_type', 'parent'),
- );
- foreach ($mandatory_fields as $field) {
- $missing = drupal_array_nested_key_exists($definition, $field);
- if (!$missing) {
- drupal_set_message(t("There's a problem in the plugin definition of the layer type <em>!type</em>. The layer will be disabled.", array('!type' => $definition['name'])), 'warning');
- watchdog('openlayers', 'Layer !layer is unavailable because its
- plugin definition is incomplete.',
- array('!layer' => $definition['name']),
- WATCHDOG_ERROR);
- return FALSE;
- }
- }
- return TRUE;
- }
- /**
- * Check the plugin definition of a behavior.
- * Some field *MUST* be there to work correctly with OL.
- *
- * @ingroup openlayers_api
- * @param $definition
- * @return bool
- */
- function openlayers_behavior_definition_check($definition) {
- $mandatory_fields = array(
- array('title'),
- array('description'),
- array('name'),
- array('path'),
- array('type'),
- array('behavior', 'file'),
- array('behavior', 'class'),
- array('behavior', 'parent'),
- );
- foreach ($mandatory_fields as $field) {
- $missing = drupal_array_nested_key_exists($definition, $field);
- if (!$missing) {
- drupal_set_message(t("There's a problem in the definition of the behavior <em>!behavior</em>. The behavior will be disabled.", array('!behavior' => $definition['name'])), 'warning');
- watchdog('openlayers', 'Behavior !behavior is unavailable because its
- plugin definition is incomplete.',
- array('!behavior' => $definition['name']),
- WATCHDOG_ERROR);
- return FALSE;
- }
- }
- return TRUE;
- }
- /**
- * Check layer to determine whether it has all the
- * necessary attributes to be rendered. This is necessary
- * because of API changes, and is a consolidation from other
- * layer-error-checking in this module
- *
- * @param $layer
- * Layer object
- * @param $projection
- * Projection number (EPSG) to check compatibility with
- * @param $strict
- * reject invalid layers
- * @return boolean
- * layer validity if strict is set, otherwise always true
- */
- function openlayers_layer_sanity_check($layer, $projection = FALSE, $strict = FALSE) {
- // Handle layers after they've been rendered for a map
- $layer = (is_array($layer)) ? (object) $layer : $layer;
- if (!isset($layer->name)) {
- return !$strict;
- }
- if (!isset($layer->data['projection']) || !is_array($layer->data['projection'])) {
- watchdog('openlayers', 'Layer %name does not have a projection set.',
- array('%name' => $layer->name));
- drupal_set_message(
- t('OpenLayers layers failed the sanity check. See the
- <a href="@drupallog">Drupal log</a> for details',
- array('@drupallog' => url('admin/reports/dblog')))
- );
- return !$strict;
- }
- if (!isset($layer->data['layer_type'])) {
- watchdog('openlayers', 'Layer %name does not have its layer_type set.',
- array('%name' => $layer->name));
- drupal_set_message(
- t('OpenLayers layers failed the sanity check. See the
- <a href="@drupallog">Drupal log</a> for details',
- array('@drupallog' => url('admin/reports/dblog')))
- );
- return !$strict;
- }
- if ($projection && empty($layer->data['vector']) &&
- (!in_array($projection, $layer->data['projection']))) {
- watchdog('openlayers',
- 'The layer %layer_name cannot be reprojected to the map projection: EPSG: %map_proj',
- array(
- '%layer_name' => $layer->name,
- // TODO: $map is not defined.
- '%map_proj' => $map['projection'],
- )
- );
- return !$strict;
- }
- return TRUE;
- }
- /**
- * Delete a layer object from the database.
- *
- * @ingroup openlayers_api
- *
- * @param $layer
- * String identifier of a layer or layer object with name.
- * @return
- * The results of DB delete.
- */
- function openlayers_layer_delete($layer) {
- return openlayers_object_delete($layer, 'layer');
- }
- /**
- * Get all layer types.
- *
- * @ingroup openlayers_api
- *
- * @param $reset
- * Boolean whether to reset cache or not.
- * @return
- * Array of layer type info.
- */
- function openlayers_layer_types($reset = FALSE) {
- ctools_include('plugins');
- $layers = ctools_get_plugins('openlayers', 'layer_types');
- return array_filter($layers, 'openlayers_layer_definition_check');
- }
- /**
- * Menu loader for layer types.
- *
- * @ingroup openlayers_api
- *
- * @param $name
- * String identifier of layer type.
- * @param $reset
- * Boolean whether to reset cache or not.
- * @return
- * An instantiated layer type object or FALSE if not found.
- */
- function openlayers_layer_type_load($name, $reset = FALSE) {
- ctools_include('plugins');
- if ($layer_type_class = ctools_plugin_load_class(
- 'openlayers',
- 'layer_types',
- $name,
- 'layer_type')) {
- $layer_type = new $layer_type_class();
- return $layer_type;
- }
- return FALSE;
- }
- /**
- * Get all behaviors.
- *
- * @ingroup openlayers_api
- *
- * @param $reset
- * Boolean whether to reset cache or not.
- * @return
- * Array of behavior info.
- */
- function openlayers_behaviors($reset = FALSE) {
- ctools_include('plugins');
- $behaviors = ctools_get_plugins('openlayers', 'behaviors');
- return array_filter($behaviors, 'openlayers_behavior_definition_check');
- }
- /**
- * Get all openlayers styles.
- *
- * @ingroup openlayers_api
- *
- * @param $reset
- * Boolean whether to reset cache or not.
- * @return
- * Array of all available styles.
- */
- function openlayers_styles($reset = FALSE) {
- ctools_include('export');
- if ($reset) {
- ctools_export_load_object_reset('openlayers_styles');
- }
- $styles = ctools_export_load_object('openlayers_styles', 'all', array());
- return $styles;
- }
- /**
- * Load a style object by name.
- *
- * This function can also be used as a
- * menu loader for a style.
- *
- * @ingroup openlayers_api
- *
- * @param $name
- * The string identifier of the style.
- * @param $reset
- * Boolean whether to reset the cache or not.
- * @return
- * A style object or FALSE if not found.
- */
- function openlayers_style_load($name, $reset = FALSE) {
- $styles = openlayers_styles($reset);
- return !empty($styles[$name]) ? $styles[$name] : FALSE;
- }
- /**
- * Save style.
- *
- * @ingroup openlayers_api
- *
- * @param $style
- * The style object to save.
- * @return
- * The results of DB write or FALSE if no name.
- */
- function openlayers_style_save($style) {
- if (!empty($style->name)) {
- return (db_select('openlayers_styles')
- ->fields('openlayers_styles', array('name'))
- ->condition('name', $style->name)
- ->execute()
- ->fetchCol()) ?
- drupal_write_record('openlayers_styles', $style, 'name') :
- drupal_write_record('openlayers_styles', $style);
- }
- return FALSE;
- }
- /**
- * Delete a style object from the database.
- *
- * @ingroup openlayers_api
- *
- * @param $style
- * String identifier of a style or style object with name.
- * @return
- * The results of DB delete.
- */
- function openlayers_style_delete($style) {
- return openlayers_object_delete($style, 'style');
- }
- /**
- * Get maps from DB or code, via cache.
- *
- * @ingroup openlayers_api
- *
- * @param $reset
- * Boolean whether to reset or not.
- * @return
- * Return array of maps.
- */
- function openlayers_maps($reset = FALSE) {
- ctools_include('export');
- if ($reset) {
- ctools_export_load_object_reset('openlayers_maps');
- }
- $maps = ctools_export_load_object(
- 'openlayers_maps', 'all', array());
- return $maps;
- }
- /**
- * Given a map name, get full map object.
- *
- * This function can also be used as a
- * menu loader for a style.
- *
- * @ingroup openlayers_api
- *
- * @param $name
- * String identifier of the map.
- * @param $reset
- * Boolean whether to reset cache.
- * @return
- * map object or FALSE if not found.
- */
- function openlayers_map_load($name = '', $reset = FALSE) {
- ctools_include('export');
- if ($reset) {
- ctools_export_load_object_reset('openlayers_maps');
- }
- $maps = ctools_export_load_object('openlayers_maps', 'names', array($name));
- if (empty($maps[$name])) {
- return FALSE;
- } else {
- $map = $maps[$name];
- $map->data['map_name'] = $name;
- return clone $map;
- }
- }
- /**
- * Save a map object to the database.
- *
- * @ingroup openlayers_api
- *
- * @param $map
- * map object.
- * @return
- * The results of DB write or FALSE if no name.
- */
- function openlayers_map_save($map) {
- if (!empty($map->name)) {
- return (db_select('openlayers_maps')
- ->fields('openlayers_maps', array('name'))
- ->condition('name', $map->name)
- ->execute()
- ->fetchCol()) ?
- drupal_write_record('openlayers_maps', $map, 'name') :
- drupal_write_record('openlayers_maps', $map);
- }
- return FALSE;
- }
- /**
- * Delete a map object from the database.
- *
- * @ingroup openlayers_api
- *
- * @param $map
- * String identifier of a map or map object with name.
- * @return
- * The results of DB delete.
- */
- function openlayers_map_delete($map) {
- return openlayers_object_delete($map, 'map');
- }
- /**
- * Get map options in an array suitable for a FormAPI element.
- *
- * @ingroup openlayers_api
- *
- * @param $reset
- * Boolean whether to reset or not.
- * @return
- * Return array of formatted data.
- */
- function openlayers_map_options($reset = FALSE) {
- $maps = openlayers_maps($reset);
- $options = array();
- foreach ($maps as $map) {
- $options[$map->name] = $map->title;
- }
- return $options;
- }
- /**
- * Delete an object from the database.
- *
- * @ingroup openlayers_api
- *
- * @param $ol_object
- * String identifier of an object or the object with name.
- * @param $type
- * Type of object to delete. The options are the following:
- * - 'layer'
- * - 'style'
- * = 'map'
- * @return
- * The results of the DB delete.
- */
- function openlayers_object_delete($ol_object, $type) {
- // Check for object or name
- $tables = array(
- 'style' => 'openlayers_styles',
- 'layer' => 'openlayers_layers',
- 'map' => 'openlayers_maps');
- if (is_object($ol_object) && isset($ol_object->name) && isset($tables[$type])) {
- $ol_object = $ol_object->name;
- return db_delete($tables[$type])->condition('name', $ol_object)->execute();
- }
- }
- /**
- * Checks map array for incompatibilities or errors.
- *
- * @ingroup openlayers_api
- *
- * @param $map
- * Map array
- * @param $log_errors
- * Boolean whether to log errors.
- * @return
- * FALSE if passed. Array of descriptive errors if fail.
- */
- function openlayers_error_check_map($map, $log_errors = TRUE) {
- $errors = array();
- // Check for layers
- if (!is_array($map['layers'])) {
- $errors[] = t('Map contains no renderable layers.');
- }
- else {
- // Check layer projections
- foreach ($map['layers'] as $layer) {
- openlayers_layer_sanity_check(
- array('data' => $layer),
- $map['projection'],
- TRUE);
- }
- }
- // Check if any errors found to log
- if (count($errors) > 0 && $log_errors) {
- // Log the Error(s)
- watchdog('openlayers', implode(', ', $errors), array(), WATCHDOG_ERROR);
- }
- // Check if errors and return
- return (count($errors) > 0) ? $errors : FALSE;
- }
- /**
- * Get extent given projection
- *
- * Returns standard world-max-extents for common projections.
- * Layers implementing other projections and subsets of the
- * world should define their maxExtent in the layer array.
- *
- * @ingroup openlayers_api
- *
- * @param $projection
- * String of the projection value. Currently
- * supports 900913, 4326.
- * @return
- * Array of maxExtent in OpenLayers toArray() format.
- */
- function openlayers_get_extent($projection) {
- switch ($projection) {
- case '900913':
- return array(-20037508, -20037508, 20037508, 20037508);
- case '4326':
- return array(-180, -90, 180, 90);
- }
- }
- /**
- * Get resolution given projection
- *
- * Returns a default set of resolutions for standard
- * TMS, WMS, etc servers serving up common projections.
- * Layers supporting less common projections and resolutions
- * can easily define custom resolutions arrays.
- *
- * @ingroup openlayers_api
- *
- * @param $projection
- * String specifying which projection this should take, like 900913.
- * @param $zoom_start
- * Integer of first zoom level, default 0.
- * @param $zoom_end
- * Integer of last zoom level, default FALSE.
- * @return
- * Array of resolutions.
- */
- function openlayers_get_resolutions($projection, $zoom_start = 0, $zoom_end = FALSE) {
- switch ($projection) {
- case '900913':
- // 16 zoom levels, taken from
- // openlayers.org TMS map
- $res = array(
- 156543.0339,
- 78271.51695,
- 39135.758475,
- 19567.8792375,
- 9783.93961875,
- 4891.969809375,
- 2445.9849046875,
- 1222.99245234375,
- 611.496226171875,
- 305.7481130859375,
- 152.87405654296876,
- 76.43702827148438,
- 38.21851413574219,
- 19.109257067871095,
- 9.554628533935547,
- 4.777314266967774,
- 2.388657133483887,
- 1.1943285667419434,
- 0.5971642833709717,
- 0.29858214169740677,
- 0.14929107084870338,
- 0.07464553542435169
- );
- break;
- case '4326':
- // 16 zoom levels, taken from
- // openlayers.org default WMS map
- $res = array(
- 0.703125,
- 0.3515625,
- 0.17578125,
- 0.087890625,
- 0.0439453125,
- 0.02197265625,
- 0.010986328125,
- 0.0054931640625,
- 0.00274658203125,
- 0.001373291015625,
- 0.0006866455078125,
- 0.00034332275390625,
- 0.000171661376953125,
- 0.0000858306884765625,
- 0.00004291534423828125,
- 0.000021457672119140625,
- 0.000010728836059570312,
- );
- break;
- default:
- $res = array();
- break;
- }
- $length = ($zoom_end == FALSE) ? NULL : $zoom_end - $zoom_start;
- // By default this will not actually clip the array
- $resolutions = array_slice($res, $zoom_start, $length);
- return $resolutions;
- }
- /**
- * We define base classes in the core module.
- * All other parent classes can be autoloaded through ctools.
- */
- class openlayers_behavior {
- var $options, $map;
- function __construct($options = array(), $map = array()) {
- $this->options = $options + $this->options_init();
- $this->map = $map;
- }
- /*
- * @return array of JavaScript functions required to be defined
- * in order for this function to work
- */
- function js_dependency() {
- return array();
- }
- function options_init() {
- return array();
- }
- /*
- * @param $defaults default values for the form as an array
- * @return a FormAPI form
- */
- function options_form($defaults = array()) {
- return array();
- }
- function render(&$map) {}
- }
- /**
- * We define base classes in the core module.
- * All other parent classes can be autoloaded through ctools.
- */
- class openlayers_layer_type {
- /**
- * Stores the options for this layer.
- * @var array
- */
- public $data = array();
- /**
- * Stores the current map.
- * @var array
- */
- public $map;
- /**
- * Set configuration and store map.
- *
- * @param $layer
- * Configuration object with the options for the layer.
- * @param $map
- * Array with the current map.
- */
- function __construct($layer = array(), $map = array()) {
- foreach (array('name', 'title', 'description', 'data', 'export_type') as $k) {
- if (isset($layer->{$k})) {
- $this->{$k} = $layer->{$k};
- }
- }
- // Extend options with the defaults.
- $this->data += $this->options_init();
- $this->map = $map;
- }
- /**
- * Provides the default options for the layer.
- *
- * @return
- * An associative array with the default options.
- */
- function options_init() {
- return array(
- 'layer_type' => get_class($this),
- 'isBaseLayer' => TRUE,
- 'projection' => array('900913'),
- 'serverResolutions' => openlayers_get_resolutions('900913'),
- 'maxExtent' => openlayers_get_extent('900913'),
- 'resolutions' => openlayers_get_resolutions('900913'),
- 'base_url' => NULL,
- 'transitionEffect' => 'resize',
- 'weight' => 0
- );
- }
- /**
- * Options form to configure layer instance options.
- *
- * @return
- * Array with form elements.
- */
- function options_form($default = array()) {
- return array(
- 'projection' => array(
- '#type' => 'select',
- '#title' => t('Projection'),
- '#multiple' => TRUE,
- '#options' => array(
- '900913' => '900913',
- '4326' => '4326'
- ),
- '#default_value' => isset($default->data['projection']) ?
- $default->data['projection'] :
- '900913'
- ),
- 'isBaseLayer' => array(
- '#type' => 'checkbox',
- '#title' => t('Base Layer'),
- '#description' => t('Uncheck to make this map an overlay'),
- '#default_value' => !empty($default->data['isBaseLayer']) ?
- $default->data['isBaseLayer'] : FALSE
- ),
- );
- }
- /**
- * Validate the options_form().
- *
- * @param array $default
- */
- function options_form_validate($form, &$form_state) {
- }
- /**
- * Submit the options_form().
- *
- * @param array $default
- */
- function options_form_submit($form, &$form_state) {
- }
- /**
- * Options form to configure layer-type-wide options.
- *
- * @return
- * Array with form elements.
- */
- function settings_form() {
- return array();
- }
- /**
- * Render the layer and return the layer options.
- *
- * Has no return value.
- *
- * @param $map
- */
- function render(&$map) {}
- }
- /**
- * Implements hook_ctools_plugin_api().
- */
- function openlayers_ctools_plugin_api($module, $api) {
- if ($module == "openlayers") {
- switch ($api) {
- case 'openlayers_maps':
- return array('version' => 1);
- case 'openlayers_layers':
- return array('version' => 1);
- case 'openlayers_styles':
- return array('version' => 1);
- case 'openlayers_layer_types':
- return array('version' => 1);
- case 'openlayers_behaviors':
- return array('version' => 1);
- }
- }
- elseif ($module == 'boxes' && $api == 'plugins') {
- return array('version' => 1);
- }
- }
- /**
- * Implements hook_openlayers_layers().
- */
- function openlayers_openlayers_layers() {
- module_load_include('inc', 'openlayers', 'includes/openlayers.layers');
- return _openlayers_openlayers_layers();
- }
- /**
- * Implements hook_openlayers_styles().
- */
- function openlayers_openlayers_styles() {
- module_load_include('inc', 'openlayers', 'includes/openlayers.styles');
- return _openlayers_openlayers_styles();
- }
- /**
- * Implements hook_openlayers_maps().
- */
- function openlayers_openlayers_maps() {
- module_load_include('inc', 'openlayers', 'includes/openlayers.maps');
- return _openlayers_openlayers_maps();
- }
- /**
- * Implements hook_boxes_plugins().
- */
- function openlayers_boxes_plugins() {
- return array(
- 'openlayers_simple' => array(
- 'title' => 'OpenLayers',
- 'handler' => array(
- 'parent' => 'boxes_box',
- 'class' => 'openlayers_simple',
- 'file' => 'openlayers_simple.inc',
- 'path' => drupal_get_path('module', 'openlayers') . '/includes/boxes'
- )
- )
- );
- }
- /**
- * Alias Functions
- *
- * These functions temporarily map the alias the renamed 'map' functions to their
- * previous 'preset' functions to allow time for contrib modules to catch up.
- * These will eventually be removed
- *
- * These should be removed in 7.x-3.x
- */
- function openlayers_build_preset($map = array()) { return openlayers_build_map($map); }
- function openlayers_preset_load($name = '', $reset = FALSE) { return openlayers_map_load($name, $reset); }
- function openlayers_render_preset_data($map = array(), $map_name = '') { return openlayers_render_map_data($map, $map_name); }
- function openlayers_presets($reset = FALSE) { return openlayers_maps($reset); }
- function openlayers_preset_save($map) { return openlayers_map_save($map); }
- function openlayers_preset_delete($map) { return openlayers_map_delete($map); }
- function openlayers_preset_options($reset = FALSE) { return openlayers_map_options($reset); }
- function openlayers_error_check_preset($map, $log_errors = TRUE) { return openlayers_error_check_map($map, $log_errors); }
- function openlayers_render_preset($map = '', $map_name = '') {
- if (is_array($map)) {
- return openlayers_render_preset_data($map, $map_name);
- }
- else {
- return openlayers_render_map($map);
- }
- }
|