Html2canvas: Проблема с созданием изображения карты (Google Maps)

Созданный на 6 мар. 2014  ·  51Комментарии  ·  Источник: niklasvh/html2canvas

Привет, народ.
Мне нужно создать изображение моего диалога:

1

Используется html2canvas, но при создании изображения карта не отображается:

2

Мой код:

            function imagem()
            {
                var html2obj = html2canvas($('#dialogPrint'));
                var queue  = html2obj.parse();
                var canvas = html2obj.render(queue);
                var img = canvas.toDataURL();
                window.open(img);
            };

мне нужна помощь, пожалуйста.
Благодарность

Needs More Information

Самый полезный комментарий

Похоже, что в новой версии Google Maps преобразование применяется к другому div. Использование решения @GCorbel , но с этим селектором (".gm-style> div: first> div: first> div: last> div"), похоже, работает. Хотя досконально еще не тестировал.

Все 51 Комментарий

Проблема в том, что карты Google используют матрицу преобразования CSS3, которая не полностью реализована в html2canvas.

Как мне это сделать?

Изображения Google Maps (изображения на внешнем сервере)?

Используйте прокси: https://github.com/niklasvh/html2canvas#how -does-it-work

brcontainer: Я считаю его незаконным (доступ к фрагментам карты напрямую с другого компьютера / прокси /). Единственный способ - использовать CORS.

Прокси- сервер

Прокси-сервер загружает внешний сервер, а html2canvas загружает изображение только после завершения загрузки.

Прочтите http://en.wikipedia.org/wiki/Same_origin_policy , чтобы разобраться в теме.

как использовать этот прокси?

Ссылка, по которой вы провели все ссылки на использование прокси (на языках php, C # (asp.net), python и VB (asp classic)).

Может вы не заметили ссылки на прокси, тогда я вам сюда дам:
https://github.com/niklasvh/html2canvas/wiki/Proxies

При использовании новой библиотеки всегда полезно прочитать README целиком.

@brcontainer Я знаю, что делает этот прокси - когда клиент хочет сделать снимок экрана, СЕРВЕР загружает все изображения в локальную папку, а затем клиент загружает их. Но это неправильно - потому что Google не разрешает прямое использование своих тайловых серверов - и с их точки зрения, кто-то случайно загружает множество тайлов на сервер, не просматривая веб-страницу ...

я использую Java.
у вас есть пример использования прокси?

@brcontainer И, как я уже упоминал, действительно существует проблема с преобразованиями CSS3, потому что карты Google, работающие в Google Chrome, используют их, поэтому карта не отображается при текущей реализации. Поверьте мне, у меня была эта проблема в проекте, который я написал ...

@bkralik Итак, как мне это сделать?
у тебя есть какой-нибудь пример?

Я тоже программирую на java (я уже создавал прокси на PHP, C # и VB), но я не успеваю создать прокси на Java, может быть, я смогу просто сделать это в воскресенье.

Его приложение - JSP или "Java Desktop"?

@brcontainer Это веб-приложение, использующее JSF, Primefaces, Javascript и Java.

@DanielSBelo JSF framework Я никогда не использовал, я программирую на чистой Java, без фреймворков, не знаю, легко ли будет реализовать текущий код с кодом в java-части. Я хотел ему помочь, но действительно не вовремя.

[отредактировано]
О поддержке преобразований css читайте: https://github.com/niklasvh/html2canvas#contributing

@DanielSBelo вы нашли для этого хорошее решение? У меня такая же проблема.

Сохранение карты как холста отлично работает в Firefox, но не может сохранить карту в Chrome. Я не думаю, что это напрямую связано с преобразованием, но более вероятно, что Chrome обрабатывает COR. Однако я совершенно застрял, пытаясь найти ответ.

@TGOlson Это действительно проблема с преобразованиями CSS3, потому что текущая версия html2canvas может отображать только «один уровень» преобразования - он не складывает их.
Вы можете убедиться, что проблема в преобразованиях, просто поиграв с картами Google - обычно дается скриншот, подобный этому:
map_2014-08-10_10-44-02
(В css вся карта позиционируется правильно, но после отключения css3 это происходит)
Единственное решение - реализовать весь стек преобразований css3. Не знаю, идет ли это Никлас, но кто-то должен это сделать :-)

подписка

У меня тоже такая же проблема - только в Chrome. Я использую html2canvas-proxy-php. Другие браузеры работают нормально. Части карты просто отсутствуют ... похоже, это связано с изменением размера карты, добавлением / удалением наложений и т. Д.

К вашему сведению - если вам нужно быстро настроить и запустить некоторые функции захвата карт, вы всегда можете использовать Google Streetview или API статических карт. По сути, реконструируйте то, что текущий пользователь смотрит на карту ( map.getPov и т. Д.), А затем получите это статическое изображение из Google.

Я не думаю, что этот подход работает с наложениями

Я только что наткнулся на эту проблему. Если я не ошибаюсь, этот вопрос о stackoverflow демонстрирует эту проблему, и я предложил обходной путь, прочитав преобразования css3 и применив их как обычные позиции CSS.

var transform=$(".gm-style>div:first>div").css("transform")
var comp=transform.split(",") //split up the transform matrix
var mapleft=parseFloat(comp[4]) //get left value
var maptop=parseFloat(comp[5])  //get top value
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
  "transform":"none",
  "left":mapleft,
  "top":maptop,
})

