Skip To Content

Tutorial: Imprimir un mapa web y exportar un documento PDF de salida vectorial con ArcPy

Complejidad: IntermedioRequisitos de datos: ArcGIS.com

En este tutorial, creará una aplicación SIG web en la que el usuario final podrá desplazarse hasta un área de interés y hacer clic en un botón Imprimir. El resultado será un documento PDF apto para la impresión con una salida de vectores para capas de servicio.

La exportación desde una aplicación web utilizando el servicio PrintingTools listo para usar y su widget de impresión cliente en ArcGIS API for JavaScript puede generar una imagen de alta calidad de las capas de servicio. Sin embargo, es posible que desee una salida vectorial. Por ejemplo, la salida de vectores en PDF es compatible con las siguientes aplicaciones para la visualización en PDF: alternar la visibilidad de capas, visualizar atributos de entidades y visualizar coordenadas de mapas. En la aplicación web que va a crear, generará equivalentes en vectores del servicio del mapa base Topográfico mundial. Un subconjunto de vectores de un área reducida del servicio de mapas base topográfico mundial está disponible públicamente.

Nota:

Para generar un documento de salida que contenga datos vectoriales locales de alta calidad en lugar de una imagen de las capas de servicio, debe tener acceso a los datos vectoriales correspondientes.

La siguiente ilustración muestra la aplicación web que va a crear.

Aplicación web

El código subyacente del botón Imprimir de la aplicación web utiliza la tarea Imprimir de ArcGIS API for JavaScript. Creará un script de Python que se publicará como servicio de geoprocesamiento que la tarea Imprimir utilizará. El script de Python utiliza la función ConvertWebMapToMapDocument del módulo arcpy.mapping, que insertará el estado completo del mapa web en un documento de mapa de plantilla temporal. La plantilla contiene equivalentes en vectores de todas las capas posibles en el servicio de mapas. El módulo arcpy.mapping también ofrece funciones para eliminar capas de servicio, dejando los datos vectoriales locales presentes de forma temporal en el documento de mapa de plantilla, y para exportar a un documento PDF.

La salida será un documento PDF apto para la impresión que contendrá datos vectoriales locales, en lugar de una imagen de las capas de servicio.

Para completar este tutorial, debe estar familiarizado con el módulo arcpy.mapping, ArcGIS API for JavaScript, ArcMap y ArcGIS Server. También debe familiarizarse con la impresión de las aplicaciones web. Los siguientes temas le resultarán útiles:

Obtener datos vectoriales

Descargue un archivo comprimido que contenga los datos vectoriales que se usarán en la plantilla de documento de mapa temporal. Antes de hacerlo, debe asegurarse de que haya una estructura de carpetas en la que ArcGIS Server pueda localizar el documento de mapa de plantilla y los datos que se usarán en la aplicación web. Se supone que tiene una carpeta que está registrada con ArcGIS Server. Para obtener más información sobre el registro de datos en ArcGIS Server, consulte lo siguiente:

Sugerencia:

Cuando utilice documentos de mapa de plantilla en la función ConvertWebMapToMapDocument, la práctica recomendada es utilizar datos que estén registrados en ArcGIS Server. Si opta por datos no registrados, los documentos de mapa de plantilla y los datos se empaquetarán y copiarán en el servidor. Durante el empaquetamiento, es posible que los datos se muevan y se asignen con rutas relativas a una estructura de carpetas que ConvertWebMapToMapDocument no puede resolver. Para obtener más información, consulte ConvertWebMapToMapDocument.

  1. Abra una nueva sesión vacía de ArcMap.
  2. En la ventana Catálogo, examine la carpeta registrada.
  3. Cree una nueva carpeta en la carpeta registrada llamada BasicTutorial.
  4. En un navegador web, vaya a la descarga de World Topographic Map Template.
  5. Descargue el archivo comprimido World Topographic Map Template en su equipo haciendo clic en los botones Abrir > Descargar.
  6. Cuando se le pida, seleccione Guardar como y guarde el archivo comprimido en la carpeta BasicTutorial de su carpeta registrada.
  7. En ArcMap, abra la herramienta de geoprocesamiento Extraer paquete.

    Esta herramienta desempaquetará la plantilla de mapa comprimida en su carpeta registrada. El parámetro in_package será el archivo comprimido que acaba de descargar. El parámetro output_folder será la carpeta BasicTutorial de su carpeta registrada.

  8. Haga clic en el botón Aceptar para ejecutar la herramienta.

    Su carpeta registrada tendrá un aspecto similar a la siguiente captura de pantalla:

    Carpeta registrada

    Nota:

    En la captura de pantalla anterior, la carpeta registrada se llama MyDataStore. Puede asignar el nombre que quiera a su carpeta registrada.

El documento de mapa WorldTopo_103Templatev2_288k_to_1k.mxd ya está listo para ser utilizado en la aplicación web.

Crear el script de Python

Crea un script de Python que se usará como servicio de impresión de geoprocesamiento personalizado.

