Lập trình cập nhật dữ liệu Geofield


9

Thiết lập của tôi là:

  1. Địa chỉ trên các nút để thu thập dữ liệu địa chỉ
  2. Geofield sử dụng "Mã địa lý từ trường khác" chọn trường địa chỉ và Trình mã hóa địa lý của Google

Khi tôi chỉnh sửa / lưu một nút trong UI, dữ liệu được mã hóa địa lý. Tuy nhiên, tôi có hàng ngàn nút và đang cố gắng viết một tập lệnh để cập nhật thông tin mã địa lý trên mỗi nút.

Tôi đã thử tải tất cả các nút và thực hiện một nút_save () nhưng các móc mã địa lý không kích hoạt.

Làm cách nào để lập trình cập nhật thông tin geofield theo chương trình? Có một cái móc tôi có thể sử dụng?

Câu trả lời:


4

Theo README.TXT:

GHI CHÚ API

Các trường Geofield chứa chín cột thông tin về dữ liệu địa lý> lưu trữ. Tại trung tâm của nó là cột 'wkt' nơi lưu trữ hình học đầy đủ ở định dạng 'Văn bản được biết đến' (WKT). Tất cả các cột khác là siêu dữ liệu được lấy từ cột WKT. Các cột như sau:

'Geom' Giá trị thô. Theo mặc định, được lưu trữ dưới dạng WKB, được tải dưới dạng
Loại hình học của WKT 'Geo_type' (điểm, linestring, đa giác, v.v.)
'lat' Centroid (Latitude hoặc Y)
'lon' Centroid (Kinh độ hoặc X)
'top' Bounding Box Top ( Vĩ độ hoặc Max Y) 'dưới cùng' Bounding Box bottom (Latitude hoặc Min Y)
'left' Bounding Box Left (Kinh độ hoặc Min X)
'right' Bounding Box Right (Kinh độ hoặc Max X)
'geohash' Geohash tương đương với giá trị cột geomash

Khi một geofield được lưu bằng các widget được cung cấp, các giá trị này được chuyển qua hàm geofield_compute_values ​​để tính toán các giá trị phụ thuộc. Theo mặc định, các giá trị phụ thuộc được tính toán dựa trên WKT, nhưng điều này có thể được ghi đè để tính toán các giá trị dựa trên các cột khác. Ví dụ: geofield_compute_values ​​có thể được gọi như vậy:

geofield_compute_values ​​(giá trị $, 'latlon');

Điều này sẽ tính toán trường wkt (và tất cả các trường khác) dựa trên các cột lat / lon, dẫn đến một điểm. Là một nhà phát triển, điều quan trọng cần nhớ là nếu bạn sửa đổi thông tin geofield bằng cách sử dụng node_load và node_save. Đảm bảo chạy mọi phiên bản geofield đã sửa đổi thông qua geofield_compute_values ​​để làm cho tất cả các cột nhất quán.

Điều này dịch là:

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

2

Sử dụng các giá trị như thế này, tôi có thể cập nhật dữ liệu của một geofield theo chương trình:

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ô-đun JSON cho dịch vụ

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

Trong cả hai trường hợp, tiện ích cho geofield là Latitude / Longitude, do đó kết quả có thể khác nhau đối với các tiện ích khác, đặc biệt là với mô-đun Dịch vụ .


Điều này có cập nhật geohashkhông?
beroe

Tôi không biết ý của bạn là gì geohash, xin vui lòng xác nhận, cảm ơn.
tyler.frankenstein

Chào. Xin lỗi cho nhận xét khó hiểu. Drupal's node__field_geo_fieldgeohashtrường cuối cùng (xem API trong câu trả lời ở trên). Đó là một đại diện ascii của một khu vực địa lý . Tôi không biết chúng là bắt buộc hay tùy chọn, nhưng tôi sẽ tạo một chương trình python để tạo chúng và chèn (cùng với lat / long) vào cơ sở dữ liệu drupal phụ trợ.
beroe

Cảm ơn về lời xác nhận. Bản thân tôi không quen với geohashgiá trị này, nhưng có lẽ bạn có thể sử dụng geofield_compute_valueshàm được đề cập trong câu trả lời ở trên để lấy giá trị đó từ lat / lng.
tyler.frankenstein

1

Một phỏng đoán hoang dã: Bạn có thể chạy nút của mình trong suốt node-edit-formquá trình để thực hiện phép thuật geofield.

Hãy xem drupal_form_submit () , quan sát $form_state['values']từ một đệ trình thông thường, thủ công của biểu mẫu "thêm nội dung" của loại nút của bạn và xây dựng lại chúng theo chương trình để gửi nó trong drupal_form_submit()hàm.

Tôi tự hỏi nếu điều đó sẽ làm việc ...

Mặt khác, bạn chỉ có thể kiểm tra cấu trúc của giá trị geofield của mình và xây dựng lại để tận dụng geocoder()chức năng của API của mô-đun bộ mã hóa địa lý .


0

Bạn có thể sử dụng phương pháp được mô tả trong https://www.drupal.org/node/905814#comment-4931016 .

  1. Sao lưu cơ sở dữ liệu

  2. Hãy xem nội dung của bạn. Thêm bộ lọc để chọn nội dung trong đó vĩ độ geofield trống.

  3. Thêm mô-đun Lượt xem hoạt động hàng loạt, thêm trường hoạt động hàng loạt và chọn làm hành động "thực thi php tùy ý".

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

Cách tiếp cận này hoạt động hoàn hảo ngoại trừ các trường Ngày đang sử dụng hiển thị cửa sổ bật lên ngày trở nên trống rỗng, vì vậy hãy cẩn thận nếu bạn có các trường ngày.

Cũng lưu ý rằng bộ mã hóa địa lý của Google có giới hạn 24h là 2500 địa chỉ đối với mã địa lý.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.