Drupal8+leaflet+Geocoder

Главные вкладки

Аватар пользователя zeon76 zeon76 14 августа 2019 в 19:57

Прошу помощи, так как не разобрался или стал перед стеной. Есть задачка получить координаты из загруженной фотографии (геометрии) метаданных exit. В описании модуля говорится что geocoder может читать exif и выковыривать геометки. Логика такова: создан тип материала где есть поле image, и второе поле Geofield которое натравлено на image ( получить координаты) . Суть вопроса как выковырять из фото геометрии и перенести их в поле Geofield. Или я не правильно понимаю логику. Или совсем не понимаю логику. Если есть примеры или документация по модулю geocoder . Пните буду признателен. Пример http://www.geodemocracy.com/geofield_d8/web/geoplaces-map-leaflet не считать за рекламу

Комментарии

Аватар пользователя marassa marassa 14 августа 2019 в 21:44
1

Есть задачка получить координаты из загруженной фотографии (геометрии) метаданных exif

Если честно, не очень понимаю что такое "геометрия" в этом контексте, но любые данные из EXIF считываются с помощью функции PHP exif_read_data (должно быть включено php-расширение exif). Вот пример из моего живого кода:

/**
 * Implements hook_preprocess_image_widget().
 */

function MYMODULE_preprocess_image_widget(&$variables) {
  $element = $variables['element'];
  if ((\Drupal::service('path.current')->getPath() == '/node/add/pictures') && !empty($element['fids']['#value'])) {
    $file = reset($element['#files']);
    try {
      $exif = @exif_read_data(drupal_realpath($file->getFileUri()));
      $ExifDate = $exif && isset($exif['DateTimeOriginal']) ? $exif['DateTimeOriginal'] : '';
    } catch (\Exception $e) {
      // Logs a notice
      \Drupal::logger('MYMODULE')->warning(t("Error while reading EXIF tags from image."), $e);
    }
    $element['file_' . $file->id()]['filename']['#suffix'] = ' <span class="file-size">(' . format_size($file->getSize()) . ')</span>, shot on <span class="exif-date"> ' . $ExifDate . '</span>' ;
  }
}

Существует модуль EXIF, но он глючный и не нужен.

Суть вопроса как выковырять из фото геометрии и перенести их в поле Geofield

Как выковырять я вроде объяснил. Как перенести - очевидно операцией присвоения?

Или совсем не понимаю логику

Если Вы не понимаете, то нам-то как понять? Wink
PS Совершенно непонятно при чем здесь Geocoder. Геокодинг - преобразование координат в человекопонятный адрес или обратно. У Вас и в картинке координаты, и Geofield хранит координаты. Что тут геокодировать?

Аватар пользователя zeon76 zeon76 15 августа 2019 в 5:26

marassa wrote:

Есть задачка получить координаты из загруженной фотографии (геометрии) метаданных exif

Если честно, не очень понимаю что такое "геометрия" в этом контексте, но любые данные из EXIF считываются с помощью функции PHP exif_read_data (должно быть включено php-расширение exif). Вот пример из моего живого кода:

/**
 * Implements hook_preprocess_image_widget().
 */

function MYMODULE_preprocess_image_widget(&$variables) {
  $element = $variables['element'];
  if ((\Drupal::service('path.current')->getPath() == '/node/add/pictures') && !empty($element['fids']['#value'])) {
    $file = reset($element['#files']);
    try {
      $exif = @exif_read_data(drupal_realpath($file->getFileUri()));
      $ExifDate = $exif && isset($exif['DateTimeOriginal']) ? $exif['DateTimeOriginal'] : '';
    } catch (\Exception $e) {
      // Logs a notice
      \Drupal::logger('MYMODULE')->warning(t("Error while reading EXIF tags from image."), $e);
    }
    $element['file_' . $file->id()]['filename']['#suffix'] = ' <span class="file-size">(' . format_size($file->getSize()) . ')</span>, shot on <span class="exif-date"> ' . $ExifDate . '</span>' ;
  }
}

Существует модуль EXIF, но он глючный и не нужен.

Суть вопроса как выковырять из фото геометрии и перенести их в поле Geofield

Как выковырять я вроде объяснил. Как перенести - очевидно операцией присвоения?

Или совсем не понимаю логику

Если Вы не понимаете, то нам-то как понять? Wink
PS Совершенно непонятно при чем здесь Geocoder. Геокодинг - преобразование координат в человекопонятный адрес или обратно. У Вас и в картинке координаты, и Geofield хранит координаты. Что тут геокодировать?


