JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for W ...

打印 上一主题 下一主题

主题 1729|帖子 1729|积分 5187

 获取wms服务元数据信息并在三维webgl客户端举行叠加显示
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>WMS图层叠加</title>
  7.     <link href="./SuperMap3D/Widgets/widgets.css" rel="stylesheet" />
  8.     <style>
  9.         html, body, #cesiumContainer {
  10.             width: 100%;
  11.             height: 100%;
  12.             margin: 0;
  13.             padding: 0;
  14.             overflow: hidden;
  15.         }
  16.         #layerControl {
  17.             position: absolute;
  18.             top: 10px;
  19.             right: 10px;
  20.             background: white;
  21.             padding: 10px;
  22.             border-radius: 5px;
  23.             z-index: 999;
  24.             max-height: 80vh;
  25.             overflow-y: auto;
  26.         }
  27.     </style>
  28.     <script src="jquery1.9.0.min.js"></script>
  29.     <script type="text/javascript" src="./SuperMap3D/SuperMap3D.js"></script>
  30. </head>
  31. <body>
  32.     <div id="cesiumContainer"></div>
  33.     <div id="layerControl">
  34.         <h3>WMS图层控制</h3>
  35.         <div>
  36.             <label>WMS服务地址:</label>
  37.             <input type="text" id="wmsUrl" value="你的wms服务地址" style="width: 300px;">
  38.             <button id="loadBtn">加载服务</button>
  39.         </div>
  40.         <div id="layerList"></div>
  41.     </div>
  42.     <script>
  43.         // 初始化三维球
  44.         const viewer = new SuperMap3D.Viewer('cesiumContainer', {
  45.             imageryProvider: new SuperMap3D.ArcGisMapServerImageryProvider({
  46.                 url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
  47.             }),
  48.             baseLayerPicker: false,
  49.             timeline: false,
  50.             animation: false
  51.         });
  52.         // 存储当前加载的WMS图层
  53.         const wmsLayers = {};
  54.         // 获取WMS能力文档
  55.         async function getWmsCapabilities(url) {
  56.             const requestUrl = url.includes('?')
  57.                 ? `${url}&request=GetCapabilities&service=WMS`
  58.                 : `${url}?request=GetCapabilities&service=WMS`;
  59.             
  60.             try {
  61.                 const response = await fetch(requestUrl);
  62.                 if (!response.ok) {
  63.                     throw new Error(`HTTP错误: ${response.status}`);
  64.                 }
  65.                 const text = await response.text();
  66.                 const parser = new DOMParser();
  67.                 return parser.parseFromString(text, 'text/xml');
  68.             } catch (error) {
  69.                 console.error('获取WMS能力文档失败:', error);
  70.                 throw error;
  71.             }
  72.         }
  73.         // 解析WMS能力文档并显示图层列表
  74.         async function loadWmsService() {
  75.             const wmsUrl = document.getElementById('wmsUrl').value.trim();
  76.             if (!wmsUrl) {
  77.                 alert('请输入WMS服务地址');
  78.                 return;
  79.             }
  80.             try {
  81.                 const xmlDoc = await getWmsCapabilities(wmsUrl);
  82.                 const layers = xmlDoc.querySelectorAll('Layer > Layer');
  83.                
  84.                 const layerListDiv = document.getElementById('layerList');
  85.                 layerListDiv.innerHTML = '<h4>可用图层:</h4>';
  86.                
  87.                 layers.forEach(layer => {
  88.                     const name = layer.querySelector('Name')?.textContent;
  89.                     const title = layer.querySelector('Title')?.textContent || name;
  90.                     
  91.                     if (name) {
  92.                         const layerDiv = document.createElement('div');
  93.                         layerDiv.style.margin = '5px 0';
  94.                         
  95.                         const checkbox = document.createElement('input');
  96.                         checkbox.type = 'checkbox';
  97.                         checkbox.id = `layer-${name}`;
  98.                         checkbox.dataset.name = name;
  99.                         
  100.                         checkbox.addEventListener('change', (e) => {
  101.                             toggleWmsLayer(wmsUrl, name, e.target.checked);
  102.                         });
  103.                         
  104.                         const label = document.createElement('label');
  105.                         label.htmlFor = `layer-${name}`;
  106.                         label.textContent = title;
  107.                         
  108.                         layerDiv.appendChild(checkbox);
  109.                         layerDiv.appendChild(label);
  110.                         layerListDiv.appendChild(layerDiv);
  111.                     }
  112.                 });
  113.             } catch (error) {
  114.                 alert('加载WMS服务失败: ' + error.message);
  115.             }
  116.         }
  117.         // 切换WMS图层显示
  118.         function toggleWmsLayer(baseUrl, layerName, show) {
  119.             if (show) {
  120.                 // 如果图层已存在,先移除
  121.                 if (wmsLayers[layerName]) {
  122.                     viewer.imageryLayers.remove(wmsLayers[layerName]);
  123.                 }
  124.                
  125.                 // 创建新的WMS图层
  126.                 wmsLayers[layerName] = viewer.imageryLayers.addImageryProvider(
  127.                     new SuperMap3D.WebMapServiceImageryProvider({
  128.                         url: baseUrl,
  129.                         layers: layerName,
  130.                         parameters: {
  131.                             transparent: true,
  132.                             format: 'image/png'
  133.                         },
  134.                         credit: new SuperMap3D.Credit('WMS图层: ' + layerName)
  135.                     })
  136.                 );
  137.             } else {
  138.                 // 移除图层
  139.                 if (wmsLayers[layerName]) {
  140.                     viewer.imageryLayers.remove(wmsLayers[layerName]);
  141.                     delete wmsLayers[layerName];
  142.                 }
  143.             }
  144.         }
  145.         // 绑定加载按钮事件
  146.         document.getElementById('loadBtn').addEventListener('click', loadWmsService);
  147.     </script>
  148. </body>
  149. </html>
复制代码
效果图:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表