私の設定は:
UIでノードを編集/保存すると、データがジオコーディングされます。しかし、私は何千ものノードを持っており、各ノードのジオコード情報を更新するスクリプトを書こうとしています。
すべてのノードをロードしてnode_save()を実行しようとしましたが、ジオコードフックが起動しませんでした。
プログラムでジオフィールド情報を更新するにはどうすればよいですか?使用できるフックはありますか?
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);
このような値を使用して、プログラムで geofield のデータを更新することができました。
$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;
{
"nid":123,
"field_position":{"und":[
{"geom":{"lat":"42.2808256","lon":"-83.7430378"}}
]}
}
どちらの場合も、ジオフィールドのウィジェットはLatitude / Longitude
、特に Services モジュールでは、他のウィジェットの結果が異なる場合があります。
ワイルドな推測:_node-edit-form
_プロセスを使用してノードを実行し、geofield-magicを実行できます。
drupal_form_submit() を見て、ノードタイプの「コンテンツの追加」フォームの通常の手動送信から_$form_state['values']
_を観察し、それらをプログラムで再構築してdrupal_form_submit()
関数。
それはうまくいくのだろうか...
一方、ジオフィールドの値の構造を調べて、プログラムで geocoder モジュールのAPIのgeocoder()
関数を利用して再構築することもできます。
Drupal 7モジュールは、cronを使用してこれとまったく同じことを行います。cronの実行ごとに処理するノードの数を設定し、どのコンテンツタイプに対して実行するかを選択できます。
確認してください: https://www.wutime.com/downloads/automatic-geofield-update-to-render-gmaps/
https://www.drupal.org/node/905814#comment-4931016 で説明されている方法を使用できます。
データベースのバックアップを取る
コンテンツを表示します。フィルターを追加して、ジオフィールドの緯度が空のコンテンツを選択します。
ビューの一括操作モジュールを追加し、一括操作フィールドを追加して、アクションとして「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時間の制限があることに注意してください。