Как напечатать определенный экстент карты ArcGis Map?

Я пытаюсь распечатать определенную зону на картах Arcgis с помощью JS API (а не отображаемого расширения).

Я не нашел для этого никакого метода или варианта, поэтому я попытался изменить расширение, а затем распечатать карту:

var extent = new esri.geometry.Extent(
    -620526.0922336339, 
    5993991.149960931, 
    108988.90572005256, 
    6293624.300838808, 
    myMap.spatialReference
);

myMap.setExtent(extent, true).then(function() {
    console.log('setExtend is finished');

    var template = new esri.tasks.PrintTemplate();
    template.exportOptions = {
        width : 500,
        height : 500
    };
    template.format = 'jpg';
    template.layout = 'MAP_ONLY';

    var params = new esri.tasks.PrintParameters();
    params.map = myMap;
    params.template = template;

    var printTask = new esri.tasks.PrintTask(urlToThePrintServer);
    printTask.execute(params);
});

Поскольку setExtent является асинхронным и возвращает отложенный, я должен использовать метод then.

Я вижу, как карта движется, но отложенный, похоже, не работает ... (я не вижу console.log ()).

  • есть ли другой способ распечатать определенную часть карты?
  • если нет, то почему никогда не вызывается метод then?

(Я использую 3.12 JS API)


person Christophe Le Besnerais    schedule 15.07.2015    source источник
comment
Внешний вид неплохой, если не считать того, что вы используете устаревший стиль, отличный от AMD. Вы пытались установить точку останова внутри этой функции?   -  person Mathias Dolidon    schedule 16.07.2015
comment
да, я тоже добавил попробовать / уловить. Ошибки нет, но часть «затем» никогда не вызывается.   -  person Christophe Le Besnerais    schedule 16.07.2015


Ответы (1)


Ваш код мне нравится, хотя, очевидно, вы не опубликовали весь свой JavaScript или какой-либо HTML. Возможно, вам не нужны модули, которые вам нужны. Или, может быть, ваш код пытается запуститься до загрузки карты, хотя это маловероятно, потому что, как вы говорите, карта действительно перемещается. А может что-то еще не так.

Я поместил полный рабочий пример на http://jsfiddle.net/06jtccx0/. Надеюсь, вы сможете сравнить это с тем, что делаете, и выяснить, что не так с вашим кодом. Вот тот же код для вашего удобства:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title>Simple Map</title>
    <link rel="stylesheet" href="http://js.arcgis.com/3.13/esri/css/esri.css">
    <style>
      html, body, #map {
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
      }
      body {
        background-color: #FFF;
        overflow: hidden;
        font-family: "Trebuchet MS";
      }
    </style>
    <script src="http://js.arcgis.com/3.13/"></script>
    <script>
      var myMap;
      var urlToThePrintServer = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task";

      require(["esri/map", "dojo/domReady!"], function(Map) {
        myMap = new Map("map", {
          basemap: "topo",  //For full list of pre-defined basemaps, navigate to http://arcg.is/1JVo6Wd
          center: [-122.45, 37.75], // longitude, latitude
          zoom: 13
        });
        myMap.on("load", function(map) {
          var extent = new esri.geometry.Extent(
              -620526.0922336339, 
              5993991.149960931, 
              108988.90572005256, 
              6293624.300838808, 
              myMap.spatialReference
          );

          myMap.setExtent(extent, true).then(function() {
            console.log('setExtend is finished');
            require([
                "esri/tasks/PrintTemplate",
                "esri/tasks/PrintParameters",
                "esri/tasks/PrintTask"
                ], function(
                  PrintTemplate,
                  PrintParameters,
                  PrintTask
                  ) {

              var template = new PrintTemplate();
              template.exportOptions = {
                  width : 500,
                  height : 500
              };
              template.format = 'jpg';
              template.layout = 'MAP_ONLY';

              var params = new PrintParameters();
              params.map = myMap;
              params.template = template;

              var printTask = new PrintTask(urlToThePrintServer);
              printTask.execute(params, function(response) {
                console.log("The printed document is at " + response.url);
                window.open(response.url);
              });
            });
          });
        });
      });
    </script>
  </head>

  <body>
    <div id="map"></div>
  </body>
</html>
person Gary Sheppard    schedule 15.07.2015
comment
единственная разница между вашим кодом и моим в том, что весь код вызывается, когда я нажимаю кнопку, и что моя карта имеет несколько слоев .... - person Christophe Le Besnerais; 16.07.2015
comment
Я заменил свой dojo.addOnLoad () на require, как вы сделали в своем примере, и удалил все свои слои, и теперь он работает ... - person Christophe Le Besnerais; 16.07.2015
comment
Ваш код скрипки очень помог. В своем приложении я создал карту для печати и просто спрятал ее, чтобы мои распечатки не зависели от видимого экстента карты. - person ponder275; 09.03.2018