web-dev-qa-db-ja.com

プログラムでジオフィールドデータを更新する

私の設定は:

  1. アドレスデータを収集するためのノードのアドレスフィールド
  2. 「別のフィールドのジオコード」を使用して住所フィールドとGoogleジオコーダーを選択するジオフィールド

UIでノードを編集/保存すると、データがジオコーディングされます。しかし、私は何千ものノードを持っており、各ノードのジオコード情報を更新するスクリプトを書こうとしています。

すべてのノードをロードしてnode_save()を実行しようとしましたが、ジオコードフックが起動しませんでした。

プログラムでジオフィールド情報を更新するにはどうすればよいですか?使用できるフックはありますか?

9
Feature

README.TXTによると:

APIノート

ジオフィールドフィールドには、ストアである地理データに関する9列の情報が含まれます。その中心にあるのは「wkt」列で、「Well Known Text」(WKT)形式で完全なジオメトリを格納します。他のすべての列は、WKT列から派生したメタデータです。列は次のとおりです。

'geom'生の値。デフォルトでは、WKBとして保存され、WKTとしてロードされます
'geo_type'ジオメトリのタイプ(ポイント、ラインストリング、ポリゴンなど)
「緯度」セントロイド(緯度またはY)
「lon」セントロイド(経度またはX)
'top'境界ボックスの上部(緯度または最大Y) 'bottom'境界ボックスの下部(緯度または最小Y)
「左」境界ボックス左(経度または最小X)
「右」境界ボックス右(経度または最大X)
'geohash' geohashのgeom列の値と同等

提供されたウィジェットを使用してジオフィールドが保存されると、これらの値は依存値を計算するためにgeofield_compute_values関数を介して渡されます。デフォルトでは、依存値はWKTに基づいて計算されますが、これをオーバーライドして他の列に基づいて値を計算することもできます。たとえば、geofield_compute_valuesは次のように呼び出すことができます。

geofield_compute_values($ values、 'latlon');

これにより、緯度/経度の列に基づいてwktフィールド(および他のすべてのフィールド)が計算され、ポイントが得られます。開発者は、node_loadとnode_saveを使用してgeofield情報を変更するかどうかを覚えておくことが重要です。すべての列を一貫させるために、geofield_compute_valuesを介して変更されたgeofieldインスタンスを必ず実行してください。

これは次のように変換されます。

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

このような値を使用して、プログラムで geofield のデータを更新することができました。

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、特に Services モジュールでは、他のウィジェットの結果が異なる場合があります。

2

ワイルドな推測:_node-edit-form_プロセスを使用してノードを実行し、geofield-magicを実行できます。

drupal_form_submit() を見て、ノードタイプの「コンテンツの追加」フォームの通常の手動送信から_$form_state['values']_を観察し、それらをプログラムで再構築してdrupal_form_submit() 関数。

それはうまくいくのだろうか...

一方、ジオフィールドの値の構造を調べて、プログラムで geocoder モジュールのAPIのgeocoder()関数を利用して再構築することもできます。

1
gue

Drupal 7モジュールは、cronを使用してこれとまったく同じことを行います。cronの実行ごとに処理するノードの数を設定し、どのコンテンツタイプに対して実行するかを選択できます。

確認してください: https://www.wutime.com/downloads/automatic-geofield-update-to-render-gmaps/

0
user97242

https://www.drupal.org/node/905814#comment-4931016 で説明されている方法を使用できます。

  1. データベースのバックアップを取る

  2. コンテンツを表示します。フィルターを追加して、ジオフィールドの緯度が空のコンテンツを選択します。

  3. ビューの一括操作モジュールを追加し、一括操作フィールドを追加して、アクションとして「execute 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ジオコーダーには、ジオコーディングするアドレスが24時間という2500時間の制限があることに注意してください。

0
Hans Rossel