Возможно, преобразования css3 можно было бы проверить и автоматически преобразовать в нормальное позиционирование CSS во время рендеринга, а затем удалить их после рендеринга.

у меня непостоянная функция захвата экрана.
Работает после полной перезагрузки страницы (с помощью CTLR + R в firefox)

вот мой код, в основном он создает изображение 64 base / png захваченного экрана печати окна и конечный результат, который я помещаю в тег, чтобы увидеть, работает ли он.

Вот функция

функция ebfPrintScreen (имя_компонента)
{
html2cavnas
([document.body],
{
ведение журнала: правда,
useCORS: правда,
onrendered: функция (холст)
{
img = canvas.toDataURL ("изображение / jpg");

                                                  console.log(img.length);
                                                  console.log(img);

                                                  var imgComp = $c(conponentName);
                                                  imgComp.img.src = img

                                          }
                      }
                );

}

Основная цель - захватить маршрут карты Google после его создания, но, как я уже сказал, иногда это работает, а иногда нет. Есть какие-нибудь подсказки о том, что происходит?

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

попробовал решение @mfirdaus , и оно работает для просмотра карты noraml, однако в просмотре улиц оно все еще не работает ... у кого-нибудь есть такая же проблема?

После применения решения @mfirdaus я смог получить изображение карты. Но каким-то образом этот код ниже делает карту непригодной для использования (но при этом может использоваться html2canvas):

$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
      "transform":"none",
      "left":mapleft,
      "top":maptop,
    })

Есть ли способ «восстановить» то, что делает эта строка? А пока я снова вызываю функцию initMap, чтобы карта работала после вызова функции html2canvas с кодом преобразования.

Работает ли приведенный выше сценарий для Google Maps v3?

Мое требование - сделать снимок экрана Google Map v3 с нарисованным на нем маршрутом.

Он отлично работает в Firefox, но в Chrome нет маркера или маршрута. Я уже использую нестандартные маркеры.

Мне сложно отлаживать время, потому что в консоли нет ошибок, а ведение журнала настолько ограничено.

Кто-нибудь решил проблему в Хроме? Я пробовал сценарии прокси на двух языках, но, похоже, ни один из них не имеет значения.

