You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:36:25