PrintTask0.js 14.1 KB
// All material copyright ESRI, All Rights Reserved, unless otherwise specified.
// See https://js.arcgis.com/4.6/esri/copyright.txt for details.
//>>built
define("../core/kebabDictionary ../core/urlUtils ../core/promiseUtils ../geometry/Polygon ../request dojo/_base/lang dojo/dom-construct dojox/gfx/canvas ./Geoprocessor ./support/PrintTemplate ./support/printTaskUtils ./Task".split(" "),function(r,x,C,D,E,m,F,y,G,H,t,I){function w(a){return!(!a||!a.path)}var z={Feet:"ft",Kilometers:"km",Meters:"m",Miles:"mi"},A=r({esriFeet:"Feet",esriKilometers:"Kilometers",esriMeters:"Meters",esriMiles:"Miles"}),J=r({MAP_ONLY:"map-only","A3 Landscape":"a3-landscape",
"A3 Portrait":"a3-portrait","A4 Landscape":"a4-landscape","A4 Portrait":"a4-portrait","Letter ANSI A Landscape":"letter-ansi-a-landscape","Letter ANSI A Portrait":"letter-ansi-a-portrait","Tabloid ANSI B Landscape":"tabloid-ansi-b-landscape","Tabloid ANSI B Portrait":"tabloid-ansi-b-portrait"}),K=r({esriExecutionTypeSynchronous:"sync",esriExecutionTypeAsynchronous:"async"});return I.createSubclass({declaredClass:"esri.tasks.PrintTask",constructor:function(){this._handleExecuteResponse=this._handleExecuteResponse.bind(this)},
_vtlExtent:null,_legendLayers:[],_legendLayerNameMap:{},_gpServerUrl:null,_is11xService:!1,_data:null,properties:{mode:{readonly:!0,value:"sync"},_geoprocessor:{dependsOn:["url","updateDelay"],get:function(){return new G(this.url,{updateDelay:this.updateDelay})}},url:{value:null,type:String},updateDelay:{value:1E3,type:Number}},execute:function(a,e){var c=this.url.replace(/\/Export.*/,"");return C.resolve().then(function(){if(this._gpServerUrl===c)return{data:this._data};this._gpServerUrl=c;return E(c,
{query:{f:"json"}})}.bind(this)).then(function(c){this._data=c.data;this._is11xService=!!this._data.cimVersion;c=this._setPrintParams(a);this.mode===this._data.executionType?this._data.executionType:K.fromJSON(this._data.executionType);return this._geoprocessor["async"===this.mode?"submitJob":"execute"](c,e).then(this._handleExecuteResponse)}.bind(this))},_createOperationalLayers:function(a,e){var c=[],l,b,k,d,h=a.map.allLayers.filter(function(a){return a.parent&&"group"===a.parent.type&&!a.parent.visible?
!1:!0}).items;for(l=0;l<h.length;l++)if(b=h[l],b.loaded&&b.visible)switch(d={id:b.id,title:this._legendLayerNameMap[b.id]||b.title,opacity:b.opacity,minScale:b.minScale||0,maxScale:b.maxScale||0,url:b.url&&x.normalize(b.url),token:b.token},k=b.declaredClass,k){case "esri.layers.ImageryLayer":var f={bandIds:b.bandIds,compressionQuality:b.compressionQuality,format:b.format,interpolation:b.interpolation};b.mosaicRule&&(f.mosaicRule=b.mosaicRule.toJSON());b.renderingRule&&(f.renderingRule=b.renderingRule.toJSON());
c.push(m.mixin(d,f));this._legendLayers&&this._legendLayers.push({id:b.id});break;case "esri.layers.OpenStreetMapLayer":m.mixin(d,{type:"OpenStreetMap"});c.push(d);break;case "esri.layers.GraphicsLayer":m.mixin(d,this._createFeatureCollectionJSON(b));c.push(d);this._legendLayers&&this._legendLayers.push({id:b.id});break;case "esri.layers.VectorTileLayer":if(this._is11xService){d={id:b.id,tiyle:b.title,type:"VectorTileLayer",layerType:"VectorTileLayer",styleUrl:b.url&&x.normalize(b.url),opacity:b.opacity,
visibility:b.visible};c.push(d);break}d.type="image";d.url&&delete d.url;var n=e.exportOptions&&e.exportOptions.dpi||96;k=e.exportOptions&&e.exportOptions.width%2===a.width%2;var g=e.exportOptions&&e.exportOptions.height%2===a.height%2,q={format:"png",pixelRatio:n/96,rotation:0},f=this._vtlExtent||a.extent.clone();"MAP_ONLY"!==e.layout||!e.preserveScale||e.outScale&&e.outScale!==a.scale||96!==n||k&&g||(q.area={x:0,y:0,width:a.width,height:a.height},k||(q.area.width+=1),g||(q.area.height+=1),this._vtlExtent||
(n=a.toMap({x:q.area.width,y:q.area.height}),f.ymin=n.y,f.xmax=n.x,this._vtlExtent=f));d.extent=f.clone()._normalize(!0).toJSON();f=a.whenLayerView(b);f.isResolved()&&f.then(function(b){b=b.takeScreenshot(q,a);b.isResolved()?b.then(function(a){"data:image/png;base64,"===a.dataURL.substr(0,22)&&(d.imageData=a.dataURL.substr(22))}):console.error("PrintTask: VectorTileLayer.takeScreenshot() returned an unresolved Promise");d.imageData&&c.push(d)});break;case "esri.layers.MapImageLayer":var p={id:b.id,
subLayerIds:[]},u=[],t=a.scale,v=function(a){var b=0===t,c=0===a.minScale||t<=a.minScale,d=0===a.maxScale||t>=a.maxScale;a.visible&&(b||c&&d)&&(a.sublayers?a.sublayers.forEach(v):(b=a.toExportImageJSON().drawingInfo,c=a.toJSON(),c.layerDefinition.drawingInfo=b,u.unshift(c),p.subLayerIds.push(a.id)))};b.sublayers&&b.sublayers.forEach(v);m.mixin(d,{layers:u,visibleLayers:p.subLayerIds});c.push(d);this._legendLayers.push(p);break;case "esri.layers.KMLLayer":this._is11xService?(d={},b.write(d,{origin:"web-map"}),
d.showLabels=e.showLabels,c.push(d)):a.whenLayerView(b).then(function(a){a.allVisibleMapImages.forEach(function(a,d){d={id:b.id+"_image"+d,type:"image",title:b.id,minScale:b.minScale||0,maxScale:b.maxScale||0,opacity:b.opacity,extent:a.extent.toJSON()};"data:image/png;base64,"===a.href.substr(0,22)?d.imageData=a.href.substr(22):d.url=a.href;c.push(d)});a=a.allVisiblePoints.concat(a.allVisiblePolylines).concat(a.allVisiblePolygons);var d={id:b.id};m.mixin(d,this._createFeatureCollectionJSON(null,a));
c.push(d)}.bind(this));break;case "esri.layers.WMSLayer":u=[];v=function(a){a.visible&&(a.sublayers?a.sublayers.forEach(v):a.name&&u.unshift(a.name))};b.sublayers&&b.sublayers.forEach(v);m.mixin(d,{type:"wms",transparentBackground:b.imageTransparency,visibleLayers:u,version:b.version});c.push(d);break;case "esri.layers.WMTSLayer":f=b.activeLayer;m.mixin(d,{type:"wmts",layer:f.id,style:f.styleId,format:f.imageFormat,tileMatrixSet:f.tileMatrixSetId});c.push(d);break;case "esri.layers.WebTileLayer":f=
b.urlTemplate.replace(/\$\{/g,"{");m.mixin(d,{type:"WebTiledLayer",urlTemplate:f,credits:b.copyright});b.subDomains&&0<b.subDomains.length&&(d.subDomains=b.subDomains);c.push(d);break;case "esri.layers.CSVLayer":if(this._is11xService){d={};b.write(d,{origin:"web-map"});c.push(d);break}case "esri.layers.StreamLayer":case "esri.layers.FeatureLayer":n=(f=b.renderer)&&!f.hasVisualVariables()&&!b.featureReduction&&!f.valueExpression&&"esri.layers.CSVLayer"!==k;k="esri.layers.FeatureLayer"===k&&b.source&&
b.source.length||"esri.layers.StreamLayer"===k;if(!this._is11xService&&!n||k){var B;a.whenLayerView(b).then(function(a){return a.queryGraphics&&a.queryGraphics()||a.featuresView.graphics}).then(function(a){B=a.map(function(a){a.geometry.hasZ=!1;return a})});m.mixin(d,this._createFeatureCollectionJSON(b,B))}else d={},b.write(d,{origin:"web-map"}),d.layerDefinition&&d.layerDefinition.drawingInfo&&d.layerDefinition.drawingInfo.renderer&&this._convertSvgRenderer(d.layerDefinition.drawingInfo.renderer);
f.visualVariables&&f.visualVariables[0]&&f.visualVariables[0].maxSize&&"number"!==typeof f.visualVariables[0].maxSize&&f.visualVariables[0].minSize&&"number"!==typeof f.visualVariables[0].minSize&&(f=f.getSizeRangeAtScale(f.visualVariables[0],a.scale),d.layerDefinition.drawingInfo.renderer.visualVariables[0].minSize=f.minSize,d.layerDefinition.drawingInfo.renderer.visualVariables[0].maxSize=f.maxSize);c.push(d);this._legendLayers&&this._legendLayers.push({id:b.id});break;case "esri.layers.MapNotesLayer":var r=
[];b.featureCollections.map(function(a){var b=a.source.toArray();a=this._createFeatureCollectionJSON(a,b).featureCollection;r=r.concat(a.layers)}.bind(this));m.mixin(d,{featureCollection:{layers:r}});c.push(d);break;default:c.push(d)}a.graphics&&a.graphics.length&&(d=this._createFeatureCollectionJSON({},a.graphics))&&c.push(d);return c},_createFeatureCollectionJSON:function(a,e){var c=t.createPolygonLayer(),l=t.createPolylineLayer(),b=t.createPointLayer(),k=t.createMultipointLayer(),d=t.createPointLayer();
d.layerDefinition.name="textLayer";delete d.layerDefinition.drawingInfo;a&&("esri.layers.FeatureLayer"===a.declaredClass||"esri.layers.StreamLayer"===a.declaredClass?c.layerDefinition.name=l.layerDefinition.name=b.layerDefinition.name=k.layerDefinition.name=this._legendLayerNameMap[a.id]||a.get("arcgisProps.title")||a.title:"esri.layers.GraphicsLayer"===a.declaredClass&&(e=a.graphics.items));if(a&&a.renderer&&!m.isFunction(a.get("renderer.field"))){var h=a.renderer.toJSON();c.layerDefinition.drawingInfo.renderer=
h;l.layerDefinition.drawingInfo.renderer=h;b.layerDefinition.drawingInfo.renderer=h;k.layerDefinition.drawingInfo.renderer=h}else delete c.layerDefinition.drawingInfo,delete l.layerDefinition.drawingInfo,delete b.layerDefinition.drawingInfo,delete k.layerDefinition.drawingInfo;var f=a&&a.fields,h=a&&a.renderer,n=[];h&&!m.isFunction(a.get("renderer.field"))&&("class-breaks"===h.type?(f||(f=[{name:h.field,type:"esriFieldTypeDouble"}],h.normalizationField&&f.push({name:h.normalizationField,type:"esriFieldTypeDouble"})),
h.field&&n.push(h.field),h.normalizationField&&n.push(h.normalizationField)):"unique-value"===h.type&&(f||(f=[{name:h.field,type:"esriFieldTypeString"}],h.field2&&f.push({name:h.field2,type:"esriFieldTypeString"}),h.field3&&f.push({name:h.field3,type:"esriFieldTypeString"})),h.field&&n.push(h.field),h.field2&&n.push(h.field2),h.field3&&n.push(h.field3)));f&&(c.layerDefinition.fields=f,l.layerDefinition.fields=f,b.layerDefinition.fields=f,k.layerDefinition.fields=f);for(var f=e&&e.length,g,q=0;q<f;q++){var p=
e[q]||e.getItemAt(q);if(!1!==p.visible&&p.geometry&&(g=p.toJSON(),g.hasOwnProperty("popupTemplate")&&delete g.popupTemplate,g.geometry&&g.geometry.z&&delete g.geometry.z,!g.symbol||!g.symbol.outline||"esriCLS"!==g.symbol.outline.type||this._is11xService)){g.symbol&&g.symbol.outline&&g.symbol.outline.color&&g.symbol.outline.color[3]&&!this._is11xService&&(g.symbol.outline.color[3]=255);if(a&&a.renderer&&!g.symbol&&(m.isFunction(a.renderer.field)||a.renderer.compiledFunc||a.renderer.hasVisualVariables()||
a.renderer)){var h=a.renderer,u=h.getSymbol(p);if(!u)continue;g.symbol=u.toJSON();h.hasVisualVariables()&&t.applyVisualVariables(g.symbol,{renderer:h,graphic:p,symbol:u})}g.symbol&&(g.symbol.angle||delete g.symbol.angle,g.symbol.path?g.symbol=this._convertSvgToPictureMarkerSymbolJson(g.symbol):g.symbol.text&&delete g.attributes);if(a&&a.renderer&&"simple"===a.renderer.type)delete g.attributes;else if(n.length){var r={};n.forEach(function(a){g.attributes&&g.attributes.hasOwnProperty(a)&&(r[a]=g.attributes[a])});
g.attributes=r}"polygon"===p.geometry.type?c.featureSet.features.push(g):"polyline"===p.geometry.type?l.featureSet.features.push(g):"point"===p.geometry.type?g.symbol&&g.symbol.text?d.featureSet.features.push(g):b.featureSet.features.push(g):"multipoint"===p.geometry.type?k.featureSet.features.push(g):"extent"===p.geometry.type&&(g.geometry=D.fromExtent(p.geometry).toJSON(),c.featureSet.features.push(g))}}a=[c,l,k,b,d].filter(function(a){return 0<a.featureSet.features.length});a.forEach(function(a){a.featureSet.features.every(function(a){return a.symbol})&&
(a.featureSet.features.forEach(function(a){delete a.attributes}),delete a.layerDefinition.drawingInfo);a.layerDefinition.drawingInfo&&a.layerDefinition.drawingInfo.renderer&&this._convertSvgRenderer(a.layerDefinition.drawingInfo.renderer)},this);return{featureCollection:{layers:a}}},_convertSvgToPictureMarkerSymbolJson:function(a){this._canvasParent||(this._canvasParent=F.create("div"),this._canvasSurface=y.createSurface(this._canvasParent,200,200));var e=this._canvasSurface.createObject(y.Path,a.path).setFill(a.color).setStroke(a.outline);
"pendingRender"in this._canvasSurface&&this._canvasSurface._render(!0);var c=this._canvasSurface.rawNode.getContext("2d"),e=e.getBoundingBox(),l=Math.ceil(e.width+e.x),b=Math.ceil(e.height+e.y),k=c.getImageData(e.x,e.y,l,b);c.canvas.width=l;c.canvas.height=b;c.putImageData(k,0,0);return{type:"esriPMS",imageData:c.canvas.toDataURL("image/png").substr(22),angle:-a.angle,contentType:"image/png",height:a.size?a.size:b-e.y,width:a.size?a.size:l-e.x,xoffset:a.xoffset,yoffset:a.yoffset}},_convertSvgRenderer:function(a){var e=
a.type;if("simple"===e&&w(a.symbol))a.symbol=this._convertSvgToPictureMarkerSymbolJson(a.symbol);else if("unique-value"===e||"class-breaks"===e)e=a["unique-value"===e?"uniqueValueInfos":"classBreakInfos"],w(a.defaultSymbol)&&(a.defaultSymbol=this._convertSvgToPictureMarkerSymbolJson(a.defaultSymbol)),e&&e.forEach(function(a){w(a)&&(a.symbol=this._convertSvgToPictureMarkerSymbolJson(a.symbol))},this)},_getPrintDefinition:function(a,e){var c=a.view,l=c.map,b=c.spatialReference,k={operationalLayers:this._createOperationalLayers(c,
e)};a=this._vtlExtent||a.extent||c.extent;b&&b.isWrappable&&(a=a.clone()._normalize(!0),b=a.spatialReference);k.mapOptions={extent:a&&a.toJSON(),spatialReference:b&&b.toJSON(),showAttribution:e.attributionVisible};this._vtlExtent=null;c.rotation&&(k.mapOptions.rotation=-c.rotation);e.preserveScale&&(k.mapOptions.scale=e.outScale||c.scale);l.timeExtent&&(k.mapOptions.time=[l.timeExtent.startTime.getTime(),l.timeExtent.endTime.getTime()]);return k},_handleExecuteResponse:function(a){return"sync"===
this.mode?a.results&&a.results[0]&&a.results[0].value:this._geoprocessor.getResultData(a.jobId,"Output_File").then(function(a){return a.value})},_setPrintParams:function(a){var e=a.template||new H;null==e.showLabels&&(e.showLabels=!0);var c=e.exportOptions,l;if(c){l={dpi:c.dpi};var b=J.toJSON(e.layout);if("map_only"===b.toLowerCase()||""===b)l.outputSize=[c.width,c.height]}var c=e.layoutOptions,k;if(c){var d,h;if("Miles"===c.scalebarUnit||"Kilometers"===c.scalebarUnit)d="Kilometers",h="Miles";else if("Meters"===
c.scalebarUnit||"Feet"===c.scalebarUnit)d="Meters",h="Feet";k={titleText:c.titleText,authorText:c.authorText,copyrightText:c.copyrightText,customTextElements:c.customTextElements,scaleBarOptions:{metricUnit:A.toJSON(d),metricLabel:z[d],nonMetricUnit:A.toJSON(h),nonMetricLabel:z[h]}}}d=null;c&&c.legendLayers&&(d=c.legendLayers.map(function(a){this._legendLayerNameMap[a.layerId]=a.title;var b={id:a.layerId};a.subLayerIds&&(b.subLayerIds=a.subLayerIds);return b},this));c=this._getPrintDefinition(a,e);
a.outSpatialReference&&(c.mapOptions.spatialReference=a.outSpatialReference.toJSON());m.mixin(c,{exportOptions:l,layoutOptions:k});m.mixin(c.layoutOptions,{legendOptions:{operationalLayers:null!=d?d:this._legendLayers}});e={Web_Map_as_JSON:JSON.stringify(c),Format:e.format,Layout_Template:b};a.extraParameters&&m.mixin(e,a.extraParameters);return e}})});