123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- <?php
- function geofield_field_formatter_info() {
- $formatters = array(
- 'geofield_wkt' => array(
- 'label' => t('Well Known Text (WKT)'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full'),
- ),
- 'geofield_geojson' => array(
- 'label' => t('GeoJSON'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full'),
- ),
- 'geofield_kml' => array(
- 'label' => t('KML'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full'),
- ),
- 'geofield_gpx' => array(
- 'label' => t('GPX'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full'),
- ),
- 'geofield_latlon' => array(
- 'label' => t('Latitude/Longitude'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full', 'format' => 'decimal_degrees', 'labels' => 1),
- ),
- 'geofield_lat' => array(
- 'label' => t('Latitude Only'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full', 'format' => 'decimal_degrees'),
- ),
- 'geofield_lon' => array(
- 'label' => t('Longitude Only'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full', 'format' => 'decimal_degrees'),
- ),
- 'geofield_geo_type' => array(
- 'label' => t('Geometry Type'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full'),
- ),
- );
- if (module_exists('openlayers')) {
- $formatters['geofield_openlayers'] = array(
- 'label' => t('OpenLayers'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => 'full', 'map_preset' => 'geofield_formatter_map'),
- );
- }
-
-
- $formatters['geofield_def_list'] = array(
- 'label' => t('Definition List (Accessibility)'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => '', 'address' => 0),
- );
- $formatters['geofield_description'] = array(
- 'label' => t('Decriptive Text (Accessibility)'),
- 'field types' => array('geofield'),
- 'settings' => array('data' => '', 'address' => 0),
- );
-
- return $formatters;
- }
- function _geofield_formatter_settings_data_options($formatter) {
- return array(
- 'full' => t('Use full geometry'),
- 'centroid' => t('Use centroid'),
- 'bounding' => t('Use bounding box'),
- );
- }
- function _geofield_formatter_settings_format_options($formatter) {
- return array(
- 'decimal_degrees' => t('Decimal degrees'),
- 'degrees_minutes_seconds' => t('Degrees minutes seconds'),
- 'ccs' => t('Astronomical Celestial Coordinates System (CCS)'),
- );
- }
- function geofield_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
- $display = $instance['display'][$view_mode];
- $settings = $display['settings'];
-
- if ($display['type'] == 'geofield_openlayers' && module_exists('openlayers')) {
-
- $presets = openlayers_presets();
- $preset_options = array();
- foreach ($presets as $preset) {
- if (in_array('geofield_formatter', $preset->data['layers'])) {
- $preset_options[$preset->name] = $preset->title;
- }
- }
-
- $element['map_preset'] = array(
- '#title' => t('OpenLayers Preset'),
- '#type' => 'select',
- '#default_value' => $settings['map_preset'] ? $settings['map_preset'] : 'geofield_formatter_map',
- '#required' => TRUE,
- '#options' => $preset_options,
- '#description' => t('Select which OpenLayers map you would like to use. Only maps which have the geofield placeholder layer may be selected. If your preferred map is not here, add the geofield placeholder layer to it first.'),
- );
- }
-
- $data_options = _geofield_formatter_settings_data_options($display['type']);
- $element['data'] = array(
- '#title' => t('Data options'),
- '#type' => 'select',
- '#default_value' => $settings['data'] ? $settings['data'] : 'full',
- '#required' => TRUE,
- '#options' => $data_options,
- );
- if ($display['type'] == 'geofield_latlon' || $display['type'] == 'geofield_lat' || $display['type'] == 'geofield_lon') {
- $format_options = _geofield_formatter_settings_format_options($display['type']);
- $element['format'] = array(
- '#title' => t('Format'),
- '#type' => 'select',
- '#default_value' => $settings['format'] ? $settings['format'] : 'decimal_degrees',
- '#required' => TRUE,
- '#options' => $format_options,
- );
- }
-
- if ($display['type'] == 'geofield_latlon') {
- $element['labels'] = array(
- '#title' => t('Display Labels'),
- '#type' => 'checkbox',
- '#default_value' => $settings['labels'],
- );
- }
-
- if ($display['type'] == 'geofield_def_list' || $display['type'] == 'geofield_description') {
- $element['address'] = array(
- '#title' => t('Include reverse-geocoded address'),
- '#type' => 'checkbox',
- '#default_value' => $settings['address'],
- );
- }
- return $element;
- }
- function geofield_field_formatter_settings_summary($field, $instance, $view_mode) {
- $display = $instance['display'][$view_mode];
- $settings = $display['settings'];
- $summary = array();
- $data_options = _geofield_formatter_settings_data_options($display['type']);
-
-
- if (!empty($data_options[$settings['data']])) {
- $summary[] = t('Data options: @data', array('@data' => $data_options[$settings['data']]));
- }
- else {
- $summary[] = t('No data options set');
- }
-
- if ($display['type'] == 'geofield_openlayers' && !empty($settings['map_preset'])) {
- $openlayers_presets = openlayers_preset_options();
- $summary[] = t('Openlayers Map: @data', array('@data' => $openlayers_presets[$settings['map_preset']]));
- }
- if ($display['type'] == 'geofield_latlon') {
- $format_options = _geofield_formatter_settings_format_options($display['type']);
-
- if (isset($format_options[$settings['format']])) {
- $summary[] = $format_options[$settings['format']];
- }
- }
- if (!empty($settings['address']) && $settings['address']) {
- $summary[] = t('Including reverse-geocoded address');
- }
- return implode('<br />', $summary);
- }
- function geofield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
- $element = array();
-
-
- if ($display['settings']['data'] != 'full') {
- geofield_load_geophp();
- if ($display['settings']['data'] == 'centroid') {
- foreach ($items as $delta => $item) {
- $centroid_wkt = 'POINT(' . $item['lon'] . ' ' . $item['lat'] . ')';
- $centroid = geoPHP::load($centroid_wkt, 'wkt');
- $items[$delta] = geofield_get_values_from_geometry($centroid);
- }
- }
- if ($display['settings']['data'] == 'bounding') {
- foreach ($items as $delta => $item) {
- $envelope_wkt = 'POLYGON ((' . $item['left'] . ' ' . $item['top'] . ', ' . $item['right'] . ' ' . $item['top'] . ', ' . $item['right'] . ' ' . $item['bottom'] . ', ' . $item['left'] . ' ' . $item['bottom'] . ', ' . $item['left'] . ' ' . $item['top'] . ')))';
- $envelope = geoPHP::load($envelope_wkt, 'wkt');
- $items[$delta] = geofield_get_values_from_geometry($envelope);
- }
- }
- }
-
-
- if (isset($display['settings']['format'])) {
- if ($display['settings']['format'] == 'degrees_minutes_seconds') {
- foreach ($items as $delta => $item) {
- $items[$delta]['lat'] = geofield_latlon_DECtoDMS($item['lat'], 'lat');
- $items[$delta]['lon'] = geofield_latlon_DECtoDMS($item['lon'], 'lon');
- }
- }
- }
-
- if (isset($display['settings']['format'])) {
- if ($display['settings']['format'] == 'ccs') {
- foreach ($items as $delta => $item) {
- $items[$delta]['lat'] = geofield_latlon_DECtoCCS($item['lat'], 'lat');
- $items[$delta]['lon'] = geofield_latlon_DECtoCCS($item['lon'], 'lon');
- }
- }
- }
- switch ($display['type']) {
- case 'geofield_wkt':
- foreach ($items as $delta => $item) {
- $element[$delta] = array('#markup' => $item['wkt']);
- }
- return $element;
- case 'geofield_geojson':
- geofield_load_geophp();
- foreach ($items as $delta => $item) {
- $geometry = geoPHP::load($item['wkt'], 'wkt');
- $json = $geometry->out('json');
- $element[$delta] = array('#markup' => $json);
- }
- return $element;
- case 'geofield_kml':
- geofield_load_geophp();
- foreach ($items as $delta => $item) {
- $geometry = geoPHP::load($item['wkt'], 'wkt');
- $kml = $geometry->out('kml');
- $element[$delta] = array('#markup' => $kml);
- }
- return $element;
- case 'geofield_gpx':
- geofield_load_geophp();
- foreach ($items as $delta => $item) {
- $geometry = geoPHP::load($item['wkt'], 'wkt');
- $kml = $geometry->out('gpx');
- $element[$delta] = array('#markup' => $kml);
- }
- return $element;
- case 'geofield_latlon':
- foreach ($items as $delta => $item) {
- if ($display['settings']['labels']) {
- $output = t('Latitude: !latitude <br/>Longitude: !longitude', array('!latitude' => $item['lat'], '!longitude' => $item['lon']));
- }
- else {
- $output = $item['lat'] . ', ' . $item['lon'];
- }
- $element[$delta] = array('#markup' => $output);
- }
- return $element;
- case 'geofield_lat':
- foreach ($items as $delta => $item) {
- $element[$delta] = array('#markup' => $item['lat']);
- }
- return $element;
- case 'geofield_lon':
- foreach ($items as $delta => $item) {
- $element[$delta] = array('#markup' => $item['lon']);
- }
- return $element;
- case 'geofield_geo_type':
- foreach ($items as $delta => $item) {
- $element[$delta] = array('#markup' => $item['geo_type']);
- }
- return $element;
- case 'geofield_openlayers':
- $map_name = $display['settings']['map_preset'] ? $display['settings']['map_preset'] : 'geofield_formatter_map';
- $element[0] = array('#markup' => _geofield_openlayers_formatter($map_name, $items));
- return $element;
- case 'geofield_def_list':
- foreach ($items as $delta => $item) {
- $element[$delta] = array('#markup' => _geofield_def_list_formatter($item, $display['settings']));
- }
- return $element;
- case 'geofield_description':
- foreach ($items as $delta => $item) {
- $element[$delta] = array('#markup' => _geofield_description_formatter($item, $display['settings']));
- }
- return $element;
- }
- return $element;
- }
- function _geofield_openlayers_formatter($map_name, $items) {
- $features = array();
-
- foreach ($items as $delta) {
- $features[] = array(
- 'wkt' => $delta['wkt'],
- 'projection' => '4326',
- );
- }
-
- $preset = openlayers_preset_load($map_name);
- $map = openlayers_build_map($preset->data);
-
- if (!isset($map['layers']['geofield_formatter'])) {
- drupal_set_message(t('Trying to render a geofield formatter on a map without the placeholder layer'), 'error');
- }
-
-
- $map['layers']['geofield_formatter']['features'] = $features;
-
-
- if (empty($map['errors'])) {
- $js = array('openlayers' => array('maps' => array($map['id'] => $map)));
- drupal_add_js($js, 'setting');
-
- $output = theme('openlayers_map', array(
- 'map' => $map,
- 'map_name' => $map_name
- ));
- }
- return $output;
- }
- function _geofield_def_list_formatter($item, $settings) {
- geofield_load_geophp();
- $geometry = geoPHP::load($item['wkt'], 'wkt');
-
-
- $single_types = array('Point', 'LineStrnig', 'Polygon');
-
- if (in_array($geometry->geometryType(), $single_types)) {
- $centroid = new Point($item['lon'], $item['lat']);
- $info = _geofield_formatter_get_info($geometry, $centroid, $settings['address']);
- return _geofield_def_list_formatter_dl($info);
- }
- else {
- $output = '';
- foreach ($geometry->getComponents() as $component) {
- $centroid = $component->centroid();
- $info = _geofield_formatter_get_info($component, $centroid, $settings['address']);
- $output .= _geofield_def_list_formatter_dl($info);
- }
- return $output;
- }
-
- }
- function _geofield_def_list_formatter_dl($info) {
- $output = '<dl>';
- foreach ($info as $dt => $dd) {
- $output .= '<dt>' . drupal_ucfirst($dt) . '</dt><dd>' . $dd . '</dd>';
- }
-
- $output .= '</dl>';
-
- return $output;
- }
- function _geofield_description_formatter($item, $settings) {
- geofield_load_geophp();
- $geometry = geoPHP::load($item['wkt'], 'wkt');
-
-
- $single_types = array('Point', 'LineString', 'Polygon');
-
- if (in_array($geometry->geometryType(), $single_types)) {
- $centroid = new Point($item['lon'], $item['lat']);
- $info = _geofield_formatter_get_info($geometry, $centroid, $settings['address']);
- return _geofield_description_formatter_text($info);
- }
- else {
- $output = t('A collection of shapes');
- $output .= '<ol>';
- foreach ($geometry->getComponents() as $component) {
- $centroid = $component->centroid();
- $info = _geofield_formatter_get_info($component, $centroid, $settings['address']);
- $output .= '<li>' . _geofield_description_formatter_text($info) . '</li>';
- }
- $output .= '</ol>';
- return $output;
- }
-
- }
- function _geofield_description_formatter_text($info) {
- $text = t('@shape with a center of latitude @lat and longitude @lon.', array('@shape' => $info['shape'], '@lat' => $info['latitude'], '@lon' => $info['longitude']));
- if (isset($info['address'])) {
- $text .= ' ' . t('It has an approximate address of @address.', array('@address' => $info['address']));
- }
-
- if (isset($info['area'])) {
- $text .= ' ' . t('It has an area of @area.', array('@area' => $info['area']));
- }
- if (isset($info['length'])) {
- $text .= ' ' . t('It has a length of @length.', array('@length' => $info['length']));
- }
- return $text;
- }
- function _geofield_formatter_get_info($geometry, $centroid, $address = FALSE, $units = 'degrees') {
- $info = array(
- 'latitude' => $centroid->y(),
- 'longitude' => $centroid->x(),
- );
-
-
- if ($geometry->geometryType() == 'Point') {
- $info['shape'] = 'Point';
- }
- if ($geometry->geometryType() == 'LineString') {
- $info['shape'] = 'Line';
- }
- if ($geometry->geometryType() == 'Polygon') {
-
- $info['shape'] = 'Polygon';
- }
-
- if ($address) {
- $info['address'] = $centroid->out('google_geocode');
- }
-
-
-
-
-
-
-
-
-
- return $info;
- }
|