Програмно оновити дані геополя


9

Моя установка:

  1. Адресне поле на вузлах для збору даних адреси
  2. Геополе, використовуючи "Геокод з іншого поля", вибираючи адресне поле та Геокодер Google

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

Я спробував завантажувати всі вузли і робив node_save (), але гачки геокоду не спрацювали.

Як я можу програмно оновлювати інформацію про геополе? Чи є гачок, який я можу використовувати?

Відповіді:


4

Відповідно до README.TXT:

ПРИМІТКИ API

Поля геополя містять дев’ять стовпців інформації про географічні> дані, що зберігаються. В основі його стовпчик 'wkt', де він зберігає повну геометрію у форматі «добре відомий текст» (WKT). Усі інші стовпці є метаданими, отриманими зі стовпця WKT. Стовпці такі:

Значення "geom". За замовчуванням зберігається як WKB, завантажується як WKT
'geo_type' Тип геометрії (точка, лінія рядка, багатокутник тощо)
'lat' Centroid (Широта або Y)
'lon' Centroid (Longitude або X)
'top' Bounding Box Top ( Ширина або Макс Y) 'нижня' нижня частина "Обмежувальної коробки" (широта або мінімум Y)
"ліворуч" Обмежувальна коробка вліво (довгота або хв. X)
"праворуч" Обмежувальна скринька праворуч (довгота або макс. X)
"геохаш"

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

geofield_compute_values ​​($ значень, 'latlon');

Це буде обчислювати поле wkt (та всі інші поля) на основі стовпців lat / lon, що призводить до точки. Як розробник, це важливо пам'ятати, якщо ви змінюєте інформацію про геополі, використовуючи 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 для послуг

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

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


Це оновлення geohash?
beroe

Я не знаю, що ви маєте на увазі geohash, будь ласка, підтвердьте, дякую.
tyler.frankenstein

Привіт. Вибачте за чудовий коментар. Друпал node__field_geo_fieldмає geohashсвоє останнє поле (див. API у відповіді вище). Це представлення ascii географічного регіону . Я не знаю, чи є вони обов'язковими чи необов’язковими, але я збирався створити програму python для їх генерації та вставлення (разом з lat / long) у базу даних drupal.
берое

Дякуємо за підтвердження. Я сам незнайомий зі geohashзначенням, але, можливо, ви можете скористатися geofield_compute_valuesфункцією, зазначеною у відповіді вище, щоб отримати це значення з lat / lng.
tyler.frankenstein

1

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

Погляньте на drupal_form_submit () , спостерігайте за $form_state['values']звичайним, вручну поданням форми "додати вміст" типу вашого вузла та відновіть їх програмно, щоб надіслати його у drupal_form_submit()функцію.

Цікаво, чи це спрацювало б ...

З іншого боку, ви можете просто перевірити структуру значення вашого геополя та відновити його, що програмно використовує geocoder()функцію API модуля геокодера .


0

Можна скористатися методом, описаним на https://www.drupal.org/node/905814#comment-4931016 .

  1. Візьміть резервну копію бази даних

  2. Перегляньте свій вміст. Додайте фільтр, щоб вибрати вміст, де географічна широта порожня.

  3. Додайте модуль «Масові операції перегляду», додайте поле об’ємних операцій та оберіть як «виконувати довільну 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 має обмеження 24 години для геокодування.


0

Існує модуль Drupal 7, який робить саме цю справу для вас, використовуючи cron. Ви можете встановити кількість вузлів, які потрібно обробити за один пробіг крона, і вибрати типи вмісту, на які він буде запускатися.

Перевірте це: https://www.wutime.com/downloads/automatic-geofield-update-to-render-gmaps/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.