El script de Python del servicio de impresión de geoprocesamiento personalizado ejecuta la función ConvertWebMapToMapDocument, que convierte un mapa web (en formato JSON) a un documento de mapa. A continuación, el script elimina las capas de servicio en el documento de mapa de salida, dejando las capas de vectores que se correspondan con la capa de servicio en el JSON del mapa web. El JSON del mapa web contiene la extensión del mapa en la aplicación web. Por último, el script exporta el documento de mapa a un documento PDF.

  1. Abra cualquier IDE de Python, como IDLE (que se suministra con ArcGIS Desktop).
  2. Copie y pegue el siguiente código en un nuevo script de Python:
  3. import arcpy
    import os
    import uuid
    # Input Web Map json
    Web_Map_as_JSON = arcpy.GetParameterAsText(0)
    # The template location in the server data store
    templateMxd = r"\\MyComputer\MyDataStore\BasicTutorial\v103\WorldTopo_103Templatev2_288k_to_1k.mxd"
       
    # Convert the Web Map to a map document
    result = arcpy.mapping.ConvertWebMapToMapDocument(Web_Map_as_JSON, templateMxd)
    mxd = result.mapDocument
    # Reference the data frame that contains the web map
    # Note: ConvertWebMapToMapDocument renames the active data frame in the template_mxd "Webmap"
    df = arcpy.mapping.ListDataFrames(mxd, 'Webmap')[0]
    # Remove the service layer
    # This will just leave the vector layers from the template
    for lyr in arcpy.mapping.ListLayers(mxd, data_frame=df):
        if lyr.isServiceLayer:
            arcpy.mapping.RemoveLayer(df, lyr)
            
    # Use the uuid module to generate a GUID as part of the output name
    # This will ensure a unique output name
    output = 'WebMap_{}.pdf'.format(str(uuid.uuid1()))
    Output_File = os.path.join(arcpy.env.scratchFolder, output)
    # Export the Web Map
    arcpy.mapping.ExportToPDF(mxd, Output_File) 
    # Set the output parameter to be the output file of the server job
    arcpy.SetParameterAsText(1, Output_File)
    # Clean up - delete the map document reference
    filePath = mxd.filePath
    del mxd, result
    os.remove(filePath)
  4. Cambie la variable templateMxd para que sea la ruta UNC hasta la carpeta de la carpeta registrada que contiene los documentos de mapa de plantilla.
  5. Nota:

    Si ArcGIS Server, ArcMap y la carpeta registrada están en el mismo equipo, las rutas UNC a la carpeta registrada no son necesarias. En lugar de ello, pueden usarse rutas absolutas.

  6. Guarde el script de Python. Dé al script el nombre BasicTutorial.py. Guárdelo en una carpeta llamada WebApp dentro de la carpeta registrada.

Crear una herramienta de script de Python

Crea una herramienta de geoprocesamiento personalizada que ejecute el script BasicTutorial.py.

  1. En la ventana Catálogo de ArcMap, vaya a la carpeta WebApp del directorio de la carpeta registrada.
  2. Haga clic con el botón derecho en la carpeta WebApp y haga clic en Nuevo > Caja de herramientas.
  3. Asigne el nombre BasicTutorial a la caja de herramientas.
  4. Haga clic con el botón derecho en la caja de herramientas BasicTutorial y haga clic en Descripción del elemento.
  5. En el cuadro de diálogo Descripción del elemento, rellene las opciones Etiquetas y Resumen con el texto que elija. Si lo desea, rellene las demás descripciones de opciones.
  6. Haga clic en Guardar y cierre el cuadro de diálogo Descripción del elemento.
  7. En la ventana Catálogo, haga clic con el botón derecho en la caja de herramientas BasicTutorial y haga clic en Agregar > Script.
  8. En el cuadro de diálogo Agregar script, escriba BasicTutorial en las opciones Nombre y Etiqueta.
  9. Haga clic en Siguiente.
  10. En Archivo de script, examine la carpeta WebApp de la carpeta registrada y seleccione BasicTutorial.py.
  11. Haga clic en Siguiente.
  12. Agregue dos parámetros a la herramienta de script.
    1. Agregue el parámetro Web_Map_as_JSON.

      Este parámetro toma una representación JSON del estado del mapa que se va a exportar tal y como aparece en la aplicación web. Las propiedades deben coincidir con la siguiente captura de pantalla:

      Propiedades del parámetro Web_Map_as_JSON

    2. Agregue el parámetro Output_File.

      Este es el archivo de salida que se creará. Las propiedades deben coincidir con la siguiente captura de pantalla:

      Propiedades del parámetro Output_File

      Precaución:

      Los nombres de los parámetros Web_Map_as_JSON y Output_File se deben escribir exactamente como se muestra para que coincidan con la firma de la herramienta de la tarea Imprimir en las API web de ArcGIS.

    3. En el cuadro de diálogo Agregar script, haga clic en Finalizar.
  13. Haga clic con el botón derecho en la herramienta de script BasicTutorial y haga clic en Descripción del elemento.
  14. En el cuadro de diálogo Descripción del elemento, rellene las opciones Etiquetas y Resumen con el texto que elija. Además, rellene la opción Explicación del cuadro de diálogo de los cuatro parámetros que hay en la sección Sintaxis del cuadro de diálogo Descripción del elemento con el texto que elija. Si lo desea, rellene las demás descripciones de opciones.

