返回介绍

插值

发布于 2022-11-30 23:36:04 字数 5529 浏览 0 评论 0 收藏 0

本示例演示数据插值

本示例演示使用栅格 DEM(数字高程模型)数据的数据重采样。 interpolate: false 参数的设置,用于在重投影和渲染过程中,禁止数据插值。 高程数据是根据 forEachLayerAtPixel 返回的像素值计算的。 对比之下,在启动插值的第二个地图中很明显,在接近 3107 米的地方返回了不准确的高程数据。 这是因为高程数据是由像素值计算方式导致的。

main.js

import 'ol/ol.css';
import Map from 'ol/Map';
import TileLayer from 'ol/layer/Tile';
import View from 'ol/View';
import XYZ from 'ol/source/XYZ';

const key = 'Get your own API key at https://www.maptiler.com/cloud/';
const attributions =
  '<a href="https://www.maptiler.com/copyright/" target="_blank">&copy; MapTiler</a> ' +
  '<a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>';

const notInterpolated = new TileLayer({
  // specify className so forEachLayerAtPixel can distinguish layers
  className: 'ol-layer-dem',
  source: new XYZ({
    attributions: attributions,
    url:
      'https://api.maptiler.com/tiles/terrain-rgb/{z}/{x}/{y}.png?key=' + key,
    tileSize: 512,
    maxZoom: 12,
    crossOrigin: '',
    interpolate: false,
  }),
});

const interpolated = new TileLayer({
  source: new XYZ({
    attributions: attributions,
    url:
      'https://api.maptiler.com/tiles/terrain-rgb/{z}/{x}/{y}.png?key=' + key,
    tileSize: 512,
    maxZoom: 12,
    crossOrigin: '',
  }),
});

const view = new View({
  center: [6.893, 45.8295],
  zoom: 16,
  projection: 'EPSG:4326',
});

const map1 = new Map({
  target: 'map1',
  layers: [notInterpolated],
  view: view,
});

const map2 = new Map({
  target: 'map2',
  layers: [interpolated],
  view: view,
});

const info1 = document.getElementById('info1');
const info2 = document.getElementById('info2');

const showElevations = function (evt) {
  if (evt.dragging) {
    return;
  }
  map1.forEachLayerAtPixel(
    evt.pixel,
    function (layer, pixel) {
      const height =
        -10000 + (pixel[0] * 256 * 256 + pixel[1] * 256 + pixel[2]) * 0.1;
      info1.innerText = height.toFixed(1);
    },
    {
      layerFilter: function (layer) {
        return layer === notInterpolated;
      },
    }
  );
  map2.forEachLayerAtPixel(
    evt.pixel,
    function (layer, pixel) {
      const height =
        -10000 + (pixel[0] * 256 * 256 + pixel[1] * 256 + pixel[2]) * 0.1;
      info2.innerText = height.toFixed(1);
    },
    {
      layerFilter: function (layer) {
        return layer === interpolated;
      },
    }
  );
};

map1.on('pointermove', showElevations);
map2.on('pointermove', showElevations);

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Interpolation</title>
    <!-- Pointer events polyfill for old browsers, see https://caniuse.com/#feat=pointer -->
    <script src="https://unpkg.com/elm-pep"></script>
    <!-- The lines below are only needed for old environments like Internet Explorer and Android 4.x -->
    <script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,TextDecoder"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/core-js/3.18.3/minified.js"></script>
    <style>
      .map {
        width: 100%;
        height:400px;
      }
      @media (min-width: 800px) {
        .wrapper {
          display: flex;
        }
        .half {
          padding: 0 10px;
          width: 50%;
          float: left;
        }
      }
      #opacity {
        display: inline-block;
        width: 150px;
        vertical-align: text-bottom;
      }
    </style>
  </head>
  <body>
    <div class="wrapper">
      <div class="half">
        <h4>Not Interpolated</h4>
        <div id="map1" class="map"></div>
        <div>
          <label>
            Elevation
            <span id="info1">0.0</span> meters
          </label>
        </div>
      </div>
      <div class="half">
        <h4>Interpolated</h4>
        <div id="map2" class="map"></div>
        <div>
          <label>
            Elevation
            <span id="info2">0.0</span> meters
          </label>
        </div>
      </div>
    </div>
    <script src="main.js"></script>
  </body>
</html>

package.json

{
  "name": "interpolation",
  "dependencies": {
    "ol": "7.1.0"
  },
  "devDependencies": {
    "parcel": "^2.0.0"
  },
  "scripts": {
    "start": "parcel index.html",
    "build": "parcel build --public-url . index.html"
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文