Эта функция недоступна в Drupal 8. Вы должны полагаться на базовый класс GeofieldItem
, который расширяет FieldItemBase
. Также, как упомянул Оман, вы можете использовать WktGenerator
для простого построения точек, полигонов и т. Д.
Вот рабочий пример. Допустим, у вас есть объект $cbisProduct
с многозначным геополем field_koordinater
, и вы хотите установить первый элемент с произвольными координатами широты / долготы:
// Get geofield item
$geofield = $cbisProduct->get('field_koordinater')->get(0);
// Generate a point [lat, lon]
$coord = ['45.909621', '6.127147'];
$point = \Drupal::service('geofield.wkt_generator')->WktBuildPoint($coord);
// Calling this function will compute values AND assign geodata to the field instance
$geofield->setValue($point);
// You can read the computed geodata from the field
$geodata = $geofield->getValue();
//dpm($geodata);
// Explicitly set field data (needed if $geofield is not a reference)
$cbisProduct->set('field_koordinater', [$geodata]);
// Save entity
$cbisProduct->save();
Под капотом GeofieldItem::setValue
вызывает другой метод, ответственный за непосредственное присвоение вычисленных значений экземпляру поля:
# \Drupal\geofield\Plugin\Field\FieldType\GeofieldItem
protected function populateComputedValues() {
/* @var \Geometry $geom */
$geom = \Drupal::service('geofield.geophp')->load($this->value);
if (!empty($geom)) {
/* @var \Point $centroid */
$centroid = $geom->getCentroid();
$bounding = $geom->getBBox();
$this->geo_type = $geom->geometryType();
$this->lon = $centroid->getX();
$this->lat = $centroid->getY();
$this->left = $bounding['minx'];
$this->top = $bounding['maxy'];
$this->right = $bounding['maxx'];
$this->bottom = $bounding['miny'];
$this->geohash = substr($geom->out('geohash'), 0, GEOFIELD_GEOHASH_LENGTH);
$this->latlon = $centroid->getY() . ',' . $centroid->getX();
}
}
Примечание: вам не обязательно нужен WktGenerator для построения точек, если вы знаете тип геополя и то, как geophp
должен его обрабатывать. Например, следующие 2 утверждения эквивалентны:
$point = \Drupal::service('geofield.wkt_generator')->WktBuildPoint($coord);
// is equivalent to
$point = GEOFIELD_TYPE_POINT . '(' . implode(' ', $coord) . ')');
Но более безопасно полагаться на WktGenerator, особенно с более сложными типами данных.