У меня похожая проблема, копирую / вырезаю из интернета этот код:

  if($.browser.safari) {// Fix for Chrome
    var transform=$(".gm-style>div:first>div").css("transform");
    var comp=transform.split(","); //split up the transform matrix
    var mapleft=parseFloat(comp[4]); //get left value
    var maptop=parseFloat(comp[5]);  //get top value
    $(".gm-style>div:first>div").css({ //get the map container. not sure if stable
      "transform":"none",
      "left":mapleft,
      "top":maptop,
    });
  }

  html2canvas([$("#map")[0]], {
    logging: false,
    useCORS: true,
    onrendered: function (canvas) {
      $('#screenshot').after(canvas);

      if($.browser.safari) {// Fix for Chrome
        $(".gm-style>div:first>div").css({
          left:0,
          top:0,
          "transform":transform
        });
      }
    }
  });

Это работает, но если я перемещаю карту с помощью обработчика, это не работает. Я работаю с маркерами, полигонами и т. Д. Он также работает в firefox (я могу перемещать карту), но не в хроме.

Любая идея ?

Фиксированный !

Исправление для хрома, которое я тупо скопировал / вставил, не сработало.

Я сделал это :

  if(window.chrome) {// Fix for Chrome
    var transform=$(".gm-style>div:first>div").css("transform");
    var comp=transform.split(","); //split up the transform matrix
    var mapleft=parseFloat(comp[4]); //get left value
    var maptop=parseFloat(comp[5]);  //get top value
    $(".gm-style>div:first>div").css({ //get the map container. not sure if stable
      "transform":"none",
      "left":mapleft,
      "top":maptop,
    });
  }

  html2canvas([$("#map > div.g-map-canvas > div > div > div:nth-child(1)")[0]], {
    logging: false,
    useCORS: true,
    onrendered: function (canvas) {
      $('#screenshot').after(canvas);

      if(window.chrome) {// Fix for Chrome
        $(".gm-style>div:first>div").css({
          left:0,
          top:0,
          "transform":transform
        });
      }
    }
  });

Очень длинный селектор в html2canvas предназначен для использования карты без кнопок и параметров.

Сейчас работаю, спасибо.

Спасибо @GCorbel Это очень хорошо работает с вашим решением.

Вышеупомянутые обходные пути работают для визуализации карты, но верхние элементы управления либо отсутствуют, либо находятся в неправильном положении. Любые идеи?

Это все еще проблема с версией 1.0.0 ? Если да, не могли бы вы поделиться примером на jsfiddle .

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

@niklasvh Я могу подтвердить, что это все еще проблема с последней версией. Вот скрипка, которую я создал при тестировании этой проблемы: http://jsfiddle.net/9agom947/4/

Скрипка показывает проблему, как описано в вопросе связанного stackoverflow, не обязательно в том, что находится в OP этого потока. Если вы не панорамируете карту, нет проблем с копированием карты. После панорамирования карты в Chrome, но не в FireFox, скопированная карта будет пустой за пределами области, которая была изначально загружена.

image

Исправление, приведенное в этом потоке, похоже, решает проблему.

@ Ananda-Pryana Я пробовал ваш jsFiddle, но исправление, похоже, больше не работает. Есть ли другое решение?

Заранее спасибо.

Похоже, что последняя версия карты Google (v3.32), выпущенная недавно, имеет новый экспериментальный рендерер.
https://developers.google.com/maps/documentation/javascript/releases

Это нарушило исправление. Я провел только быстрое тестирование, но похоже, что теперь все работает одинаково во всех браузерах (не только для Chrome), так что, надеюсь, это упростит исправление в следующей версии html2canvas?

Но быстрое решение - использовать старую версию gmap, где исправление все еще работает нормально.

@ Ananda-Pryana Ага, я понизил gmap, работал, спасибо.

Спасибо @ Ананда-Пряна! У меня была эта работа на прошлой неделе, затем я перенес ее на новую платформу, и я подумал, что именно этот ход сломал ее. Я полностью спускался в крысиную нору, полагая, что виновата новая среда. Я понизил рейтинг до 3.30, и все хорошо.