Большое спасибо! за направление, я новичок и в программировании на PHP еще очень и очень слаб. так что буду грызть гранит.

Аватар пользователя marassa marassa 15 августа 2019 в 5:47
1

я новичок и в программировании на PHP еще очень и очень слаб

Тогда можно попробовать начать с модуля Exif - он как раз позволяет вытаскивать указанные метки из файла картинки и раскладывать в указанные поля, только вот боюсь поле Geofield он не осилит, но надо смотреть.
Модуль Geocoder не нужен точно.
В программировании там ничего страшного тоже нет - когда я писал этот код, я тоже был новичок и очень очень слаб Wink

Аватар пользователя zeon76 zeon76 15 августа 2019 в 6:16

marassa wrote:

я новичок и в программировании на PHP еще очень и очень слаб

Тогда можно попробовать начать с модуля Exif - он как раз позволяет вытаскивать указанные метки из файла картинки и раскладывать в указанные поля, только вот боюсь поле Geofield он не осилит, но надо смотреть.
Модуль Geocoder не нужен точно.
В программировании там ничего страшного тоже нет - когда я писал этот код, я тоже был новичок и очень очень слаб ;)


я так понял что для модуля EXIF необходимо создать словарь таксономии с теми метками EXIF которые необходимы. сейчас разбираюсь. и при показе Example of field name and the metadata extracted
выдал мне сначала две ошибки

Warning: strlen() expects parameter 1 to be string, array given in Drupal\Component\Utility\Unicode::validateUtf8() (line 599 of core/lib/Drupal/Component/Utility/Unicode.php).

Drupal\Component\Utility\Unicode::validateUtf8(Array) (Line: 365)
Drupal\exif\Controller\ExifSettingsController->sanitize_value(Array) (Line: 379)
Drupal\exif\Controller\ExifSettingsController->showSample()
call_user_func_array(Array, Array) (Line: 123)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 582)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 124)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) (Line: 97)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 151)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 68)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 57)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 50)
Drupal\ban\BanMiddleware->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 52)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 693)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)

Notice: Array to string conversion in Drupal\exif\Controller\ExifSettingsController->showSample() (line 380 of modules/exif/src/Controller/ExifSettingsController.php).

Drupal\exif\Controller\ExifSettingsController->showSample()
call_user_func_array(Array, Array) (Line: 123)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 582)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 124)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) (Line: 97)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 151)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 68)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 57)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 50)
Drupal\ban\BanMiddleware->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 52)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 693)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)

но потом и метки

Аватар пользователя marassa marassa 15 августа 2019 в 6:51

Там в документации полная туфта написана, никакой таксономии не нужно, нужно просто поставить модуль, полазить по менюшкам и эмпирически разобраться. Ещё полезно почитать Issues, я там даже что-то писал, пока не осознал, что из всего этого модуля мне нужны три строчки кода, которые проще перенести в свой модуль, чем патчить это угробище Wink

Аватар пользователя zeon76 zeon76 15 августа 2019 в 7:43

marassa wrote:
Там в документации полная туфта написана, никакой таксономии не нужно, нужно просто поставить модуль, полазить по менюшкам и эмпирически разобраться. Ещё полезно почитать Issues, я там даже что-то писал, пока не осознал, что из всего этого модуля мне нужны три строчки кода, которые проще перенести в свой модуль, чем патчить это угробище ;)
спасибо большое за совет

Аватар пользователя gun_dose gun_dose 14 августа 2019 в 22:24

Геокодирование - это процесс получения координат из адреса. Реверсивное геокодирование - это процесс получения адреса из координат. Ни то, ни другое в вашей задаче не нужно.

Аватар пользователя zeon76 zeon76 15 августа 2019 в 5:21

gun_dose wrote:
Геокодирование - это процесс получения координат из адреса. Реверсивное геокодирование - это процесс получения адреса из координат. Ни то, ни другое в вашей задаче не нужно.

Моя задача по геометкам exif из фото на карте определить где отснято было это фото. и метку поставить на карте.
Хочу разобраться.

Аватар пользователя gun_dose gun_dose 15 августа 2019 в 6:57
1

Чтобы поставить метку на карте, нужна только широта и долгота. Всё, что вам нужно - это переписать широту и долготу из меток в поле geofield. То есть никаких "определить, где снято", "спросить дорогу"и т.д., а просто перенести две цифры из метаданных файла в материал, к которому этот файл прикреплен. Именно на решении этой задачи стоит сконцентрироваться.