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


9

私のセットアップは:

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

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

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

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

回答:


4

README.TXTによると:

APIノート

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

'geom'生の値。デフォルトでは、WKBとして保存され、WKTとして読み込まれます。
'geo_type'ジオメトリのタイプ(ポイント、ラインストリング、ポリゴンなど)
'lat'重心(緯度またはY)
'lon'重心(経度またはX)
'top'境界ボックスの上(緯度または最大Y)「下」の境界ボックス下部(緯度または最小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);

2

このような値を使用して、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"}}
  ]}
}

どちらの場合も、geofieldのウィジェットはLatitude / Longitudeであるため、他のウィジェットの結果は、特にServicesモジュールでは異なる場合があります。


これは更新しgeohashますか?
ベロ、

の意味がわかりませんgeohash。確認してください。ありがとうございます。
tyler.frankenstein

こんにちは。不可解なコメントでごめんなさい。Drupalにnode__field_geo_fieldgeohash最後のフィールドとしてa があります(上記の回答のAPIを参照)。これは、地理的領域の ASCII表現です。それらが必須かオプションかはわかりませんが、Pythonプログラムを作成してそれらを生成し、(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()機能。

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

一方、あなたは自分のgeofieldの値の構造を検査し、プログラム的に活用することを再構築できたgeocoder()の機能ジオコーダーモジュールのAPIを。


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ジオコーダーには、ジオコードするアドレスが24時間という2500時間の制限があることに注意してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.