Mettre à jour par programme les données Geofield

9

Ma configuration est:

  1. Champ d'adresse sur les nœuds pour collecter les données d'adresse
  2. Geofield utilisant "Geocode d'un autre champ" en choisissant le champ d'adresse et le Google Geocoder

Lorsque je modifie / enregistre un nœud dans l'interface utilisateur, les données sont géocodées. Cependant, j'ai des milliers de nœuds et j'essaie d'écrire un script pour mettre à jour les informations de géocodage sur chaque nœud.

J'ai essayé de charger tous les nœuds et de faire un node_save () mais les hooks de géocodage ne se sont pas déclenchés.

Comment puis-je mettre à jour par programmation les informations du champ géographique? Y a-t-il un crochet que je peux utiliser?

Fonctionnalité
la source

Réponses:

4

Selon README.TXT:

NOTES DE L'API

Les champs de champ géographique contiennent neuf colonnes d'informations sur les données géographiques stockées. Au cœur se trouve la colonne «wkt» où elle stocke la géométrie complète au format «Well Known Text» (WKT). Toutes les autres colonnes sont des métadonnées dérivées de la colonne WKT. Les colonnes sont les suivantes:

'geom' Valeur brute. Par défaut, stocké en tant que WKB, chargé en tant que WKT
'geo_type' Type de géométrie (point, chaîne de caractères, polygone, etc.)
Centroid 'lat' (Latitude ou Y)
Centroid 'lon' (Longitude ou X)
'top' Boîte de contour supérieure ( Latitude ou Max Y) 'bas' Bounding Box Bas (Latitude ou Min Y)
'gauche' Bounding Box Gauche (Longitude ou Min X)
'droite' Bounding Box Droite (Longitude ou Max X)
'geohash' Geohash équivalent de la valeur de la colonne geom

Lorsqu'un champ géographique est enregistré à l'aide des widgets fournis, ces valeurs sont transmises via la fonction geofield_compute_values ​​afin de calculer les valeurs dépendantes. Par défaut, les valeurs dépendantes sont calculées sur la base de WKT, mais cela peut être remplacé pour calculer les valeurs sur la base d'autres colonnes. Par exemple, geofield_compute_values ​​peut être appelé ainsi:

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

Cela calculera le champ wkt (et tous les autres champs) sur la base des colonnes lat / lon, résultant en un point. En tant que développeur, il est important de se souvenir si vous modifiez les informations du champ géographique à l'aide de node_load et node_save. Assurez-vous d'exécuter toutes les instances de champ géographique modifiées via geofield_compute_values ​​afin de rendre toutes les colonnes cohérentes.

Cela se traduit par:

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

En utilisant des valeurs comme celle-ci, j'ai pu mettre à jour les données d'un champ géographique par programmation:

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;

Module JSON pour les services

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

Dans les deux cas, le widget pour le champ géographique est Latitude / Longitude, donc les résultats peuvent varier pour d'autres widgets, en particulier avec le module Services .

tyler.frankenstein
la source
Est-ce que cela met à jour le geohash?
beroe
Je ne sais pas ce que vous entendez geohash, veuillez confirmer, merci.
tyler.frankenstein
Salut. Désolé pour le commentaire énigmatique. Drupal node__field_geo_fielda un geohashdernier champ (voir API dans la réponse ci-dessus). Il s'agit d'une représentation ascii d'une région géographique . Je ne sais pas s'ils sont obligatoires ou facultatifs, mais j'allais créer un programme python pour les générer et les insérer (avec lat / long) dans la base de données drupal backend.
beroe
Merci d'avoir confirmé. Je ne connais pas moi-même la geohashvaleur, mais vous pouvez peut-être utiliser la geofield_compute_valuesfonction mentionnée dans la réponse ci-dessus pour obtenir cette valeur à partir du lat / lng.
tyler.frankenstein
1

Une supposition sauvage: vous pouvez exécuter votre nœud à travers le node-edit-formprocessus pour obtenir la magie du champ géographique.

Jetez un oeil à drupal_form_submit () , observez le à $form_state['values']partir d'une soumission manuelle ordinaire du formulaire "ajouter du contenu" de votre type de nœud et reconstruisez-les par programme pour l'envoyer dans la drupal_form_submit()fonction.

Je me demande si cela fonctionnerait...

D'un autre côté, vous pouvez simplement inspecter la structure de la valeur de votre champ géographique et reconstruire celle-ci en utilisant par programmation la geocoder()fonction de l' API du module de géocodeur .

gue
la source
0

Vous pouvez utiliser la méthode décrite dans https://www.drupal.org/node/905814#comment-4931016 .

  1. Faites une sauvegarde de la base de données

  2. Faites une vue de votre contenu. Ajoutez un filtre pour sélectionner le contenu où la latitude du champ géographique est vide.

  3. Ajoutez le module Views Bulk Operations, ajoutez un champ d'opérations en bloc et choisissez comme action "exécuter un php arbitraire".

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

Cette approche fonctionne parfaitement, sauf que les champs de date qui utilisent l'affichage contextuel de date deviennent vides, alors faites attention si vous avez des champs de date.

Notez également que le géocodeur Google a une limite de 2400 adresses à géocoder 24h.

Hans Rossel
la source