基于Leaflet与Esri-Leaflet:如何获取范围、比例尺发送至打印服务器或拦截请求结果?
用Esri-Leaflet对接私有ArcGIS打印服务器生成PDF的实践方案
我刚好处理过类似的需求,给你梳理下具体的实现思路和步骤,核心就是搞定打印请求需要的extent、spatialReference、scale这几个关键参数,以及如何利用Esri-Leaflet的内置事件来获取这些信息:
一、核心参数的获取逻辑
你提到地图变更时会触发export请求,其实Esri-Leaflet的图层对象会在加载/刷新时暴露这些请求的响应信息,我们不需要手动计算参数,直接监听图层事件就能拿到。
二、具体实现步骤
1. 监听图层事件提取地图参数
不管是动态图层还是切片图层,都可以通过监听load事件来获取当前地图的空间参考、范围和比例尺:
// 初始化Esri动态图层 const esriLayer = L.esri.dynamicMapLayer({ url: '你的私有ArcGIS地图服务URL' }).addTo(map); // 监听图层加载完成事件 esriLayer.on('load', (evt) => { // 获取服务对应的空间参考 const spatialReference = evt.layer.options.spatialReference; // 把Leaflet的Bounds转换成ArcGIS格式的Extent const mapBounds = map.getBounds(); const arcgisExtent = { xmin: mapBounds.getWest(), ymin: mapBounds.getSouth(), xmax: mapBounds.getEast(), ymax: mapBounds.getNorth(), spatialReference: spatialReference }; // 获取当前地图的比例尺 const scale = map.getScale(); // 到这里三个核心参数就都拿到了 console.log('Extent参数:', arcgisExtent); console.log('空间参考:', spatialReference); console.log('比例尺:', scale); });
这里要注意:Leaflet默认用WGS84(EPSG:4326)坐标,但Esri-Leaflet会自动帮我们做坐标转换,所以spatialReference会直接返回服务对应的空间参考信息,不用自己处理转换。
2. 构建打印服务的请求参数
拿到参数后,按照ArcGIS打印服务的要求构造Web_Map_as_JSON参数,这是打印请求的核心:
// 构造打印请求的核心JSON const webMapJson = JSON.stringify({ mapOptions: { extent: arcgisExtent, spatialReference: spatialReference, scale: scale }, operationalLayers: [ { url: '你的私有ArcGIS地图服务URL', visibility: true } ], // 配置输出和布局选项,根据你的打印服务模板调整 exportOptions: { outputSize: [1024, 768] }, layoutOptions: { titleText: '自定义地图标题', authorText: '你的名称' } }); // 整理完整的请求参数 const printParams = { Web_Map_as_JSON: webMapJson, Format: 'PDF', Layout_Template: 'A4 Portrait' // 必须和打印服务中配置的模板名称一致 };
3. 发送请求并获取PDF文件
用fetch发送POST请求到打印服务的执行接口,处理响应拿到PDF的下载链接:
fetch('你的ArcGIS打印服务执行URL', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams(printParams) }) .then(res => res.json()) .then(data => { if (data.status === 'success') { // 从响应中提取PDF的下载地址 const pdfUrl = data.results[0].value.url; // 可以直接打开新窗口下载,或者创建下载按钮 window.open(pdfUrl); } else { console.error('打印请求失败:', data.error); } }) .catch(err => console.error('请求出错:', err));
三、几个关键注意点
- 空间参考一致性:确保打印请求的
spatialReference和地图服务的空间参考完全一致,否则会出现地图偏移的问题。 - 打印模板匹配:
Layout_Template参数必须和你的ArcGIS打印服务中预先配置的模板名称完全匹配,比如你的模板叫Letter Landscape,就不能写错。 - 权限验证:如果是私有服务器,记得在请求参数里加上
token(如果需要的话),否则会返回权限错误。
内容的提问来源于stack exchange,提问作者ScottG
相关产品推荐
相关产品推荐

