Aggiornamento programmatico dei dati Geofield


9

La mia configurazione è:

  1. Campo di indirizzi sui nodi per raccogliere i dati dell'indirizzo
  2. Geofield utilizzando "Geocode da un altro campo" scegliendo il campo di indirizzi e Google Geocoder

Quando modifico / salvo un nodo nell'interfaccia utente, i dati vengono geocodificati. Tuttavia, ho migliaia di nodi e sto provando a scrivere uno script per aggiornare le informazioni sul geocodice su ciascun nodo.

Ho provato a caricare tutti i nodi e fare un node_save () ma gli hook geocode non si sono attivati.

Come posso aggiornare a livello di codice le informazioni sul geofield? C'è un gancio che posso usare?

Risposte:


4

Secondo README.TXT:

NOTE API

I campi Geofield contengono nove colonne di informazioni sui dati geografici> archiviati. Al suo centro c'è la colonna 'wkt' dove memorizza l'intera geometria nel formato 'Well Known Text' (WKT). Tutte le altre colonne sono metadati derivati ​​dalla colonna WKT. Le colonne sono le seguenti:

'geom' Valore grezzo. Per impostazione predefinita, memorizzato come WKB, caricato come WKT
'geo_type' Tipo di geometria (punto, lineare, poligono, ecc.)
'Lat' Centroid (Latitude o Y)
'lon' Centroid (Longitude o X)
'top' Bounding Box Top ( Latitudine o Max Y) 'bottom' Bounding Box Bottom (Latitude o Min Y)
'left' Bounding Box Left (Longitude o Min X)
'right' Bounding Box Right (Longitude o Max X)
'geohash' Geohash equivalente del valore della colonna geom

Quando un geofield viene salvato utilizzando i widget forniti, questi valori vengono passati attraverso la funzione geofield_compute_values ​​al fine di calcolare i valori dipendenti. Per impostazione predefinita, i valori dipendenti vengono calcolati in base a WKT, ma questo può essere sostituito per calcolare i valori in base ad altre colonne. Ad esempio, geofield_compute_values ​​può essere chiamato in questo modo:

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

Questo calcolerà il campo wkt (e tutti gli altri campi) in base alle colonne lat / lon, risultando in un punto. Come sviluppatore è importante ricordare se si modificano le informazioni sul geofield usando node_load e node_save. Assicurati di eseguire tutte le istanze di geofield modificate attraverso geofield_compute_values ​​per rendere coerenti tutte le colonne.

Questo si traduce in:

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

2

Usando valori come questo, sono stato in grado di aggiornare programmaticamente i dati di un geofield :

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;

Modulo JSON per servizi

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

In entrambi i casi, il widget per il geofield è Latitude / Longitude, quindi i risultati possono variare per altri widget, in particolare con il modulo Servizi .


Questo aggiorna il geohash?
beroe,

Non so cosa intendi geohash, per favore conferma, grazie.
tyler.frankenstein,

Ciao. Ci scusiamo per il commento criptico. Drupal's node__field_geo_fieldha geohashcome suo ultimo campo (vedi API nella risposta sopra). Questa è una rappresentazione ascii di una regione geografica . Non so se sono obbligatori o facoltativi, ma stavo per creare un programma Python per generarli e inserirli (insieme a lat / long) nel database drupal back-end.
beroe,

Grazie per la conferma. Io stesso non ho familiarità con il geohashvalore, ma forse puoi usare la geofield_compute_valuesfunzione menzionata nella risposta sopra per ottenere quel valore dal lat / lng.
tyler.frankenstein,

1

Un'ipotesi selvaggia: puoi eseguire il tuo nodo attraverso il node-edit-formprocesso per far sparare la magia del geofield.

Dai un'occhiata a drupal_form_submit () , osserva il $form_state['values']normale invio manuale del modulo "aggiungi contenuto" del tuo nodo e ricostruiscilo a livello di codice per inviarlo nella drupal_form_submit()funzione.

Mi chiedo se funzionerebbe ...

D'altra parte, potresti semplicemente ispezionare la struttura del valore del tuo geofield e ricostruirla in modo programmatico sfruttando la geocoder()funzione dell'API del modulo geocoder .


0

È possibile utilizzare il metodo descritto in https://www.drupal.org/node/905814#comment-4931016 .

  1. Effettua un backup del database

  2. Dai un'occhiata ai tuoi contenuti. Aggiungi un filtro per selezionare il contenuto in cui la latitudine del geofield è vuota.

  3. Aggiungi il modulo Operazioni collettive Views, aggiungi un campo operazioni collettive e scegli come azione "esegui 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);

Questo approccio funziona perfettamente, tranne per il fatto che i campi Data che utilizzano la visualizzazione popup della data diventano vuoti, quindi fai attenzione se hai campi data.

Si noti inoltre che il geocoder di Google ha un limite di 24 ore di 2500 indirizzi al geocodice.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.