อัปเดตข้อมูล Geofield โดยทางโปรแกรม


9

การตั้งค่าของฉันคือ:

  1. Addressfield บนโหนดเพื่อรวบรวมข้อมูลที่อยู่
  2. Geofield โดยใช้ "Geocode จากฟิลด์อื่น" เลือกฟิลด์ที่อยู่และ Google Geocoder

เมื่อฉันแก้ไข / บันทึกโหนดใน UI ข้อมูลจะถูกระบุตำแหน่งทางภูมิศาสตร์ อย่างไรก็ตามฉันมีหลายพันโหนดและพยายามเขียนสคริปต์เพื่ออัปเดตข้อมูล geocode ในแต่ละโหนด

ฉันพยายามโหลดโหนดทั้งหมดและทำ node_save () แต่ geocode hooks ไม่ทำงาน

ฉันจะอัปเดตข้อมูลตำแหน่งทางภูมิศาสตร์โดยทางโปรแกรมได้อย่างไร มีตะขอที่ฉันสามารถใช้ได้หรือไม่?

คำตอบ:


4

อ้างอิงจาก README.TXT:

API บันทึก

ฟิลด์ Geofield มีคอลัมน์ข้อมูลเก้าคอลัมน์เกี่ยวกับข้อมูลทางภูมิศาสตร์> ที่จัดเก็บ หัวใจของมันคือคอลัมน์ 'wkt' ที่เก็บรูปทรงเรขาคณิตเต็มรูปแบบในรูปแบบ 'Well Known Text' (WKT) คอลัมน์อื่น ๆ ทั้งหมดเป็นข้อมูลเมตาที่ได้มาจากคอลัมน์ WKT คอลัมน์มีดังนี้:

'geom' มูลค่าวัตถุดิบ โดยค่าเริ่มต้นแล้วเก็บไว้เป็น WKB โหลดเป็น WKT
'geo_type' ประเภทของรูปทรงเรขาคณิต (จุด, ส่องแสง, รูปหลายเหลี่ยม ฯลฯ )
'lat' Centroid (ละติจูดหรือ Y)
'lon' Centroid (ลองจิจูดหรือ X)
'Top' Bounding Box Top ( Latitude หรือ Max Y) 'bottom' การ จำกัด กล่องล่าง (Latitude หรือ Min Y)
'ซ้าย' Bounding Box Left (ลองจิจูดหรือ Min X)
'ขวา' Bounding Box Right (ลองจิจูดหรือ Max X)
'geohash' Geohash 'Geohash' เทียบเท่ากับค่าคอลัมน์ geom

เมื่อบันทึกตำแหน่งทางภูมิศาสตร์โดยใช้วิดเจ็ตที่จัดให้ค่าเหล่านี้จะถูกส่งผ่านฟังก์ชัน geofield_compute_values ​​เพื่อคำนวณค่าที่ขึ้นต่อกัน โดยค่าเริ่มต้นขึ้นอยู่กับการคำนวณขึ้นอยู่กับ WKT แต่อาจจะเกินกว่าที่จะคำนวณค่าตามคอลัมน์อื่น ๆ ตัวอย่างเช่น geofield_compute_values ​​อาจถูกเรียกเช่น:

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

สิ่งนี้จะคำนวณฟิลด์ wkt (และฟิลด์อื่น ๆ ทั้งหมด) ตามคอลัมน์ lat / lon ส่งผลให้เกิดจุด ในฐานะนักพัฒนาสิ่งนี้เป็นสิ่งสำคัญที่ต้องจำไว้ถ้าคุณแก้ไขข้อมูลตำแหน่งทางภูมิศาสตร์โดยใช้ node_load และ node_save ตรวจสอบให้แน่ใจว่าได้เรียกใช้อินสแตนซ์ geofield ใด ๆ ที่แก้ไขผ่าน geofield_compute_values ​​เพื่อให้คอลัมน์ทั้งหมดสอดคล้องกัน

