first import
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
name = Geofield Map
|
||||
description = Provides a basic mapping interface for Geofield.
|
||||
core = 7.x
|
||||
dependencies[] = geofield
|
||||
|
||||
files[] = includes/geofield_map.views.inc
|
||||
files[] = includes/geofield_map_plugin_style_map.inc
|
||||
|
||||
; Information added by drupal.org packaging script on 2012-09-03
|
||||
version = "7.x-1.1+6-dev"
|
||||
core = "7.x"
|
||||
project = "geofield"
|
||||
datestamp = "1346631868"
|
||||
|
@@ -0,0 +1,343 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Implements hook_views_api().
|
||||
*/
|
||||
|
||||
function geofield_map_views_api() {
|
||||
return array(
|
||||
'api' => '3.0-alpha1',
|
||||
'path' => drupal_get_path('module', 'geofield_map') . '/includes',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_field_formatter_info().
|
||||
*/
|
||||
|
||||
function geofield_map_field_formatter_info() {
|
||||
return array(
|
||||
'geofield_map_map' => array(
|
||||
'label' => t('Geofield Map'),
|
||||
'field types' => array('geofield'),
|
||||
'settings' => array(
|
||||
'geofield_map_width' => '100%',
|
||||
'geofield_map_height' => '300px',
|
||||
'geofield_map_zoom' => '8',
|
||||
'geofield_map_controltype' => 'default',
|
||||
'geofield_map_mtc' => 'standard',
|
||||
'geofield_map_pancontrol' => 1,
|
||||
'geofield_map_maptype' => 'map',
|
||||
'geofield_map_baselayers_map' => 1,
|
||||
'geofield_map_baselayers_satellite' => 1,
|
||||
'geofield_map_baselayers_hybrid' => 1,
|
||||
'geofield_map_baselayers_physical' => 0,
|
||||
'geofield_map_scale' => 0,
|
||||
'geofield_map_overview' => 0,
|
||||
'geofield_map_overview_opened' => 0,
|
||||
'geofield_map_scrollwheel' => 0,
|
||||
'geofield_map_draggable' => 0,
|
||||
'geofield_map_streetview_show' => 0,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_field_formatter_view().
|
||||
*/
|
||||
|
||||
function geofield_map_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
|
||||
$element = array();
|
||||
|
||||
list($entity_id) = entity_extract_ids($entity_type, $entity);
|
||||
|
||||
$settings = $display['settings'];
|
||||
|
||||
$map_settings = geofield_map_settings_do($settings);
|
||||
geophp_load();
|
||||
$data = array();
|
||||
|
||||
foreach ($items as $item) {
|
||||
$geometry = geoPHP::load($item['wkt'], 'wkt');
|
||||
if (!empty($geometry)) {
|
||||
$datum = json_decode($geometry->out('json'));
|
||||
$datum->properties = array(
|
||||
'description' => entity_label($entity_type, $entity),
|
||||
);
|
||||
$data[] = $datum;
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($data)) {
|
||||
$map_id = drupal_html_id("geofield_map_entity_{$entity_type}_{$entity_id}_{$field['field_name']}");
|
||||
|
||||
$js_settings = array(
|
||||
$map_id => array(
|
||||
'map_settings' => $map_settings,
|
||||
'data' => count($data) == 1 ?
|
||||
$data[0] :
|
||||
array( 'type' => 'GeometryCollection', 'geometries' => $data),
|
||||
|
||||
),
|
||||
);
|
||||
|
||||
$container_attributes = array(
|
||||
//No need for defaults here - these are populated from the field defaults.
|
||||
'style' => "height:{$settings['geofield_map_height']}; width:{$settings['geofield_map_width']}",
|
||||
'id' => $map_id,
|
||||
'class' => 'geofieldMap',
|
||||
);
|
||||
|
||||
$element[0] = array(
|
||||
'#attached' => array(
|
||||
'js' => array(
|
||||
'//maps.googleapis.com/maps/api/js?sensor=false' => array('type' => 'external'),
|
||||
drupal_get_path('module', 'geofield_map') . '/js/GeoJSON.js',
|
||||
drupal_get_path('module', 'geofield_map') . '/js/geofield_map.js',
|
||||
array('data' => array('geofieldMap' => $js_settings), 'type' => 'setting'),
|
||||
)
|
||||
),
|
||||
'#markup' => '<div' . drupal_attributes($container_attributes) . '></div>',
|
||||
);
|
||||
}
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_field_formatter_settings_form().
|
||||
*/
|
||||
function geofield_map_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
|
||||
$display = $instance['display'][$view_mode];
|
||||
$settings = $display['settings'];
|
||||
|
||||
$element = geofield_map_settings_form($settings);
|
||||
return $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_field_formatter_settings_summary().
|
||||
*/
|
||||
function geofield_map_field_formatter_settings_summary($field, $instance, $view_mode) {
|
||||
$display = $instance['display'][$view_mode];
|
||||
$settings = $display['settings'];
|
||||
$summary = array();
|
||||
|
||||
if ($settings['geofield_map_width']) {
|
||||
$summary[] = t('Width: @w', array('@w' => $settings['geofield_map_width']));
|
||||
}
|
||||
if ($settings['geofield_map_height']) {
|
||||
$summary[] = t('Height: @h', array('@h' => $settings['geofield_map_height']));
|
||||
}
|
||||
if ($settings['geofield_map_zoom']) {
|
||||
$summary[] = t('Zoom: @z', array('@z' => $settings['geofield_map_zoom']));
|
||||
}
|
||||
if ($settings['geofield_map_controltype']) {
|
||||
$summary[] = t('Zoom Control Type: @z', array('@z' => $settings['geofield_map_controltype']));
|
||||
}
|
||||
if ($settings['geofield_map_mtc']) {
|
||||
$summary[] = t('Map Control Type: @m', array('@m' => $settings['geofield_map_mtc']));
|
||||
}
|
||||
if ($settings['geofield_map_pancontrol']) {
|
||||
$summary[] = t('Show Pan Control: @yn', array('@yn' => ($settings['geofield_map_pancontrol'] ? 'Yes' : 'No')));
|
||||
}
|
||||
if ($settings['geofield_map_maptype']) {
|
||||
$summary[] = t('Default Map Type: @m', array('@m' => $settings['geofield_map_maptype']));
|
||||
}
|
||||
if ($settings['geofield_map_scale']) {
|
||||
$summary[] = t('Show Scale: @yn', array('@yn' => ($settings['geofield_map_scale'] ? 'Yes' : 'No')));
|
||||
}
|
||||
if ($settings['geofield_map_overview']) {
|
||||
$summary[] = t('Overview Map: @yn', array('@yn' => ($settings['geofield_map_overview'] ? 'Yes' : 'No')));
|
||||
}
|
||||
if ($settings['geofield_map_scrollwheel']) {
|
||||
$summary[] = t('Scrollwheel: @yn', array('@yn' => ($settings['geofield_map_scrollwheel'] ? 'Yes' : 'No')));
|
||||
}
|
||||
if ($settings['geofield_map_draggable']) {
|
||||
$summary[] = t('Draggable: @yn', array('@yn' => ($settings['geofield_map_draggable'] ? 'Yes' : 'No')));
|
||||
}
|
||||
if ($settings['geofield_map_streetview_show']) {
|
||||
$summary[] = t('Show streetview button: @yn', array('@yn' => ($settings['geofield_map_streetview_show'] ? 'Yes' : 'No')));
|
||||
}
|
||||
|
||||
return implode('<br />', $summary);
|
||||
|
||||
}
|
||||
|
||||
function geofield_map_settings_form($settings, $element = array()) {
|
||||
$element['geofield_map_width'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Map width'),
|
||||
'#default_value' => $settings['geofield_map_width'],
|
||||
'#size' => 25,
|
||||
'#maxlength' => 25,
|
||||
'#description' => t('The default width of a Google map, as a CSS length or percentage. Examples: <em>50px</em>, <em>5em</em>, <em>2.5in</em>, <em>95%</em>'),
|
||||
'#required' => TRUE,
|
||||
);
|
||||
$element['geofield_map_height'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Map height'),
|
||||
'#default_value' => $settings['geofield_map_height'],
|
||||
'#size' => 25,
|
||||
'#maxlength' => 25,
|
||||
'#description' => t('The default height of a Google map, as a CSS length or percentage. Examples: <em>50px</em>, <em>5em</em>, <em>2.5in</em>, <em>95%</em>'),
|
||||
'#required' => TRUE,
|
||||
);
|
||||
$element['geofield_map_zoom'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Zoom'),
|
||||
'#default_value' => $settings['geofield_map_zoom'],
|
||||
'#options' => drupal_map_assoc(range(0, 17)),
|
||||
'#description' => t('The default zoom level of a Google map.'),
|
||||
);
|
||||
$element['geofield_map_controltype'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Zoom Control Type'),
|
||||
'#options' => array(
|
||||
'none' => t('None'),
|
||||
'default' => t('Default'),
|
||||
'small' => t('Small'),
|
||||
'large' => t('Large'),
|
||||
),
|
||||
'#default_value' => $settings['geofield_map_controltype'],
|
||||
);
|
||||
$element['geofield_map_mtc'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Map Control Type'),
|
||||
'#options' => array(
|
||||
'none' => t('None'),
|
||||
'standard' => t('Horizontal bar'),
|
||||
'menu' => t('Dropdown'),
|
||||
),
|
||||
'#default_value' => $settings['geofield_map_mtc'],
|
||||
);
|
||||
$element['geofield_map_pancontrol'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Show Pan control'),
|
||||
'#default_value' => $settings['geofield_map_pancontrol'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
|
||||
$mapopts = array('map' => t('Standard street map'));
|
||||
if ($settings['geofield_map_baselayers_satellite']) {
|
||||
$mapopts['satellite'] = t('Standard satellite map');
|
||||
}
|
||||
if ($settings['geofield_map_baselayers_hybrid']) {
|
||||
$mapopts['hybrid'] = t('Hybrid satellite map');
|
||||
}
|
||||
if ($settings['geofield_map_baselayers_physical']) {
|
||||
$mapopts['physical'] = t('Terrain map');
|
||||
}
|
||||
|
||||
|
||||
$element['geofield_map_maptype'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Default Map Type'),
|
||||
'#default_value' => $settings['geofield_map_maptype'],
|
||||
'#options' => array(
|
||||
'map' => t('Standard street map'),
|
||||
'satellite' => t('Standard satellite map'),
|
||||
'hybrid' => t('Hybrid satellite map'),
|
||||
'physical' => t('Terrain map'),
|
||||
),
|
||||
);
|
||||
$element['geofield_map_baselayers_map'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Standard street map'),
|
||||
'#description' => t('The standard default street map.'),
|
||||
'#default_value' => $settings['geofield_map_baselayers_map'],
|
||||
'#return_value' => 1,
|
||||
'#prefix' => '<fieldset><legend>' . t('Enable map types') . '</legend>',
|
||||
);
|
||||
$element['geofield_map_baselayers_satellite'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Standard satellite map'),
|
||||
'#description' => t('Satellite view without street overlay.'),
|
||||
'#default_value' => $settings['geofield_map_baselayers_satellite'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
$element['geofield_map_baselayers_hybrid'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Hybrid satellite map'),
|
||||
'#description' => t('Satellite view with street overlay.'),
|
||||
'#default_value' => $settings['geofield_map_baselayers_hybrid'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
$element['geofield_map_baselayers_physical'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Terrain map'),
|
||||
'#description' => t('Map with physical data (terrain, vegetation.)'),
|
||||
'#default_value' => $settings['geofield_map_baselayers_physical'],
|
||||
'#return_value' => 1,
|
||||
'#suffix' => '</fieldset>',
|
||||
);
|
||||
$element['geofield_map_scale'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Scale'),
|
||||
'#description' => t('Show scale'),
|
||||
'#default_value' => $settings['geofield_map_scale'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
$element['geofield_map_overview'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Overview map'),
|
||||
'#description' => t('Show overview map'),
|
||||
'#default_value' => $settings['geofield_map_overview'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
|
||||
$element['geofield_map_overview_opened'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Overview map state'),
|
||||
'#description' => t('Show overview map as open by default'),
|
||||
'#default_value' => $settings['geofield_map_overview_opened'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
$element['geofield_map_scrollwheel'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Scrollwheel'),
|
||||
'#description' => t('Enable scrollwheel zooming'),
|
||||
'#default_value' => $settings['geofield_map_scrollwheel'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
$element['geofield_map_draggable'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Draggable'),
|
||||
'#description' => t('Enable dragging on the map'),
|
||||
'#default_value' => $settings['geofield_map_draggable'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
$element['geofield_map_streetview_show'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Show streetview button'),
|
||||
'#default_value' => $settings['geofield_map_streetview_show'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
|
||||
return $element;
|
||||
|
||||
}
|
||||
|
||||
function geofield_map_settings_do($settings) {
|
||||
|
||||
$map_settings = array(
|
||||
'zoom' => $settings['geofield_map_zoom'],
|
||||
'controltype' => $settings['geofield_map_controltype'],
|
||||
'mtc' => $settings['geofield_map_mtc'],
|
||||
'pancontrol' => $settings['geofield_map_pancontrol'],
|
||||
'maptype' => $settings['geofield_map_maptype'],
|
||||
'baselayers_map' => $settings['geofield_map_baselayers_map'],
|
||||
'baselayers_satellite' => $settings['geofield_map_baselayers_satellite'],
|
||||
'baselayers_hybrid' => $settings['geofield_map_baselayers_hybrid'],
|
||||
'baselayers_physical' => $settings['geofield_map_baselayers_physical'],
|
||||
'scale' => $settings['geofield_map_scale'],
|
||||
'overview' => $settings['geofield_map_overview'],
|
||||
'overview_opened' => $settings['geofield_map_overview_opened'],
|
||||
'scrollwheel' => $settings['geofield_map_scrollwheel'],
|
||||
'draggable' => $settings['geofield_map_draggable'],
|
||||
'streetview_show' => $settings['geofield_map_streetview_show'],
|
||||
);
|
||||
return $map_settings;
|
||||
|
||||
}
|
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Default views hooks.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_views_plugins().
|
||||
*/
|
||||
|
||||
function geofield_map_views_plugins() {
|
||||
$plugins = array(
|
||||
'module' => 'geofield_map',
|
||||
'style' => array(
|
||||
'geofield_map_map' => array(
|
||||
'title' => t('Geofield Map'),
|
||||
'help' => t('Displays a View as an Geofield map.'),
|
||||
'handler' => 'geofield_map_plugin_style_map',
|
||||
'theme' => 'geofield_map_map',
|
||||
'theme path' => drupal_get_path('module', 'geofield_map') . '/includes',
|
||||
'path' => drupal_get_path('module', 'geofield_map') . '/includes',
|
||||
'uses fields' => TRUE,
|
||||
'uses row plugin' => FALSE,
|
||||
'uses options' => TRUE,
|
||||
'uses grouping' => FALSE,
|
||||
'type' => 'normal',
|
||||
'even empty' => TRUE,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
return $plugins;
|
||||
}
|
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* This file holds style plugin for Geofield Maps
|
||||
*
|
||||
* @ingroup geofield_map
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class
|
||||
* Extension of the Views Plugin Syle for Geofield Map
|
||||
*/
|
||||
class geofield_map_plugin_style_map extends views_plugin_style {
|
||||
/**
|
||||
* Set default options
|
||||
*/
|
||||
function option_definition() {
|
||||
$options = parent::option_definition();
|
||||
$options['data_source'] = array('default' => '');
|
||||
$options['popup_source'] = array('default' => '');
|
||||
$options['alt_text'] = array('default' => '');
|
||||
$options['geofield_map_width'] = array('default' => '100%');
|
||||
$options['geofield_map_height'] = array('default' => '300px');
|
||||
$options['geofield_map_zoom'] = array('default' => '8');
|
||||
$options['geofield_map_controltype'] = array('default' => 'default');
|
||||
$options['geofield_map_mtc'] = array('default' => 'standard');
|
||||
$options['geofield_map_pancontrol'] = array('default' => 1);
|
||||
$options['geofield_map_maptype'] = array('default' => 'map');
|
||||
$options['geofield_map_baselayers_map'] = array('default' => 1);
|
||||
$options['geofield_map_baselayers_satellite'] = array('default' => 1);
|
||||
$options['geofield_map_baselayers_hybrid'] = array('default' => 1);
|
||||
$options['geofield_map_baselayers_physical'] = array('default' => 0);
|
||||
$options['geofield_map_scale'] = array('default' => 0);
|
||||
$options['geofield_map_overview'] = array('default' => 0);
|
||||
$options['geofield_map_overview_opened'] = array('default' => 0);
|
||||
$options['geofield_map_scrollwheel'] = array('default' => 0);
|
||||
$options['geofield_map_draggable'] = array('default' => 0);
|
||||
$options['geofield_map_streetview_show'] = array('default' => 0);
|
||||
$options['icon'] = array('default' => '');
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options form
|
||||
*/
|
||||
function options_form(&$form, &$form_state) {
|
||||
parent::options_form($form, $form_state);
|
||||
|
||||
$handlers = $this->display->handler->get_handlers('field');
|
||||
|
||||
$data_source_options = $popup_source_options = array(
|
||||
'' => '<none>',
|
||||
);
|
||||
|
||||
foreach ($handlers as $handle) {
|
||||
$popup_source_options[$handle->options['id']] = (!empty($handle->options['label'])) ? $handle->options['label'] : $handle->options['id'];
|
||||
|
||||
if (!empty($handle->field_info['type']) && $handle->field_info['type'] == 'geofield') {
|
||||
$data_source_options[$handle->options['id']] = (!empty($handle->options['label'])) ? $handle->options['label'] : $handle->options['id'];
|
||||
}
|
||||
}
|
||||
|
||||
if (count($data_source_options) == 1) {
|
||||
$form['error'] = array(
|
||||
'#markup' => 'Please add at least 1 geofield to the view',
|
||||
);
|
||||
}
|
||||
else {
|
||||
|
||||
// Map Preset
|
||||
$form['data_source'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Data Source'),
|
||||
'#description' => t('Which field contains geodata?'),
|
||||
'#options' => $data_source_options,
|
||||
'#default_value' => $this->options['data_source'] ? $this->options['data_source'] : '',
|
||||
);
|
||||
|
||||
$form['popup_source'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Popup Text'),
|
||||
'#options' => $popup_source_options,
|
||||
'#default_value' => $this->options['popup_source'] ? $this->options['popup_source'] : '',
|
||||
);
|
||||
|
||||
$form['alt_text'] = array(
|
||||
'#type' => 'textarea',
|
||||
'#title' => t('Alternate Text'),
|
||||
'#description' => t('This text shows up when a user does not have javascript enabled'),
|
||||
'#default_value' => $this->options['alt_text'] ? $this->options['alt_text'] : '',
|
||||
);
|
||||
|
||||
$form = geofield_map_settings_form($this->options, $form);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders views (map)
|
||||
*/
|
||||
function render() {
|
||||
geophp_load();
|
||||
$style_options = $this->view->style_plugin->options;
|
||||
|
||||
$geo_data = (!empty($style_options['data_source'])) ? 'field_' . $style_options['data_source']: NULL;
|
||||
$popup_data = (!empty($style_options['popup_source'])) ? $style_options['popup_source'] : NULL;
|
||||
|
||||
if ($geo_data) {
|
||||
$this->render_fields($this->view->result);
|
||||
$data = array();
|
||||
|
||||
foreach ($this->view->result as $id => $result) {
|
||||
$geofield = (!empty($result->$geo_data)) ? $result->$geo_data : NULL;
|
||||
|
||||
if (!empty($geofield)) {
|
||||
$description = ($popup_data ? $this->rendered_fields[$id][$popup_data] : '');
|
||||
$geometry = geoPHP::load($geofield[0]['raw']['wkt'], 'wkt');
|
||||
$datum = json_decode($geometry->out('json'));
|
||||
$datum->properties = array(
|
||||
'description' => $description,
|
||||
);
|
||||
$data[] = $datum;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($data) == 1) {
|
||||
$data = $data[0];
|
||||
}
|
||||
elseif (count($data) > 1) {
|
||||
$tmp = $data;
|
||||
$data = array(
|
||||
'type' => 'GeometryCollection',
|
||||
'geometries' => $tmp,
|
||||
);
|
||||
}
|
||||
|
||||
$map_settings = geofield_map_settings_do($style_options);
|
||||
$map_id = drupal_html_id('geofield_map_' . $this->view->name . '_' . $this->view->current_display);
|
||||
|
||||
$js_settings = array(
|
||||
$map_id => array(
|
||||
'map_id' => $map_id,
|
||||
'map_settings' => $map_settings,
|
||||
'data' => $data,
|
||||
),
|
||||
);
|
||||
|
||||
drupal_add_js(array('geofieldMap' => $js_settings), 'setting');
|
||||
}
|
||||
|
||||
drupal_add_js('//maps.googleapis.com/maps/api/js?sensor=false', 'external');
|
||||
drupal_add_js(drupal_get_path('module', 'geofield_map') . '/js/GeoJSON.js');
|
||||
drupal_add_js(drupal_get_path('module', 'geofield_map') . '/js/geofield_map.js');
|
||||
|
||||
// defaults
|
||||
$width = '100%';
|
||||
$height = '300px';
|
||||
if ($style_options['geofield_map_width']) {
|
||||
$width = $style_options['geofield_map_width'];
|
||||
}
|
||||
if ($style_options['geofield_map_height']) {
|
||||
$height = $style_options['geofield_map_height'];
|
||||
}
|
||||
|
||||
return '<div style="width: ' . $width . '; height: ' . $height . '" id="' . $map_id . '" class="geofieldMap">' . $style_options['alt_text'] . '</div>';
|
||||
}
|
||||
}
|
201
sites/all/modules/geofield/modules/geofield_map/js/GeoJSON.js
Normal file
201
sites/all/modules/geofield/modules/geofield_map/js/GeoJSON.js
Normal file
@@ -0,0 +1,201 @@
|
||||
// Source: https://github.com/JasonSanford/GeoJSON-to-Google-Maps
|
||||
var GeoJSON = function( geojson, options ){
|
||||
var _geometryToGoogleMaps = function( geojsonGeometry, opts, geojsonProperties ){
|
||||
|
||||
var googleObj;
|
||||
|
||||
switch ( geojsonGeometry.type ){
|
||||
case "Point":
|
||||
opts.position = new google.maps.LatLng(geojsonGeometry.coordinates[1], geojsonGeometry.coordinates[0]);
|
||||
var bounds = new google.maps.LatLngBounds();
|
||||
bounds.extend(opts.position);
|
||||
googleObj = new google.maps.Marker(opts);
|
||||
googleObj.set('bounds', bounds);
|
||||
if (geojsonProperties) {
|
||||
googleObj.set("geojsonProperties", geojsonProperties);
|
||||
}
|
||||
break;
|
||||
|
||||
case "MultiPoint":
|
||||
googleObj = [];
|
||||
var bounds = new google.maps.LatLngBounds();
|
||||
for (var i = 0; i < geojsonGeometry.coordinates.length; i++){
|
||||
opts.position = new google.maps.LatLng(geojsonGeometry.coordinates[i][1], geojsonGeometry.coordinates[i][0]);
|
||||
bounds.extend(opts.position);
|
||||
googleObj.push(new google.maps.Marker(opts));
|
||||
}
|
||||
if (geojsonProperties) {
|
||||
for (var k = 0; k < googleObj.length; k++){
|
||||
googleObj[k].set("geojsonProperties", geojsonProperties);
|
||||
}
|
||||
}
|
||||
for (var k = 0; k < googleObj.length; k++) {
|
||||
googleObj[k].set('bounds', bounds);
|
||||
}
|
||||
break;
|
||||
|
||||
case "LineString":
|
||||
var path = [];
|
||||
var bounds = new google.maps.LatLngBounds();
|
||||
for (var i = 0; i < geojsonGeometry.coordinates.length; i++){
|
||||
var coord = geojsonGeometry.coordinates[i];
|
||||
var ll = new google.maps.LatLng(coord[1], coord[0]);
|
||||
bounds.extend(ll);
|
||||
path.push(ll);
|
||||
}
|
||||
opts.path = path;
|
||||
googleObj = new google.maps.Polyline(opts);
|
||||
googleObj.set('bounds', bounds);
|
||||
if (geojsonProperties) {
|
||||
googleObj.set("geojsonProperties", geojsonProperties);
|
||||
}
|
||||
break;
|
||||
|
||||
case "MultiLineString":
|
||||
googleObj = [];
|
||||
var bounds = new google.maps.LatLngBounds();
|
||||
for (var i = 0; i < geojsonGeometry.coordinates.length; i++){
|
||||
var path = [];
|
||||
for (var j = 0; j < geojsonGeometry.coordinates[i].length; j++){
|
||||
var coord = geojsonGeometry.coordinates[i][j];
|
||||
var ll = new google.maps.LatLng(coord[1], coord[0]);
|
||||
bounds.extend(ll);
|
||||
path.push(ll);
|
||||
}
|
||||
opts.path = path;
|
||||
googleObj.push(new google.maps.Polyline(opts));
|
||||
}
|
||||
if (geojsonProperties) {
|
||||
for (var k = 0; k < googleObj.length; k++){
|
||||
googleObj[k].set("geojsonProperties", geojsonProperties);
|
||||
}
|
||||
}
|
||||
for (var k = 0; k < googleObj.length; k++) {
|
||||
googleObj[k].set('bounds', bounds);
|
||||
}
|
||||
break;
|
||||
|
||||
case "Polygon":
|
||||
var paths = [];
|
||||
var bounds = new google.maps.LatLngBounds();
|
||||
for (var i = 0; i < geojsonGeometry.coordinates.length; i++){
|
||||
var path = [];
|
||||
for (var j = 0; j < geojsonGeometry.coordinates[i].length; j++){
|
||||
var ll = new google.maps.LatLng(geojsonGeometry.coordinates[i][j][1], geojsonGeometry.coordinates[i][j][0]);
|
||||
bounds.extend(ll);
|
||||
path.push(ll)
|
||||
}
|
||||
paths.push(path);
|
||||
}
|
||||
opts.paths = paths;
|
||||
googleObj = new google.maps.Polygon(opts);
|
||||
googleObj.set('bounds', bounds);
|
||||
if (geojsonProperties) {
|
||||
googleObj.set("geojsonProperties", geojsonProperties);
|
||||
}
|
||||
break;
|
||||
|
||||
case "MultiPolygon":
|
||||
googleObj = [];
|
||||
var bounds = new google.maps.LatLngBounds();
|
||||
for (var i = 0; i < geojsonGeometry.coordinates.length; i++){
|
||||
var paths = [];
|
||||
for (var j = 0; j < geojsonGeometry.coordinates[i].length; j++){
|
||||
var path = [];
|
||||
for (var k = 0; k < geojsonGeometry.coordinates[i][j].length; k++){
|
||||
var ll = new google.maps.LatLng(geojsonGeometry.coordinates[i][j][k][1], geojsonGeometry.coordinates[i][j][k][0]);
|
||||
bounds.extend(ll);
|
||||
path.push(ll);
|
||||
}
|
||||
paths.push(path);
|
||||
}
|
||||
opts.paths = paths;
|
||||
googleObj.push(new google.maps.Polygon(opts));
|
||||
}
|
||||
if (geojsonProperties) {
|
||||
for (var k = 0; k < googleObj.length; k++){
|
||||
googleObj[k].set("geojsonProperties", geojsonProperties);
|
||||
}
|
||||
}
|
||||
for (var k = 0; k < googleObj.length; k++) {
|
||||
googleObj[k].set('bounds', bounds);
|
||||
}
|
||||
break;
|
||||
|
||||
case "GeometryCollection":
|
||||
googleObj = [];
|
||||
if (!geojsonGeometry.geometries){
|
||||
googleObj = _error("Invalid GeoJSON object: GeometryCollection object missing \"geometries\" member.");
|
||||
}else{
|
||||
for (var i = 0; i < geojsonGeometry.geometries.length; i++){
|
||||
googleObj.push(_geometryToGoogleMaps(geojsonGeometry.geometries[i], opts, geojsonProperties || null));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
googleObj = _error("Invalid GeoJSON object: Geometry object must be one of \"Point\", \"LineString\", \"Polygon\" or \"MultiPolygon\".");
|
||||
}
|
||||
|
||||
return googleObj;
|
||||
|
||||
};
|
||||
|
||||
var _error = function( message ){
|
||||
|
||||
return {
|
||||
type: "Error",
|
||||
message: message
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
var obj;
|
||||
|
||||
var opts = options || {};
|
||||
|
||||
switch ( geojson.type ){
|
||||
|
||||
case "FeatureCollection":
|
||||
if (!geojson.features){
|
||||
obj = _error("Invalid GeoJSON object: FeatureCollection object missing \"features\" member.");
|
||||
}else{
|
||||
obj = [];
|
||||
for (var i = 0; i < geojson.features.length; i++){
|
||||
obj.push(_geometryToGoogleMaps(geojson.features[i].geometry, opts, geojson.features[i].properties));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "GeometryCollection":
|
||||
if (!geojson.geometries){
|
||||
obj = _error("Invalid GeoJSON object: GeometryCollection object missing \"geometries\" member.");
|
||||
}else{
|
||||
obj = [];
|
||||
for (var i = 0; i < geojson.geometries.length; i++){
|
||||
obj.push(_geometryToGoogleMaps(geojson.geometries[i], opts, geojson.geometries[i].properties));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "Feature":
|
||||
if (!( geojson.properties && geojson.geometry )){
|
||||
obj = _error("Invalid GeoJSON object: Feature object missing \"properties\" or \"geometry\" member.");
|
||||
}else{
|
||||
obj = _geometryToGoogleMaps(geojson.geometry, opts, geojson.properties);
|
||||
}
|
||||
break;
|
||||
|
||||
case "Point": case "MultiPoint": case "LineString": case "MultiLineString": case "Polygon": case "MultiPolygon":
|
||||
obj = geojson.coordinates
|
||||
? obj = _geometryToGoogleMaps(geojson, opts, geojson.properties)
|
||||
: _error("Invalid GeoJSON object: Geometry object missing \"coordinates\" member.");
|
||||
break;
|
||||
|
||||
default:
|
||||
obj = _error("Invalid GeoJSON object: GeoJSON object must be one of \"Point\", \"LineString\", \"Polygon\", \"MultiPolygon\", \"Feature\", \"FeatureCollection\" or \"GeometryCollection\".");
|
||||
|
||||
}
|
||||
|
||||
return obj;
|
||||
};
|
@@ -0,0 +1,122 @@
|
||||
(function ($) {
|
||||
Drupal.behaviors.geofieldMap = {
|
||||
attach: function(context, settings) {
|
||||
|
||||
$('.geofieldMap', context).once('geofield-processed', function(index, element) {
|
||||
var data = undefined;
|
||||
var map_settings = [];
|
||||
var pointCount = 0;
|
||||
var resetZoom = true;
|
||||
var elemID = $(element).attr('id');
|
||||
|
||||
if(settings.geofieldMap[elemID]) {
|
||||
data = settings.geofieldMap[elemID].data;
|
||||
map_settings = settings.geofieldMap[elemID].map_settings;
|
||||
}
|
||||
|
||||
// Checking to see if google variable exists. We need this b/c views breaks this sometimes. Probably
|
||||
// an AJAX/external javascript bug in core or something.
|
||||
if (typeof google != 'undefined' && typeof google.maps.ZoomControlStyle != 'undefined' && data != undefined) {
|
||||
var features = GeoJSON(data);
|
||||
// controltype
|
||||
var controltype = map_settings.controltype;
|
||||
if (controltype == 'default') { controltype = google.maps.ZoomControlStyle.DEFAULT; }
|
||||
else if (controltype == 'small') { controltype = google.maps.ZoomControlStyle.SMALL; }
|
||||
else if (controltype == 'large') { controltype = google.maps.ZoomControlStyle.LARGE; }
|
||||
else { controltype = false }
|
||||
|
||||
// map type
|
||||
var maptype = map_settings.maptype;
|
||||
if (maptype) {
|
||||
if (maptype == 'map' && map_settings.baselayers_map) { maptype = google.maps.MapTypeId.ROADMAP; }
|
||||
if (maptype == 'satellite' && map_settings.baselayers_satellite) { maptype = google.maps.MapTypeId.SATELLITE; }
|
||||
if (maptype == 'hybrid' && map_settings.baselayers_hybrid) { maptype = google.maps.MapTypeId.HYBRID; }
|
||||
if (maptype == 'physical' && map_settings.baselayers_physical) { maptype = google.maps.MapTypeId.TERRAIN; }
|
||||
}
|
||||
else { maptype = google.maps.MapTypeId.ROADMAP; }
|
||||
|
||||
// menu type
|
||||
var mtc = map_settings.mtc;
|
||||
if (mtc == 'standard') { mtc = google.maps.MapTypeControlStyle.HORIZONTAL_BAR; }
|
||||
else if (mtc == 'menu' ) { mtc = google.maps.MapTypeControlStyle.DROPDOWN_MENU; }
|
||||
else { mtc = false; }
|
||||
|
||||
var myOptions = {
|
||||
zoom: parseInt(map_settings.zoom),
|
||||
mapTypeId: maptype,
|
||||
mapTypeControl: (mtc ? true : false),
|
||||
mapTypeControlOptions: {style: mtc},
|
||||
zoomControl: ((controltype !== false) ? true : false),
|
||||
zoomControlOptions: {style: controltype},
|
||||
panControl: (map_settings.pancontrol ? true : false),
|
||||
scrollwheel: (map_settings.scrollwheel ? true : false),
|
||||
draggable: (map_settings.draggable ? true : false),
|
||||
overviewMapControl: (map_settings.overview ? true : false),
|
||||
overviewMapControlOptions: {opened: (map_settings.overview_opened ? true : false)},
|
||||
streetViewControl: (map_settings.streetview_show ? true : false),
|
||||
scaleControl: (map_settings.scale ? true : false),
|
||||
scaleControlOptions: {style: google.maps.ScaleControlStyle.DEFAULT}
|
||||
};
|
||||
|
||||
var map = new google.maps.Map($(element).get(0), myOptions);
|
||||
var range = new google.maps.LatLngBounds();
|
||||
|
||||
var infowindow = new google.maps.InfoWindow({
|
||||
content: ''
|
||||
});
|
||||
|
||||
if (features.setMap) {
|
||||
placeFeature(features, map, range);
|
||||
// Don't move the default zoom if we're only displaying one point.
|
||||
if (features.getPosition) {
|
||||
resetZoom = false;
|
||||
}
|
||||
} else {
|
||||
for (var i in features) {
|
||||
if (features[i].setMap) {
|
||||
placeFeature(features[i], map, range);
|
||||
} else {
|
||||
for (var j in features[i]) {
|
||||
if (features[i][j].setMap) {
|
||||
placeFeature(features[i][j], map, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (resetZoom) {
|
||||
map.fitBounds(range);
|
||||
} else {
|
||||
map.setCenter(range.getCenter());
|
||||
}
|
||||
}
|
||||
|
||||
function placeFeature(feature, map, range) {
|
||||
var properties = feature.get('geojsonProperties');
|
||||
if (feature.setTitle && properties && properties.title) {
|
||||
feature.setTitle(properties.title);
|
||||
}
|
||||
feature.setMap(map);
|
||||
if (feature.getPosition) {
|
||||
range.extend(feature.getPosition());
|
||||
} else {
|
||||
var path = feature.getPath();
|
||||
path.forEach(function(element) {
|
||||
range.extend(element);
|
||||
});
|
||||
}
|
||||
|
||||
if (properties && properties.description) {
|
||||
var bounds = feature.get('bounds');
|
||||
google.maps.event.addListener(feature, 'click', function() {
|
||||
infowindow.setPosition(bounds.getCenter());
|
||||
infowindow.setContent(properties.description);
|
||||
infowindow.open(map);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
})(jQuery);
|
Reference in New Issue
Block a user