Atualizar programaticamente dados de campo geográfico

9

Minha configuração é:

  1. Campo de endereço nos nós para coletar dados de endereço
  2. Campo geográfico usando "Geocódigo de outro campo", escolhendo o campo de endereço e o Geocoder do Google

Quando edito / salvo um nó na interface do usuário, os dados são geocodificados. No entanto, tenho milhares de nós e estou tentando escrever um script para atualizar as informações do geocódigo em cada nó.

Tentei carregar todos os nós e executar um node_save (), mas os ganchos do geocódigo não dispararam.

Como atualizar programaticamente as informações do campo geográfico? Existe um gancho que eu possa usar?

Característica
fonte

Respostas:

4

De acordo com o README.TXT:

NOTAS DA API

Os campos de campo geográfico contêm nove colunas de informações sobre os dados geográficos armazenados. No centro, está a coluna 'wkt', onde ele armazena a geometria completa no formato 'Texto conhecido' (WKT). Todas as outras colunas são metadados derivados da coluna WKT. As colunas são as seguintes:

'geom' Valor bruto. Por padrão, armazenada como WKB, carregada como WKT
'geo_type' Tipo de geometria (ponto, cadeia de linhas, polígono etc.)
'lat' Centroid (Latitude ou Y)
'lon' Centroid (Longitude ou X)
'top' Caixa delimitadora Latitude ou Máx Y) 'inferior' Caixa delimitadora inferior (Latitude ou Min Y)
'esquerda' Caixa delimitadora esquerda (Longitude ou Min X)
'direita' Caixa delimitadora direita (Longitude ou Máx X)
'geohash' Geohash equivalente ao valor da coluna geom

Quando um geofield é salvo usando os widgets fornecidos, esses valores são transmitidos pela função geofield_compute_values ​​para calcular valores dependentes. Por padrão, os valores dependentes são calculados com base no WKT, mas isso pode ser substituído para calcular valores com base em outras colunas. Por exemplo, geofield_compute_values ​​pode ser chamado assim:

geofield_compute_values ​​($ values, 'latlon');

Isso calculará o campo wkt (e todos os outros campos) com base nas colunas lat / lon, resultando em um ponto. Como desenvolvedor, é importante lembrar se você modificar informações de campo geográfico usando node_load e node_save. Certifique-se de executar qualquer instância de campo geográfico modificado por meio de geofield_compute_values ​​para tornar todas as colunas consistentes.

Isso se traduz em:

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

Usando valores como este, consegui atualizar os dados de um campo geográfico programaticamente:

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;

Módulo JSON for Services

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

Nos dois casos, o widget para o campo geográfico é Latitude / Longitude, portanto, os resultados podem variar para outros widgets, especialmente no módulo Serviços .

tyler.frankenstein
fonte
Isso atualiza o geohash?
beroe 22/02/19
Não sei o que você quer dizer com geohash, por favor confirme, obrigado.
tyler.frankenstein 22/02/19
Oi. Desculpe pelo comentário enigmático. O Drupal's node__field_geo_fieldtem geohashcomo último campo (consulte API na resposta acima). Essa é uma representação ascii de uma região geográfica . Não sei se eles são obrigatórios ou opcionais, mas eu iria criar um programa python para gerá-los e inseri-los (junto com lat / long) no banco de dados drupal de back-end.
beroe 22/02/19
Obrigado por confirmar. Eu mesmo não estou familiarizado com o geohashvalor, mas talvez você possa usar a geofield_compute_valuesfunção mencionada na resposta acima para obter esse valor do lat / lng.
tyler.frankenstein
1

Um palpite: você pode executar seu nó no node-edit-formprocesso para disparar a magia do campo geográfico.

Dê uma olhada em drupal_form_submit () , observe a $form_state['values']partir de um envio manual comum do formulário "adicionar conteúdo" do tipo de nó e reconstrua-os programaticamente para enviá-lo na drupal_form_submit()função.

Eu me pergunto se isso funcionaria ...

Por outro lado, você pode apenas inspecionar a estrutura do valor do seu campo geográfico e reconstruir isso programaticamente, aproveitando a geocoder()função da API do módulo geocoder .

gue
fonte
0

Você pode usar o método descrito em https://www.drupal.org/node/905814#comment-4931016 .

  1. Faça um backup do banco de dados

  2. Faça uma visualização do seu conteúdo. Adicione um filtro para selecionar o conteúdo em que a latitude do campo geográfico está vazia.

  3. Adicione o módulo Views Bulk Operations, adicione um campo de operações em massa e escolha como ação "execute php arbitrário".

    $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);

Essa abordagem funciona perfeitamente, exceto que os campos Data que estão usando a exibição do pop-up de data ficam vazios, portanto, tenha cuidado se você tiver campos de data.

Observe também que o geocoder do Google tem um limite de 24 horas de 2500 endereços para o geocode.

Hans Rossel
fonte