สิ่งนี้แปลเป็น:

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

2

ด้วยการใช้ค่าเช่นนี้ฉันสามารถอัปเดตข้อมูลของหน่วยงานทางภูมิศาสตร์โดยทางโปรแกรม:

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 สำหรับโมดูลบริการ

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

ในทั้งสองกรณีวิดเจ็ตสำหรับตำแหน่งทางภูมิศาสตร์คือLatitude / Longitudeดังนั้นผลลัพธ์อาจแตกต่างกันสำหรับวิดเจ็ตอื่น ๆ โดยเฉพาะกับโมดูลบริการ


สิ่งนี้อัปเดตgeohashหรือไม่
beroe

ฉันไม่ทราบว่าคุณหมายถึงอะไรgeohashกรุณายืนยันขอบคุณ
tyler.frankenstein

สวัสดี ขออภัยสำหรับความคิดเห็นที่คลุมเครือ Drupal's node__field_geo_fieldมีgeohashฟิลด์เป็นฟิลด์สุดท้าย (ดู API ในคำตอบด้านบน) นั่นคือการแสดง ASCII ของพื้นที่ทางภูมิศาสตร์ ฉันไม่รู้ว่ามันเป็นข้อบังคับหรือไม่บังคับ แต่ฉันจะสร้างโปรแกรมไพ ธ อนเพื่อสร้างและแทรก (พร้อมกับ lat / long) ลงในฐานข้อมูลส่วนหลังของ drupal
beroe

ขอบคุณสำหรับการยืนยัน ฉันเองไม่คุ้นเคยกับgeohashค่า แต่บางทีคุณสามารถใช้geofield_compute_valuesฟังก์ชั่นที่กล่าวถึงในคำตอบข้างต้นเพื่อรับค่านั้นจาก lat / lng
tyler.frankenstein

1

การคาดเดาอย่างnode-edit-formฉับพลัน: คุณสามารถเรียกใช้โหนดของคุณผ่านกระบวนการเพื่อให้เกิดการยิงใส่พิกัดทางภูมิศาสตร์

ดูที่drupal_form_submit ()สังเกต$form_state['values']จากการส่งแบบธรรมดาของแบบฟอร์ม "เพิ่มเนื้อหา" ของโหนดชนิดของคุณและสร้างใหม่โดยทางโปรแกรมเพื่อส่งไปยังdrupal_form_submit()ฟังก์ชัน

ฉันสงสัยว่าจะทำงานได้หรือไม่

ในอีกทางหนึ่งคุณสามารถตรวจสอบโครงสร้างของมูลค่าทางภูมิศาสตร์ของคุณและสร้างใหม่ที่ใช้ประโยชน์จากgeocoder()ฟังก์ชันของAPI โมดูลของโมดูลgeocoderโดยทางโปรแกรม


0

คุณสามารถใช้วิธีการอธิบายในhttps://www.drupal.org/node/905814#comment-4931016

  1. ทำการสำรองฐานข้อมูล

  2. ทำมุมมองเนื้อหาของคุณ เพิ่มตัวกรองเพื่อเลือกเนื้อหาที่ละติจูดของฟิลด์ Geofield ว่างเปล่า

  3. เพิ่มโมดูลการดำเนินการจำนวนมากเข้าชมเพิ่มเขตข้อมูลการดำเนินการจำนวนมากและเลือกเป็นการกระทำ "ดำเนินการตามอำเภอใจ 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);

วิธีการนี้ทำงานได้อย่างสมบูรณ์ยกเว้นว่าฟิลด์วันที่ที่ใช้การแสดงป๊อปอัพวันที่ว่างเปล่าดังนั้นโปรดระวังถ้าคุณมีฟิลด์วันที่

นอกจากนี้โปรดสังเกตว่า Google geocoder มีขีด จำกัด ที่อยู่ 24 ชั่วโมงในการเข้ารหัสภูมิศาสตร์ 24 ชั่วโมง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.