Программно обновлять данные Geofield

9

Моя настройка:

  1. Адресное поле на узлах для сбора адресных данных
  2. Геополе, используя «Геокод из другого поля», выбирая поле адреса и Google Geocoder

Когда я редактирую / сохраняю узел в пользовательском интерфейсе, данные геокодируются. Однако у меня есть тысячи узлов, и я пытаюсь написать скрипт для обновления информации о геокоде на каждом узле.

Я попытался загрузить все узлы и выполнить node_save (), но ловушки геокодирования не сработали.

Как программно обновить информацию о геополе? Есть ли крюк, который я могу использовать?

Характерная черта
источник

Ответы:

4

Согласно README.TXT:

Примечания API

Поля Geofield содержат девять столбцов информации о географических> данных, которые хранятся. В основе лежит столбец «wkt», в котором хранится полная геометрия в формате «Хорошо известный текст» (WKT). Все остальные столбцы являются метаданными, полученными из столбца WKT. Столбцы следующие:

«geom» Сырье. По умолчанию хранится как WKB, загружается как WKT
'geo_type' Тип геометрии (точка, линейная линия, многоугольник и т. Д.)
' Lat ' Centroid (широта или Y)
'lon' Centroid (долгота или X)
'top' Bounding Box Top ( Широта или Макс. Y) «снизу» Ограничительная рамка Днище (Широта или Мин. Y)
«слева» Ограничительная рамка «Влево» (Долгота или Мин. X)
«Право» Ограничительная
рамка « Справа» (Долгота или Макс. X) «Геохэш» Геохэш-эквивалент значения столбца geom

Когда геополе сохраняется с использованием предоставленных виджетов, эти значения передаются через функцию geofield_compute_values ​​для вычисления зависимых значений. По умолчанию зависимые значения вычисляются на основе WKT, но это может быть переопределено для вычисления значений на основе других столбцов. Например, geofield_compute_values ​​можно назвать так:

geofield_compute_values ​​($ values, 'latlon');

Это вычислит поле wkt (и все остальные поля) на основе столбцов широта / долгота, в результате чего получится точка. Как разработчику, это важно помнить, если вы изменяете информацию о геополях, используя node_load и node_save. Обязательно запустите любые измененные экземпляры геополей через geofield_compute_values, чтобы все столбцы были согласованными.

Это переводится как:

      $spot->field_coordinates[LANGUAGE_NONE][0] = geofield_compute_values(
          array(
              'lat' => $venue->location->lat, 
              'lon' => $venue->location->lng,
      ), GEOFIELD_INPUT_LAT_LON);
Дуру
источник
2

Используя значения , как это, я был в состоянии обновить геополе «s данные программно:

PHP

$lat = 42.281646;
$lon = -83.744222;
$geofield = array(
  'geom' => "POINT ($lon $lat)",
  'geo_type' => 'point',
  'lat' => $lat . "000000",
  'lon' => $lon . "000000",
  'left' => $lon . "000000",
  'top' => $lat . "000000",
  'right' => $lon . "000000",
  'bottom' => $lat . "000000"
);
$lang = $node->language;
$node->field_position[$lang][0] = $geofield;

Модуль JSON for Services

{
  "nid":123,
  "field_position":{"und":[
    {"geom":{"lat":"42.2808256","lon":"-83.7430378"}}
  ]}
}

В обоих случаях виджет для геополя есть Latitude / Longitude, поэтому результаты могут отличаться для других виджетов, особенно с модулем Services .

tyler.frankenstein
источник
Это обновление geohash?
Beroe
Я не знаю, что вы имеете в виду geohash, пожалуйста, подтвердите, спасибо.
tyler.frankenstein
Привет. Извините за загадочный комментарий. Drupal node__field_geo_fieldимеет geohashпоследнее поле (см. API в ответе выше). Это представление ascii географического региона . Я не знаю, являются ли они обязательными или необязательными, но я собирался создать программу на python, чтобы сгенерировать их и вставить (вместе с lat / long) в базу данных друпал-бэкэнда.
Beroe
Спасибо за подтверждение. Я сам не знаком со geohashзначением, но, возможно, вы можете использовать geofield_compute_valuesфункцию, упомянутую в ответе выше, чтобы получить это значение из широты / долготы.
tyler.frankenstein
1

Дикая догадка: вы можете запустить свой узел через node-edit-formпроцесс, чтобы запустить магию геополя.

Взгляните на drupal_form_submit () , посмотрите на $form_state['values']обычную ручную отправку формы «добавить контент» вашего типа узла и программно пересоберите их для отправки в drupal_form_submit()функцию.

Интересно, будет ли это работать ...

С другой стороны, вы могли бы просто проверить структуру стоимости вашего геополе и перестраивать , что программно усиливая geocoder()функцию в геокодере API модуля.

GUE
источник
0

Вы можете использовать метод, описанный в https://www.drupal.org/node/905814#comment-4931016 .

  1. Сделайте резервную копию базы данных

  2. Сделайте просмотр вашего контента. Добавьте фильтр, чтобы выбрать контент, в котором широта геополя пуста.

  3. Добавьте модуль Views Bulk Operations, добавьте поле массовых операций и выберите в качестве действия «выполнить произвольный php».

    $test = node_load($entity->nid);    
    module_load_include('inc', 'node', 'node.pages');    
    $test_state['values']['op'] = t('Save');    
    drupal_form_submit('NODENAME_node_form', $test_state, $test);

Этот подход работает отлично, за исключением того, что поля даты, использующие всплывающее окно даты, становятся пустыми, поэтому будьте осторожны, если у вас есть поля даты.

Также обратите внимание, что геокодер Google имеет ограничение в 2500 часов на геокодирование.

Ханс Россель
источник