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