[英]How to get a screenshot of the ESRI Map - Angular
如何在 UI 上获取 Esri 地图当前状态的屏幕截图,并将其作为从 Angular 下载的 Pdf 格式? 以下代码是我当前的 .ts 代码,如果要添加其他部分,请告诉我。
esri-map.component.html
<!-- Map Div -->
<div #mapViewNode></div>
esri-map.component.ts
// Initialize MapView and return an instance of MapView
initializeMap(esriToken) {
const container = this.mapViewEl.nativeElement;
config.apiKey = esriToken;
const horizonData: any[] = this.esiriData || [];
//load the webMap
const webmap = new WebMap({
portalItem: {
id: this.webMapId
}
});
// load the ParcelAtlas feature layer
const layer = new FeatureLayer({
url: this.featureLayerUrl,
});
webmap.add(layer);
const view = new MapView({
container,
map: webmap,
zoom: 4,
center: [-97.63, 38.34],
});
//legend Icon
const legend = new Legend ({
view: view
});
const legendExpand = new Expand(
{
view,
content: legend,
expanded: false,
})
view.ui.add(legendExpand, "top-left");
const renderer = new SimpleRenderer({
symbol: new TextSymbol({
color: "red",
text: "\ue61d",
font: {
size: 30,
family: "CalciteWebCoreIcons"
}
})
});
const dataFeedLayer = new FeatureLayer({
source: horizonData.map((d,i)=>(
{
geometry: new Point({
longitude: d.longitude,
latitude: d.latitude
}),
attributes: {
ObjectID: i,
...d
}
}
)),
objectIdField: 'ObjectID',
geometryType: "point",
renderer: renderer,
});
webmap.add(dataFeedLayer);
let options = {
width: 2048,
height: 2048
};
view.takeScreenshot(options).then(function(screenshot) {
let imageElement = document.getElementById("screenshotImage");
imageElement.src = screenshot.dataUrl;
});
this.view = view;
return this.view.when();
}
错误:类型“HTMLElement”.ts(2339) 上不存在属性“src”
您遇到的问题是因为您没有图像节点,组件上没有screenshotImage
。
我不确定你想如何显示图像,所以我将使用我为你制作的这个例子。
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no"> <title>Screenshot Example</title> <style> html, body, #viewDiv { padding: 0; margin: 0; height: 100%; width: 100%; } #screenshotDiv { position: absolute; top: 0; right: 0; background-color: transparent; z-index: 1; display: flex; flex-direction: column; } .action-button { width: 200px; padding: 0.6em; border: 1px solid #0079c1; text-align: center; background-color: white; cursor: pointer; } .action-button:hover, .action-button:focus { background: #0079c1; color: white; } </style> <link rel="stylesheet" href="https://js.arcgis.com/4.18/esri/css/main.css"> <script src="https://js.arcgis.com/4.18/"></script> <script> require([ "esri/Map", "esri/views/MapView" ], function (Map, MapView) { const map = new Map({ basemap: "streets-navigation-vector" }); const view = new MapView({ container: "viewDiv", map: map, zoom: 12, center: { latitude: 32.7353, longitude: -117.1490 } }); const btn = document.getElementById("screenshotBtn"); const img = document.getElementById("screenshotImg"); view.when(function() { btn.addEventListener("click", function() { view.takeScreenshot({ width: 200, height: 200 }).then(function(screenshot) { img.src = screenshot.dataUrl; }); }); }); }); </script> </head> <body> <div id="viewDiv" class="esri-widget"> <div id="screenshotDiv"> <button id="screenshotBtn" class="action-button esri-widget"> Take Screenshot </button> <img id="screenshotImg"/> </div> </div> </body> </html>
我认为这种对 Angular 的翻译应该有效,
esri-map.component.html
<div #mapViewNode>
<div class="screenshotDiv">
<button class="action-button esri-widget" (click)="takeScreenshot()">
Take Screenshot
</button>
<img [src]="screenshotImgSrc"/>
</div>
</div>
esri-map.component.ts
takeScreenshot() {
const self = this;
this.view.takeScreenshot({
width: 200,
height: 200
}).then(function(screenshot) {
self.screenshotImgSrc = screenshot.dataUrl;
});
}
takeScreenshot
、 view
和screenshotImgSrc
需要是组件的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.