You are here

function openlayers_geofield_field_formatter_view in Openlayers 7.3

Implements hook_field_formatter_view().

Heavily borrowed from geofield_field_formatter_view() and _geofield_openlayers_formatter()

See also

geofield_field_formatter_view()

_geofield_openlayers_formatter()

File

modules/openlayers_geofield/openlayers_geofield.module, line 140
Openlayers Geofield integration.

Code

function openlayers_geofield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();

  // First check to see if we have any value and remove any unset deltas.
  foreach ($items as $delta => $item) {
    if (empty($item['geom'])) {
      unset($items[$delta]);
    }
  }

  // If there are no items, stop here. We won't show anything.
  if (empty($items)) {
    return $element;
  }

  // Ensure geophp is available.
  geophp_load();

  // Transform into centroid or bounding if needed.
  if ($display['settings']['data'] != 'full') {
    if ($display['settings']['data'] == 'centroid') {
      foreach ($items as $delta => $item) {
        $centroid_wkt = 'POINT(' . $item['lon'] . ' ' . $item['lat'] . ')';
        $centroid = geoPHP::load($centroid_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);
        $items[$delta] = geofield_get_values_from_geometry($envelope);
      }
    }
  }

  // If we are a lat, lon, or latlon, and we are using degrees-minutes-seconds
  // (instead of decimal degrees), then do a transformation.
  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 ($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');
      }
    }
  }

  // Create array of $features.
  $features = array();
  foreach ($items as $delta) {
    if (array_key_exists('geom', $delta)) {
      $geometry = geoPHP::load($delta['geom']);
    }
    else {
      $geometry = geoPHP::load($delta);
    }
    $features[] = array(
      'wkt' => $geometry
        ->out('wkt'),
      'projection' => 'EPSG:4326',
    );
  }

  // Load map and set features.
  list($map_name, $layer_name) = explode(':', $display['settings']['map_layer_preset'], 2);

  /** @var \Drupal\openlayers\Types\MapInterface $map */
  if (count($items) && ($map = \Drupal\openlayers\Openlayers::load('Map', $map_name)) == TRUE) {

    /** @var \Drupal\openlayers\Types\LayerInterface $layer */
    if ($layer = $map
      ->getCollection()
      ->getObjectById('layer', $layer_name)) {
      if ($layer
        ->getSource() instanceof \Drupal\openlayers\Plugin\Source\Vector\Vector) {
        $layer
          ->getSource()
          ->setOption('features', $features);
      }
    }

    // Build map.
    $element[0] = array(
      '#type' => 'openlayers',
      '#map' => $map,
    );
  }
  return $element;
}