Perbarui Data Geofield secara terprogram

9

Setup saya adalah:

  1. Bidang alamat pada node untuk mengumpulkan data alamat
  2. Geofield menggunakan "Geocode dari bidang lain" memilih bidang alamat dan Google Geocoder

Ketika saya mengedit / menyimpan node di UI, data di-geocode. Namun, saya memiliki ribuan node dan saya mencoba menulis skrip untuk memperbarui info geocode pada setiap node.

Saya mencoba memuat semua node dan melakukan node_save () tetapi kait geocode tidak menyala.

Bagaimana saya bisa memutakhirkan informasi geofield secara terprogram? Apakah ada kait yang bisa saya gunakan?

Fitur
sumber

Jawaban:

4

Menurut README.TXT:

CATATAN API

Bidang Geofield berisi sembilan kolom informasi tentang data geografis> yang disimpan. Pada intinya adalah kolom 'wkt' di mana ia menyimpan geometri penuh dalam format 'Teks Terkenal' (WKT). Semua kolom lainnya adalah metadata yang berasal dari kolom WKT. Kolom adalah sebagai berikut:

Nilai mentah 'geom'. Secara default, disimpan sebagai WKB, dimuat sebagai WKT
'geo_type' Jenis geometri (titik, linestring, poligon, dll.)
'Lat' Centroid (Latitude atau Y)
'lon' Centroid (Longitude atau X)
'top' Bounding Box Top ( Latitude atau Max Y) 'bawah' Bounding Box Bawah (Latitude atau Min Y)
'kiri' Bounding Box Kiri (Bujur atau Min X)
'kanan' Bounding Box Kanan (Bujur atau Maks X)
'geohash' Geohash setara dengan nilai kolom geom

Ketika geofield disimpan menggunakan widget yang disediakan, nilai-nilai ini dilewatkan melalui fungsi geofield_compute_values ​​untuk menghitung nilai dependen. Secara default, nilai-nilai dependen dihitung berdasarkan WKT, tetapi ini mungkin ditimpa untuk menghitung nilai berdasarkan kolom lain. Misalnya, geofield_compute_values ​​dapat dipanggil seperti ini:

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

Ini akan menghitung bidang wkt (dan semua bidang lainnya) berdasarkan pada kolom lat / lon, menghasilkan suatu titik. Sebagai pengembang, ini penting untuk diingat jika Anda mengubah informasi geofield menggunakan node_load dan node_save. Pastikan untuk menjalankan instans geofield yang dimodifikasi melalui geofield_compute_values ​​untuk membuat semua kolom konsisten.

Ini diterjemahkan menjadi:

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

Dengan menggunakan nilai-nilai seperti ini, saya dapat memperbarui data geofield secara terprogram :

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 untuk Modul Layanan

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

Dalam kedua kasus, widget untuk geofield adalah Latitude / Longitude, sehingga hasilnya dapat bervariasi untuk widget lain, terutama dengan modul Layanan .

tyler.frankenstein
sumber
Apakah ini memperbarui geohash?
Beroe
Saya tidak tahu maksud Anda geohash, mohon konfirmasi, terima kasih.
tyler.frankenstein
Hai. Maaf atas komentarnya yang samar. Drupal's node__field_geo_fieldmemiliki geohashsebagai bidang terakhirnya (lihat API pada jawaban di atas). Itu adalah representasi ascii dari wilayah geografis . Saya tidak tahu apakah mereka wajib atau opsional, tapi saya akan membuat program python untuk menghasilkan mereka dan memasukkan (bersama dengan lat / long) ke dalam database backup drupal.
Beroe
Terimakasih sudah mengkonfirmasi. Saya sendiri tidak terbiasa dengan geohashnilai, tetapi mungkin Anda dapat menggunakan geofield_compute_valuesfungsi yang disebutkan dalam jawaban di atas untuk mendapatkan nilai dari lat / lng.
tyler.frankenstein
1

Tebakan liar: Anda dapat menjalankan node Anda melalui node-edit-formproses untuk mendapatkan geofield-magic dipecat.

Lihat drupal_form_submit () , amati $form_state['values']dari pengajuan manual, biasa dari bentuk "tambah konten" jenis simpul Anda dan bangun kembali secara terprogram untuk mengirimkannya dalam drupal_form_submit()fungsi.

Aku ingin tahu apakah itu akan berhasil ...

Di sisi lain, Anda hanya dapat memeriksa struktur nilai geofield Anda dan membangunnya kembali yang secara terprogram meningkatkan geocoder()fungsi API modul geocoder .

gue
sumber
0

Anda dapat menggunakan metode yang dijelaskan dalam https://www.drupal.org/node/905814#comment-4931016 .

  1. Ambil cadangan basis data

  2. Lihat konten Anda. Tambahkan filter untuk memilih konten di mana lintang geofield kosong.

  3. Tambahkan modul Operasi Tampilan Massal, tambahkan bidang operasi massal dan pilih sebagai tindakan "jalankan arbitrer 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);
    

Pendekatan ini berfungsi dengan baik kecuali bidang Tanggal yang menggunakan tampilan sembulan tanggal menjadi kosong, jadi berhati-hatilah jika Anda memiliki bidang tanggal.

Perhatikan juga bahwa geocoder Google memiliki batas 24 jam dari 2.500 alamat ke geocode.

Hans Rossel
sumber