first import

This commit is contained in:
Bachir Soussi Chiadmi
2015-04-08 11:40:19 +02:00
commit 1bc61b12ad
8435 changed files with 1582817 additions and 0 deletions

View File

@@ -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"

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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>';
}
}

View 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;
};

View File

@@ -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);