Ejecutar la herramienta

La herramienta debe ejecutarse correctamente para crear un resultado en la ventana Resultados que se pueda publicar en ArcGIS Server.

  1. En la ventana Catálogo, haga clic con el botón derecho en la herramienta de script BasicTutorial y haga clic en Abrir.
  2. Deje el parámetro de entrada Web_Map_as_JSON en blanco.
    Sugerencia:

    Para publicar, puede dejar en blanco el parámetro de entrada de Web_Map_as_JSON, ya que ArcGIS API for JavaScript proporcionará el JSON de mapa web en la aplicación web. Puede dejar el parámetro de salida Web_Map_as_JSON en blanco siempre que el script de Python se haya escrito de tal forma que no provoque errores si se queda en blanco. Por ejemplo, el script no busca capas de mapa web por nombre.

  3. Haga clic en Aceptar y espere a que la herramienta termine de ejecutarse.

El resultado ya está listo para publicarse como servicio de geoprocesamiento.

Publique el resultado

Si no está familiarizado con la publicación de los servicios de geoprocesamiento, consulte lo siguiente:

Para publicar el resultado, siga estos pasos:

  1. Abra la ventana Resultados.
  2. Expanda Sesión actual.
  3. Haga clic con el botón derecho en el resultado BasicTutorial y haga clic en Compartir como > Servicio de geoprocesamiento.
  4. Marque Publicar un servicio.
  5. Haga clic en Siguiente.
  6. Elija una conexión de publicación o administración con el equipo de ArcGIS Server.
  7. Haga clic en Siguiente.
  8. Haga clic en Siguiente.
  9. Haga clic en Continuar.
  10. En el cuadro de diálogo Editor de servicio, haga clic en Publicar.

El servicio de geoprocesamiento ya está listo para utilizarse en ArcGIS API for JavaScript.

Código de ejemplo de ArcGIS API for JavaScript

Use el siguiente código de ejemplo para crear su aplicación web.

En el siguiente código de ejemplo de ArcGIS API for JavaScript, cambie la URL al servicio de geoprocesamiento que haya creado para que coincida con el nombre de su servidor. Se menciona en la siguiente línea:

var printUrl = "https://MyServer:6443/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial";

Código de BasicTutorial.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Webmap Printing</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.0/js/dojo/dijit/themes/claro/claro.css">
    <script src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0"></script>
    <script type="text/javascript" language="Javascript">
      dojo.require("esri.map");
      dojo.require("esri.tasks.PrintTask");
      var printTask, params;

      function init() {
        // set the extent of the web app to same extent as the template map document
        var startExtent = new esri.geometry.Extent({
          "xmin" : -13043333,
          "ymin" : 3836078,
          "xmax" : -13030585,
          "ymax" : 3853683,
          "spatialReference" : {
            "wkid" : 102100
          }
        });

        var map = new esri.Map("map", {
          extent : startExtent
        });

        // add tiled map service to webmap
        var tiledUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer";
        var tiledLayer = new esri.layers.ArcGISTiledMapServiceLayer(tiledUrl);
        map.addLayer(tiledLayer);
        var printUrl = "http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial";
        printTask = new esri.tasks.PrintTask(printUrl, {
          async : true
        });
        params = new esri.tasks.PrintParameters();
        params.map = map;
      }

      function print() {
        var ptemplate = new esri.tasks.PrintTemplate();
        // use the extent of the webmap in the output PDF
        ptemplate.preserveScale = false;
        params.template = ptemplate;
        printTask.execute(params, printComplete);
      }

      function printComplete(result) {
        window.open(result.url);
      }


      dojo.addOnLoad(init);

    </script>
  </head>
  <body class="claro">
    <input type="button" id="print" value="Print" onclick="print();"/>
    <div id="map" style="width:1000px; height:600px; border:1px solid #000;"></div>
  </body>
</html>

Ejecutar la aplicación web

Ejecute la aplicación web que creó. Consulte la documentación de ArcGIS API for JavaScript para obtener instrucciones sobre cómo ejecutar las aplicaciones Web, si es necesario. Esta es una captura de pantalla de la aplicación web:

Ejemplo de aplicación web

Acerque la visualización a un área de interés y haga clic en Imprimir. Aparece el documento PDF de salida. La salida es un documento PDF apto para la impresión con datos vectoriales locales presentados temporalmente en las plantillas de diseño, en lugar de una imagen de las capas de servicio. A continuación se presenta una salida de muestra:

Ejemplo de salida en PDF

Esto concluye el tutorial de impresión y exportación básicas de mapas web con arcpy.mapping. Para obtener información sobre escenarios más avanzados, consulte el Tutorial de impresión y exportación avanzadas de mapas Web con arcpy.mapping.