Actualización programática de datos de Geofield


9

Mi configuración es:

  1. Campo de direcciones en nodos para recopilar datos de direcciones
  2. Geofield usando "Geocode de otro campo" eligiendo el campo de dirección y el Geocoder de Google

Cuando edito / guardo un nodo en la interfaz de usuario, los datos se geocodifican. Sin embargo, tengo miles de nodos y estoy tratando de escribir un script para actualizar la información de geocodificación en cada nodo.

Intenté cargar todos los nodos y hacer un node_save () pero los ganchos de geocodificación no se dispararon.

¿Cómo puedo actualizar mediante programación la información del geofield? ¿Hay un gancho que pueda usar?

Respuestas:


4

De acuerdo con README.TXT:

API NOTAS

Los campos de Geofield contienen nueve columnas de información sobre los datos geográficos que se almacenan. En su corazón está la columna 'wkt' donde almacena la geometría completa en el formato 'Texto bien conocido' (WKT). Todas las demás columnas son metadatos derivados de la columna WKT. Las columnas son las siguientes:

'geom' Valor bruto. De forma predeterminada, almacenado como WKB, cargado como WKT
'geo_type' Tipo de geometría (punto, cadena lineal, polígono, etc.)
'lat' Centroide (Latitud o Y)
'lon' Centroide (Longitud o X)
'top' Límite superior de la caja ( Latitud o Máx. Y 'inferior' Cuadro delimitador Inferior (Latitud o Mín. Y)
'izquierda' Cuadro delimitador Izquierda (Longitud o Mín. X)
'derecha' Cuadro delimitador Derecha (Longitud o Máx X)
'geohash' Geohash equivalente del valor de columna geom

Cuando se guarda un geofield utilizando los widgets proporcionados, estos valores se pasan a través de la función geofield_compute_values ​​para calcular los valores dependientes. Por defecto, los valores dependientes se calculan en función de WKT, pero esto puede anularse para calcular valores basados ​​en otras columnas. Por ejemplo, los valores de geofield_compute_values ​​pueden llamarse así:

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

Esto calculará el campo wkt (y todos los demás campos) en función de las columnas lat / lon, dando como resultado un punto. Como desarrollador, es importante recordar esto si modifica la información del geofield usando node_load y node_save. Asegúrese de ejecutar cualquier instancia de geofield modificada a través de geofield_compute_values ​​para que todas las columnas sean consistentes.

Esto se traduce en:

      $spot->field_coordinates[LANGUAGE_NONE][0] = geofield_compute_values(
          array(
              'lat' => $venue->location->lat, 
              'lon' => $venue->location->lng,
      ), GEOFIELD_INPUT_LAT_LON);

2

Usando valores como este, pude actualizar los datos de un geofield programáticamente:

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;

Módulo JSON para servicios

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

En ambos casos, el widget para el geofield es Latitude / Longitude, por lo que los resultados pueden variar para otros widgets, especialmente con el módulo Servicios .


¿Esto actualiza el geohash?
Beroe

No sé a qué te refieres geohash, confirma, gracias.
tyler.frankenstein

Hola. Perdón por el comentario críptico. Drupal node__field_geo_fieldtiene un geohashcomo su último campo (ver API en la respuesta anterior). Esa es una representación ascii de una región geográfica . No sé si son obligatorios u opcionales, pero iba a hacer un programa de Python para generarlos e insertarlos (junto con lat / long) en la base de datos drupal de back-end.
Beroe

Gracias por confirmar. Yo mismo no estoy familiarizado con el geohashvalor, pero quizás pueda usar la geofield_compute_valuesfunción mencionada en la respuesta anterior para obtener ese valor de lat / lng.
tyler.frankenstein

1

Una suposición descabellada: puede ejecutar su nodo a través del node-edit-formproceso para hacer que se dispare la geofield-magic.

Eche un vistazo a drupal_form_submit () , observe el $form_state['values']envío manual y ordinario del formulario "agregar contenido" de su tipo de nodo y vuelva a generarlos mediante programación para enviarlo en la drupal_form_submit()función.

Me pregunto si eso funcionaría ...

Por otro lado, puede inspeccionar la estructura del valor de su geocampo y reconstruirlo mediante el aprovechamiento programático de la geocoder()función de la API del módulo geocodificador .


0

Puede usar el método descrito en https://www.drupal.org/node/905814#comment-4931016 .

  1. Tomar una copia de seguridad de la base de datos

  2. Haga una vista de su contenido. Agregue un filtro para seleccionar el contenido donde la latitud del geofield está vacía.

  3. Agregue el módulo de Operaciones masivas de vistas, agregue un campo de operaciones masivas y elija como acción "ejecutar php arbitrario".

    $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);

Este enfoque funciona perfectamente, excepto que los campos de Fecha que usan la pantalla emergente de fecha se vacían, así que tenga cuidado si tiene campos de fecha.

Tenga en cuenta también que el geocodificador de Google tiene un límite de 24 horas de 2500 direcciones para geocodificar.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.