openlayers-8.x-4.x-dev/modules/openlayers_geofield/src/Plugin/Field/FieldFormatter/OpenlayersGeofieldFormatter.php
modules/openlayers_geofield/src/Plugin/Field/FieldFormatter/OpenlayersGeofieldFormatter.php
<?php
namespace Drupal\openlayers_geofield\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\openlayers\Plugin\Field\FieldFormatter\OpenlayersFormatterBase;
use Drupal\openlayers\Openlayers;
use Drupal\openlayers\Map;
use Drupal\openlayers\Plugin\Source\Vector\Vector;
/**
* Plugin implementation for an Openlayers Geofield field formatter.
*
* @FieldFormatter(
* id = "openlayers_geofield_formatter",
* label = @Translation("Openlayers Map"),
* description = @Translation("Provides an Openlayers field formatter."),
* field_types = {
* "geofield"
* }
* )
*/
class OpenlayersGeofieldFormatter extends OpenlayersFormatterBase {
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$element = [];
foreach ($items as $delta => $item) {
$settings = $this->getSettings();
$map_name = $settings['map'];
$map = Openlayers::load('Map', $map_name);
$map->build();
$entity = $items->getEntity();
if ($entity->hasTranslation($langcode)) {
$entity = $entity->getTranslation($langcode);
}
$entity_type = $entity->getEntityTypeId();
$entity_id = $entity->id();
$features = [];
// Set features.
$feature = array(
'wkt' => $item->value,
'projection' => 'EPSG:4326',
);
$features[] = $feature;
$layer_name = 'ol_geofield';
if ($layer = $map->getCollection()->getObjectById(['layer'], $layer_name)) {
if ($layer->getSource() instanceof Vector) {
$layer->getSource()->setOption('features', $features);
}
}
//////////////////////////////
// Render each map element as markup.
// Add a specific map id.
$map_id = 'openlayers-map' . '-' . $delta;
// Set height of map
$height = $settings['height'] . $settings['height_unit'];
$js_settings = [
'maps' => [
// $map_id => $map
]
];
//////////////////////// TEMP LINES
$js_settings['maps'][$map_id]['map']['opt'] = [
'width' => 'auto',
'height' => '300px',
'view' => [
'center' => [
'lat' => 0,
'lon' => 0,
],
'rotation' => 0,
'zoom' => 2,
],
];
$js_settings['maps'][$map_id]['layer'][0]['opt'] = [
'source' => 'openlayers_source_osm',
'style' => 'openlayers_style_default',
'opacity' => 1,
'name' => 'OpenStreetMap',
'type' => 'base',
];
////////////////////////////////////////////////////////
$map->attach_js_settings($map_id);
$element[$delta] = $map->renderMap($map_id, $height);
}
return $element;
}
}
/*
$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);
if (count($items) && (($map = Openlayers::load('Map', $map_name)) == TRUE)) {
dpm($map);
if ($layer = $map->getCollection()->getObjectById('layer', $layer_name)) {
if ($layer->getSource() instanceof Vector) {
$layer->getSource()->setOption('features', $features);
}
}
// Build map.
$element[0] = array(
'#type' => 'openlayers',
'#map' => $map,
);
}
*/