Похоже, что в новой версии Google Maps преобразование применяется к другому div. Использование решения @GCorbel , но с этим селектором (".gm-style> div: first> div: first> div: last> div"), похоже, работает. Хотя досконально еще не тестировал.

Совет @rSensation работал как шарм в последней версии. Спасибо!

Хм, похоже, эта проблема вернулась ко мне, мне нужно панорамировать карту, чтобы увидеть проблему, и когда я панорамирую и использую Html2Canvas для захвата экрана, некоторые области отображаются как пустые серые?

Для любого из вас, кто имеет дело с обрезанием оверлейных слоев -
Селектор @GCorbel преобразует только слой карты Google. Если у вас есть другие оверлеи, вам нужно будет найти, в каком div они находятся (например, $('.gm-style>div:first>div:first>div:first>div:first>div') был одним из моих оверлеев div и применить то же преобразование к CSS.

@mylesboone, как вы блоке находятся слои наложения? В настоящее время я борюсь с той же проблемой, когда обрезаются слои наложения.

В настоящий момент я использую GmapMarker и GmapPolyline в качестве наложенных слоев.

@sunghunOW
Решение можно найти здесь https://github.com/niklasvh/html2canvas/issues/1568
Вы можете использовать инструмент проверки вашего браузера, чтобы увидеть, какие блоки div нуждаются в преобразовании.

Лучшее решение, которое я нашел:

    html2canvas($('.gm-style>div:eq(0)')[0],{
        useCORS: true,
        allowTaint: true,
        async:false,
    }).then(canvas => {document.body.appendChild(canvas)});
    html2canvas($('.gm-style>div:eq(0)')[0],{
        useCORS: true,
        allowTaint: true,
        async:false,
    }).then(canvas => {document.body.appendChild(canvas)});

Это дает мне холст не определен .. Должен ли селектор элементов слова из коробки?

@hseeda Спасибо! Ваш селектор помог мне!

Вот мой слегка измененный селектор, который действительно работает (по крайней мере, для меня, ха-ха)

const div = document.querySelector('#map > div:first-of-type')

html2canvas(div, {})

Однако теперь он отключает логотип Google, который всегда должен отображаться, чтобы соответствовать условиям :(

Хорошо, я просто клонирую узел или что-то в этом роде. Я уже давно борюсь с этой картой: D

Это работает для меня:

$('#snapshot').on('click',function () {
    html2canvas(document.querySelector('.gm-style'), 
           {useCORS:true, allowTaint: true,async:false} ).then(canvas => {
            document.body.appendChild(canvas)
    });
});

Проблема с пустой картой или ошибкой, генерирующей холст, была сложной, но в конечном итоге для меня это исправило добавление этой конфигурации:

ignoreElements: (node) => {
        return node.nodeName === 'IFRAME';
      }
html2canvas(mapWrapper, {
      useCORS: true,
      allowTaint: false,
      ignoreElements: (node) => {
        return node.nodeName === 'IFRAME';
      }
    }).then(canvas => {
      const url = canvas.toDataURL('image/png');
      saveAs(url, 'image3.png');
      window.URL.revokeObjectURL(url);
    });

Спасибо @imlinus и @hseeda ! Этот селектор у меня отлично работает! и он даже сохраняет логотип Google, спасибо!

@hseeda Спасибо! Ваш селектор помог мне!

Вот мой слегка измененный селектор, который действительно работает (по крайней мере, для меня, ха-ха)

const div = document.querySelector('#map > div:first-of-type')

html2canvas(div, {})

Однако теперь он отключает логотип Google, который всегда должен отображаться, чтобы соответствовать условиям :(

Хорошо, я просто клонирую узел или что-то в этом роде. Я уже давно борюсь с этой картой: D

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

deepender87 picture deepender87  ·  4Комментарии

arzyu picture arzyu  ·  3Комментарии

koreanman picture koreanman  ·  4Комментарии

ABHIKSINGHH picture ABHIKSINGHH  ·  3Комментарии

yasergh picture yasergh  ·  5Комментарии