Geofield Verilerini Programlı Olarak Güncelleme


9

Benim kurulumum:

  1. Adres verilerini toplamak için düğümlerdeki adres alanı
  2. Adres alanını ve Google Geocoder'ı seçerek "Başka bir alandan coğrafi kod" kullanan coğrafi alan

Kullanıcı arayüzünde bir düğümü düzenlediğimde / kaydettiğimde veriler coğrafi olarak kodlanıyor. Ancak, binlerce düğüm var ve her düğümdeki coğrafi kod bilgilerini güncellemek için bir komut dosyası yazmaya çalışıyorum.

Tüm düğümleri yüklemeyi ve bir node_save () yapmayı denedim ama coğrafi kod kancaları ateşlenmedi.

Coğrafi alan bilgilerini programlı olarak nasıl güncelleyebilirim? Kullanabileceğim bir kanca var mı?

Yanıtlar:


4

README.TXT'ye göre:

API NOTLARI

Coğrafi alanlar, depolanan coğrafi> veriler hakkında dokuz bilgi sütunu içerir. Kalbinde, tam geometriyi 'Bilinen Metin' (WKT) biçiminde sakladığı 'wkt' sütunu bulunur. Diğer tüm sütunlar WKT sütunundan türetilen meta verilerdir. Sütunlar aşağıdaki gibidir:

'geom' Ham değer. Varsayılan olarak, WKB olarak depolanır, WKT olarak yüklenir
'geo_type' Geometri türü (nokta, linestring, çokgen vb.)
'Lat' Centroid (Latitude veya Y)
'lon' Centroid (Boylam veya X)
'top' Sınırlayıcı Kutu Üst ( Enlem veya Maks Y) 'alt' Sınırlayıcı Kutu Alt (Enlem veya Min Y)
'sol' Sınırlayıcı Kutu Sol (Boylam veya Min X)
'sağ' Sınırlayıcı Kutu Sağ (Boylam veya Maks X)
'geohash' Geom sütun değerinin Geohash eşdeğeri

Bir coğrafi alan sağlanan widget'lar kullanılarak kaydedildiğinde, bu değerler bağımlı değerleri hesaplamak için geofield_compute_values ​​işlevinden geçirilir. Varsayılan olarak, bağımlı değerler WKT'ye göre hesaplanır, ancak bu diğer sütunlara dayalı değerleri hesaplamak için geçersiz kılınabilir. Örneğin, geofield_compute_values ​​şu şekilde çağrılabilir:

geofield_compute_values ​​($ değerler, 'latlon');

Bu, enlem / boylam sütunlarını temel alarak wkt alanını (ve diğer tüm alanları) hesaplar ve bir nokta ile sonuçlanır. Bir geliştirici olarak, node_load ve node_save kullanarak coğrafi alan bilgilerini değiştirirseniz hatırlamanız önemlidir. Tüm sütunları tutarlı hale getirmek için değiştirilmiş coğrafi alan örneklerini geofield_compute_values ​​üzerinden çalıştırdığınızdan emin olun.

Bu şu anlama gelir:

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

2

Bunun gibi değerleri kullanarak, bir geofield'ın verilerini programlı olarak güncelleyebildim :

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;

Hizmetler için JSON Modülü

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

Her iki durumda da, coğrafi alan için pencere öğesi Latitude / Longitude, bu nedenle sonuçlar özellikle Hizmetler modülünde olmak üzere diğer pencere öğeleri için değişiklik gösterebilir .


Bu güncelleme var mı geohash?
beroe

Ne demek istediğini bilmiyorum geohash, lütfen onayla, teşekkürler.
tyler.frankenstein

Selam. Şifreli yorum için özür dilerim. Drupal's son alanı olarak node__field_geo_fielda sahiptir geohash(yukarıdaki cevaba bakınız). Bu bir coğrafi bölgenin ascii bir temsilidir . Zorunlu veya isteğe bağlı olup olmadığını bilmiyorum, ama onları oluşturmak ve (lat / long ile birlikte) arka uç drupal veritabanına eklemek için bir python programı yapacaktım.
beroe

Onayladığınız için teşekkürler. Ben kendimi geohashdeğeri bilmiyorum , ama belki de geofield_compute_valuesbu değeri lat / lng'den almak için yukarıdaki cevapta belirtilen işlevi kullanabilirsiniz .
tyler.frankenstein

1

Vahşi bir tahmin: node-edit-formDüğümünüzü, geofield-sihrini ateşleme sürecinden geçirebilirsiniz.

Drupal_form_submit () ' a bir göz atın $form_state['values'], düğüm türünüzün "içerik ekle" formunun normal, manuel olarak gönderilmesini gözlemleyin ve bunları drupal_form_submit()işlevde göndermek için programlı olarak yeniden oluşturun .

Bunun işe yarayıp yaramayacağını merak ediyorum ...

Öte yandan, coğrafi alanınızın değerinin yapısını inceleyebilir geocoder()ve coğrafi kodlayıcı modülünün API'sının işlevinden programlı olarak yararlanarak yeniden oluşturabilirsiniz .


0

Https://www.drupal.org/node/905814#comment-4931016 içinde açıklanan yöntemi kullanabilirsiniz .

  1. Bir veritabanı yedeği al

  2. İçeriğinizi görüntüleyin. Coğrafi alan enleminin boş olduğu içeriği seçmek için bir filtre ekleyin.

  3. Views Bulk Operations modülünü ekleyin, bir toplu işlemler alanı ekleyin ve "keyfi php yürüt" eylemi olarak seçin.

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

Bu yaklaşım, tarih açılır ekranını kullanan Tarih alanlarının boş olması dışında mükemmel çalışır, bu nedenle tarih alanlarınız varsa dikkatli olun.

Ayrıca Google coğrafi kodlayıcısının coğrafi kod için 2500 saatlik 24 saatlik bir sınırı olduğunu unutmayın.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.