类名 view/utils/support/utils.js
import * as L from '@mapgis/leaflet'
import { Projection } from '@mapgis/webclient-common'

/**
 * 获取地图范围,仅在4326相关坐标系下生效,其他坐标系在地图视图的坐标系中设置了范围
 * @param {Object} layer 基础图层对象
 * @return {Object} leaflet的范围对象
 * */
function getBounds(layer) {
  let bounds = undefined
  if (
    String(layer.spatialReference.wkid) === '4326' ||
    String(layer.spatialReference.wkid) === '4214' ||
    String(layer.spatialReference.wkid) === '4490' ||
    String(layer.spatialReference.wkid) === '4610'
  ) {
    const corner1 = L.latLng(layer.extent.ymin, layer.extent.xmin)
    const corner2 = L.latLng(layer.extent.ymax, layer.extent.xmax)
    bounds = L.latLngBounds(corner1, corner2)
  } else if (
    String(layer.spatialReference.wkid) === '3857' ||
    String(layer.spatialReference.wkid) === '900913'
  ) {
    const point1 = Projection.projectMercatorToLonLat({
      x: layer.extent.xmin,
      y: layer.extent.ymin
    })
    const corner1 = L.latLng(point1.latitude, point1.longitude)
    const point2 = Projection.projectMercatorToLonLat({
      x: layer.extent.xmax,
      y: layer.extent.ymax
    })
    const corner2 = L.latLng(point2.latitude, point2.longitude)
    bounds = L.latLngBounds(corner1, corner2)
  } else {
    const projPoints = Projection.projectToGeographyPoints({
      points: [
        [layer.extent.xmin, layer.extent.ymin],
        [layer.extent.xmax, layer.extent.ymax]
      ],
      wkid: layer.spatialReference.wkid,
      proj4Defs: layer.spatialReference.wkt
    })
    const corner1 = L.latLng(projPoints[0][1], projPoints[0][0])
    const corner2 = L.latLng(projPoints[1][1], projPoints[1][0])
    bounds = L.latLngBounds(corner1, corner2)
  }
  return bounds
}

/**
 * @description: 获取旋转后地图容器像素坐标系bounds
 * @param {*} leafletMap
 * @return {*}
 */
function getMapRotateBounds(leafletMap) {
  const bounds = leafletMap.getBounds()
  const nw = bounds.getNorthWest()
  const se = bounds.getSouthEast()
  const sw = bounds.getSouthWest()
  const ne = bounds.getNorthEast()
  const nwPoint = leafletMap.latLngToLayerPoint(nw)
  const sePoint = leafletMap.latLngToLayerPoint(se)
  const swPoint = leafletMap.latLngToLayerPoint(sw)
  const nePoint = leafletMap.latLngToLayerPoint(ne)
  // 计算旋转坐标
  const pxBounds = L.bounds(nwPoint, sePoint)
  pxBounds.extend(swPoint)
  pxBounds.extend(nePoint)

  // 计算屏幕坐标
  const size = leafletMap.getSize()
  const leftTop = leafletMap.containerPointToLayerPoint([0, 0])
  const rightBottom = leafletMap.containerPointToLayerPoint([size.x, size.y])

  const screenBounds = L.bounds(leftTop, rightBottom)
  pxBounds.extend(screenBounds.getBottomLeft())
  pxBounds.extend(screenBounds.getTopRight())
  return pxBounds
}

export { getBounds, getMapRotateBounds }
构造函数
成员变量
方法
事件