प्रोग्रामेटिक रूप से जियोफिल्ड डेटा अपडेट करें


9

मेरा सेटअप है:

  1. एड्रेस डेटा इकट्ठा करने के लिए नोड्स पर एड्रेसफील्ड
  2. एड्रेसफ़ील्ड और Google जियोकोड को चुनने वाले "दूसरे क्षेत्र से जियोकोड" का उपयोग करके जियोफिल्ड

जब मैं UI में नोड को संपादित / सहेजता हूं, तो डेटा जियोकोडेड होता है। हालाँकि, मेरे पास हजारों नोड हैं और प्रत्येक नोड पर जियोकोड जानकारी को अपडेट करने के लिए एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं।

मैंने सभी नोड्स को लोड करने और एक नोड_सेवे () करने की कोशिश की, लेकिन जियोकोड हुक में आग नहीं लगी।

मैं भौगोलिक रूप से जानकारी को प्रोग्रामेटिक रूप से कैसे अपडेट कर सकता हूं? क्या कोई हुक है जिसका मैं उपयोग कर सकता हूं?

जवाबों:


4

README.TXT के अनुसार:

एपीआई नोट

जियोफिल्ड फ़ील्ड में भौगोलिक> डेटा के बारे में जानकारी के नौ कॉलम होते हैं जो स्टोर होते हैं। इसके दिल में 'wkt' कॉलम है जहां यह 'वेल नॉन टेक्स्ट' (WKT) फॉर्मेट में फुल जियोमेट्री को स्टोर करता है। अन्य सभी कॉलम WKT कॉलम से व्युत्पन्न मेटाडेटा हैं। कॉलम इस प्रकार हैं:

'जियोम' रॉ वैल्यू डिफ़ॉल्ट रूप से, WKB के रूप में संग्रहीत,
WKT 'geo_type' प्रकार की ज्यामिति (बिंदु, लिनेस्ट्रिंग, बहुभुज आदि) के रूप में लोड किया गया ,
'lat' Centroid (अक्षांश या Y)
'अकेला' Centroid (देशांतर या
' X ' 'शीर्ष' बाउंडिंग बॉक्स टॉप () अक्षांश या अधिकतम Y) 'नीचे' बाउंडिंग बॉक्स बॉटम (अक्षांश या न्यूनतम Y)
'बायीं ओर' बाउंडिंग बॉक्स लेफ्ट (देशांतर या न्यूनतम X)
'राइट' बाउंडिंग बॉक्स राइट (देशांतर या अधिकतम X)
'जियोहैश' जियोमैश जियोम कॉलम मान के बराबर है

जब प्रदान किए गए विगेट्स का उपयोग करके एक जियोफिल्ड को बचाया जाता है, तो इन मूल्यों को जियोफिल्ड_कंप्यूट_वेल्यूज़ फ़ंक्शन के माध्यम से पारित किया जाता है ताकि निर्भर मूल्यों की गणना की जा सके। डिफ़ॉल्ट रूप से आश्रित मूल्यों की गणना डब्ल्यूकेटी के आधार पर की जाती है, लेकिन यह अन्य स्तंभों के आधार पर मूल्यों की गणना करने के लिए अधिक महत्वपूर्ण हो सकती है। उदाहरण के लिए, geofield_compute_values ​​को ऐसा कहा जा सकता है:

geofield_compute_values ​​($ मान, 'लेटलान');

यह लैट / लोन कॉलम के आधार पर wkt फ़ील्ड (और अन्य सभी फ़ील्ड) की गणना करेगा, जिसके परिणामस्वरूप एक बिंदु होगा। एक डेवलपर के रूप में यह याद रखना महत्वपूर्ण है कि क्या आप नोड_लोड और नोड_सेवे का उपयोग करके जियोफिल्ड जानकारी को संशोधित करते हैं। सभी कॉलमों को सुसंगत बनाने के लिए 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

इस तरह के मूल्यों का उपयोग करते हुए, मैं प्रोग्राम के लिए एक जियोफिल्ड के डेटा को अपडेट करने में सक्षम था :

पीएचपी

$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 for Services मॉड्यूल

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

दोनों मामलों में, जियोफिल्ड के लिए विजेट है Latitude / Longitude, इसलिए परिणाम अन्य विजेट के लिए भिन्न हो सकते हैं, विशेष रूप से सेवा मॉड्यूल के साथ।


क्या यह अद्यतन करता है geohash?
बेरो

मुझे नहीं पता कि आपका क्या मतलब है geohash, कृपया पुष्टि करें, धन्यवाद।
tyler.frankenstein

नमस्ते। गुप्त टिप्पणी के लिए क्षमा करें। Drupal के node__field_geo_fieldएक है geohashअपने पिछले क्षेत्र के रूप में (ऊपर जवाब में एपीआई देखें)। यह एक भौगोलिक क्षेत्र का एससीआई प्रतिनिधित्व है । मुझे नहीं पता कि वे अनिवार्य या वैकल्पिक हैं, लेकिन मैं उन्हें उत्पन्न करने के लिए एक पायथन कार्यक्रम बनाने जा रहा था और बैकड ड्रूपल डेटाबेस में (लैट / लॉन्ग के साथ) सम्मिलित कर रहा था।
बेर

पुष्टि करने के लिए धन्यवाद। मैं स्वयं geohashमूल्य से अपरिचित हूं , लेकिन शायद आप geofield_compute_valuesऊपर दिए गए उत्तर में उल्लिखित फ़ंक्शन का उपयोग उस मूल्य को लेट / लैंग से प्राप्त करने के लिए कर सकते हैं ।
tyler.frankenstein

1

एक जंगली अनुमान: आप अपने नोड node-edit-formको जियोफिल्ड-मैजिक निकाल पाने की प्रक्रिया के माध्यम से चला सकते हैं ।

Drupal_form_submit () पर एक नज़र डालें $form_state['values'], अपने नोड प्रकार के "सामग्री जोड़ें" फ़ॉर्म के एक सामान्य, मैन्युअल सबमिशन से निरीक्षण करें और drupal_form_submit()फ़ंक्शन में इसे भेजने के लिए प्रोग्रामेटिक रूप से पुनर्निर्माण करें ।

मुझे आश्चर्य है कि अगर यह काम करेगा ...

दूसरी ओर, आप सिर्फ अपने जियोफिल्ड के मूल्य की संरचना का निरीक्षण कर सकते हैं और उस प्रोग्राम का पुनर्निर्माण कर सकते geocoder()हैं जो जियोकोडर मॉड्यूल के एपीआई के कार्य का लाभ उठा रहा है।


0

आप https://www.drupal.org/node/905814#comment-4931016 पर वर्णित विधि का उपयोग कर सकते हैं ।

  1. डेटाबेस बैकअप लें

  2. अपनी सामग्री का एक दृश्य बनाएं। उस सामग्री का चयन करने के लिए एक फ़िल्टर जोड़ें जिसमें जियोफिल्ड अक्षांश खाली है।

  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 जियोकोड में जियोकोड के 2500 पतों की 24h सीमा होती है।


0

ड्रुपल 7 मॉड्यूल है जो क्रोन का उपयोग करके आपके लिए यह सटीक काम करता है। आप प्रति क्रोन रन को संसाधित करने के लिए नोड्स की संख्या निर्धारित कर सकते हैं, और इसके खिलाफ आग लगाने के लिए किस प्रकार की सामग्री का चयन करें।

इसे देखें : https://www.wutime.com/downloads/automatic-geofield-update-to-render-gmaps/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.