以编程方式更新Geofield数据


9

我的设置是:

  1. 节点上的地址字段以收集地址数据
  2. 使用“来自其他字段的地理编码”的Geofield选择地址字段和Google Geocoder

当我在UI中编辑/保存节点时,数据将进行地理编码。但是,我有数千个节点,并且正在尝试编写一个脚本来更新每个节点上的地理编码信息。

我尝试加载所有节点并执行node_save(),但地理编码挂钩未触发。

如何以编程方式更新地理信息?我可以使用一个钩子吗?

Answers:


4

根据README.TXT:

API注意事项

地理字段包含有关存储的地理>数据的九列信息。它的核心是“ wkt”列,其中以“知名文本”(WKT)格式存储完整的几何图形。所有其他列都是从WKT列派生的元数据。列如下:

'geom'原始价值。默认情况下,存储为WKB,加载为
WKT'geo_type'几何类型(点,线串,多边形等)
'lat'重心(纬度或Y)
'lon'重心(经度或X)
'top'边界框顶部(纬度或最大值Y)“底部”边界框底部(纬度或最小值Y)
“左”边界框左侧(经度或Min X)
“右”边界框右侧(经度或Max X)
“ geohash”与geom列值等效的Geohash

使用提供的窗口小部件保存地理字段时,这些值将通过geofield_compute_values函数传递,以便计算相关值。默认情况下,基于WKT计算从属值,但是可以将其覆盖以基于其他列计算值。例如,可以这样调用geofield_compute_values:

geofield_compute_values($ values,'latlon');

这将基于经/纬度列计算wkt字段(和所有其他字段),得出一个点。作为开发人员,请记住是否要使用node_load和node_save修改地理信息,这一点很重要。确保通过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 for Services模块

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

在这两种情况下,地理字段的小部件均为Latitude / Longitude,因此其他小部件的结果可能有所不同,尤其是在服务模块中。


这会更新geohash吗?
beroe

我不知道您的意思geohash,请确认,谢谢。
tyler.frankenstein

你好 抱歉,您的评论含糊。Drupal的node__field_geo_field有一个geohash作为其最后一个字段(见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()函数中发送它。

我想知道那是否行得通...

另一方面,您可以仅检查地理字段值的结构,然后利用地理编码器模块API 的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地址解析器在24小时内最多只能对2500个地址进行地址解析。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.