openlayers瓦片的使用

        OpenLayers是一个用于WebGIS客户端的地图开发库,支持多种地图。在使用瓦片时,先将自己需要的瓦片下载,下载好的瓦片会分层,越高的层级瓦片的数量余额多。

        使用时可以引入 ol.js 文件,和 ol.css 文件,或者使用  npm install ol  命令下载。

openlayers官网:https://openlayers.org/

文件下载:https://openlayers.org/download/

一,百度地图

        创建一个放地图的容器,顺便看一下大小。

  var resolutions = [];
  var maxZoom = 18;
  // 重新计算百度使用的分辨率
  for (var i = 0; i <= maxZoom; i++) {
    resolutions[i] = Math.pow(2, maxZoom - i);
  }
  // 设置分辨率
  var tilegrid = new ol.tilegrid.TileGrid({
    origin: [0, 0],
    resolutions: resolutions, 
  });
  // 创建百度地图的数据源
  var baiduSource = new ol.source.TileImage({
    projection: "EPSG:3857",
    tileGrid: tilegrid,
    // 对瓦片的请求路径进行处理
    tileUrlFunction: function (tileCoord, pixelRatio, proj) {
      console.log(tileCoord);
      var z = tileCoord[0];
      var x = tileCoord[1];
      var y = tileCoord[2];
      if (x < 0) {
        x = -x;
      }
      if (y < 0) {
        y = -y;
      }
      return "map/" + z + "/" + x + "/" + y + ".png";
    },
  }); 
  // 百度地图层
  var baiduMapLayer2 = new ol.layer.Tile({ source: baiduSource });
  // 创建地图
  var map = new ol.Map({
    layers: [baiduMapLayer2],
    view: new ol.View({
      // 经纬度设置中心点
      center: ol.proj.transform(
        [123.405161, 41.791039],
        "EPSG:4326",
        "EPSG:3857"
      ),
      zoom: 14,
    }),
    target: "olMap",
  });

        百度地图的瓦片排列规则是坐标原点在左下角,x轴从左往右增加,y轴从下往上增加。和下载好的瓦片一样。

openlayers瓦片的使用_第1张图片

         第三层下的

openlayers瓦片的使用_第2张图片

 openlayers瓦片的使用_第3张图片openlayers瓦片的使用_第4张图片

         加载这类瓦片需要对  TileGrid  进行调整,百度地图的瓦片就是这类瓦片。

         ol.source.TileImage 加载数据源,提供切分切片的图片数据。

        有一个小问题,百度地图不能使用 ol.source.XYZ ,希望知道的大佬可以告知一下。使用ol.source.XYZ  会显示成这样:

openlayers瓦片的使用_第5张图片

        tileCoord 可以确定加载哪个瓦片。输出后

openlayers瓦片的使用_第6张图片

         第一位是加载的层级,第二位是x轴,第三位是y轴。

        zoom  设置初始化时显示的是哪层的瓦片。

        minZoom  设置显示最小层数,例如设置为 9 ,到第九层时无法再缩小。

        在网上可以下载瓦片的工具有很多,下载的瓦片的名称有些也不一样,下载好的百度地图的样式是这样的。

openlayers瓦片的使用_第7张图片

 openlayers瓦片的使用_第8张图片

 openlayers瓦片的使用_第9张图片

         之后又下载了高德地图的瓦片,是这样的

openlayers瓦片的使用_第10张图片

 

 openlayers瓦片的使用_第11张图片

 openlayers瓦片的使用_第12张图片

         所以在拼接路径的时候要根据下载瓦片的格式进行拼接。

二,高德地图

var map = new ol.Map({
    layers: [
      new ol.layer.Tile({
        // 使用xyz来定位一张瓦片,XY相当于横纵坐标,Z表示图层层级
        source: new ol.source.XYZ({
          url: "teils/" + "L{z}/R{y}/C{x}" + ".png",
          tileUrlFunction: function (tileCoord, pixelRatio, projection) {
            console.log(tileCoord); // [9, 366, -215]
            if (!tileCoord) {
              return undefined;
            } else {
              var z = tileCoord[0];
              if (z < 10) {
                z = "0" + z;
              }
              var tempX = "00000000" + tileCoord[1].toString(16).toUpperCase();
              var tempY =
                "00000000" + (-tileCoord[2] - 1).toString(16).toUpperCase();

              console.log(tempX, tempY);

              //   要加载瓦片的存放地址
              console.log(
                this.getUrls()[0]
                  .replace("{x}", tempX.substring(tempX.length - 8))
                  .replace("{y}", tempY.substring(tempY.length - 8))
                  .replace("{z}", z)
              );

              return this.getUrls()[0]
                .replace("{x}", tempX.substring(tempX.length - 8))
                .replace("{y}", tempY.substring(tempY.length - 8))
                .replace("{z}", z);
            }
          },
          projection: ol.proj.get("EPSG:3857"),
        }),
      }),
    ],
    target: "olMap",
    view: new ol.View({
      projection: "EPSG:3857",
      center: ol.proj.transform(
        [123.405161, 41.791039],
        "EPSG:4326",
        "EPSG:3857"
      ),
      zoom: 10, 
      minZoom: 3,
    }),
  });
  let pointLayer = new ol.layer.Vector({
    source: new ol.source.Vector({
      features: [],
    }),
  });

        tileCoord 输出

openlayers瓦片的使用_第13张图片

         要根据图片的下载方式去设置加载瓦片的地址。

        

你可能感兴趣的:(前端)