지오 필드 데이터를 프로그래밍 방식으로 업데이트


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)
'론'중심 (
위 또는 X) '위'경계 상자 상단 ( 위도 또는 최대 Y) '하단'경계 상자 하단 (위도 또는 최소 Y)
'왼쪽'경계 상자 왼쪽 (경도 또는 최소 X)
'오른쪽'경계 상자 오른쪽 (경도 또는 최대 X)
'geohash'Geom 열 값에 해당하는 Geohash

제공된 위젯을 사용하여 지오 필드를 저장하면 종속 값을 계산하기 위해이 값이 geofield_compute_values ​​함수를 통해 전달됩니다. 기본적으로 종속 값은 WKT를 기반으로 계산되지만 다른 열을 기반으로 값을 계산하기 위해 재정의 될 수 있습니다. 예를 들어 geofield_compute_values는 다음과 같이 호출 될 수 있습니다.

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

위도 / 경도 열을 기준으로 wkt 필드 (및 다른 모든 필드)를 계산하여 점을 만듭니다. node_load 및 node_save를 사용하여 지오 필드 정보를 수정하는 경우 개발자는이를 기억해야합니다. 모든 열의 일관성을 유지하려면 geofield_compute_values를 통해 수정 된 지오 필드 인스턴스를 실행해야합니다.

이것은 다음과 같이 번역됩니다.

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

2

이와 같은 값을 사용하여 지오 필드 데이터를 프로그래밍 방식 으로 업데이트 할 수있었습니다 .

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이므로 다른 서비스 , 특히 서비스 모듈의 경우 결과가 다를 수 있습니다 .


이 업데이트는 geohash?
beroe

의 의미가 무엇인지 모르겠습니다 geohash. 감사합니다.
tyler.frankenstein

안녕. 비밀스러운 의견에 대해 죄송합니다. Drupal 's node__field_geo_fieldgeohash마지막 필드로 사용됩니다 (위 답변의 API 참조). 그것은 지리적 인 지역 의 아스키 표현입니다 . 그것들이 필수인지 선택인지는 모르겠지만 파이썬 프로그램을 생성하여 백엔드 drupal 데이터베이스에 (lat / long과 함께) 삽입했습니다.
beroe

확인해 주셔서 감사합니다. 나는 그 geohash가치에 익숙하지 않지만 geofield_compute_values위의 답변에 언급 된 함수를 사용 하여 위도 / 경도에서 그 가치를 얻을 수 있습니다.
tyler.frankenstein

1

node-edit-form당혹스러운 추측 : 프로세스를 통해 노드를 실행하여 지오 필드 매직을 발사 할 수 있습니다.

drupal_form_submit ()을 살펴보고 , $form_state['values']노드 유형의 "컨텐츠 추가"양식을 수동으로 제출하여 프로그래밍 방식으로 다시 작성하여 drupal_form_submit()함수 로 보내십시오 .

그게 효과가 있는지 궁금합니다 ...

반면 지오 필드 값의 구조를 검사 geocoder()하고 지오 코더 모듈 API 의 기능 을 프로그래밍 방식으로 활용하여이를 재구성 할 수 있습니다.


0

https://www.drupal.org/node/905814#comment-4931016에 설명 된 방법을 사용할 수 있습니다 .

  1. 데이터베이스 백업을 수행

  2. 컨텐츠를 봅니다. 지오 필드 위도가 비어있는 콘텐츠를 선택하려면 필터를 추가하십시오.

  3. Views Bulk Operations 모듈을 추가하고 bulk operations 필드를 추가 한 후 "임의의 임의 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 지오 코더의 지오 코딩에 대한 주소는 2500 시간으로 24 시간 제한됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.