core/analysis/Buffer.js

import { point, buffer, lineString, polygon } from '@turf/turf'
import { transformCartesianToWGS84 } from '../../utils/Coordinate'
/**
 * 缓冲区分析主类
 * @class
 */
class Buffer {
  /**
   * 构造函数
   */
  constructor() {}
  /**
   * 点缓冲区(笛卡尔坐标带你)
   * @param {Cartesian3} position 待计算缓冲区点,笛卡尔坐标
   * @param {Number} radius 缓冲区半径,单位:米(m)
   * @returns {Array<Number[]>} 缓冲区点集,如[[120,23],[121,23],....,[120,23]]
   */
  point(position, radius) {
    const pos = transformCartesianToWGS84(position)
    return this.pointDegrees([pos.x, pos.y], radius)
  }
  /**
   * 点缓冲区(经纬度点)
   * @param {Array<Number>} position 待计算缓冲区点,WGS84坐标,如:[120,23]
   * @param {Number} radius 缓冲区半径,单位:米(m)
   * @returns {Array<Number[]>} 缓冲区点集,如[[120,23],[121,23],....,[120,23]]
   */
  pointDegrees(position, radius) {
    let pointF = point(position)
    let buffered = buffer(pointF, radius, { units: 'meters', steps: 24 })
    let coordinates = buffered.geometry.coordinates
    let points = coordinates[0]
    return points
  }
  /**
   * 线缓冲区(笛卡尔坐标)
   * @param {Array<Cartesian3>} positions 待计算线的节点集合,笛卡尔坐标
   * @param {Number} distance 缓冲区距离,单位:米(m)
   * @returns {Array<Number[]>} 缓冲区点集,如[[120,23],[121,23],....,[120,23]]
   */
  polyline(positions, distance) {
    const points = positions.map((pos) => {
      const degree = transformCartesianToWGS84(pos)
      return [degree.x, degree.y]
    })
    return this.polylineDegreesArray(points, distance)
  }
  /**
   * 线缓冲区(WGS84坐标)
   * @param {Array<Number[]>} positions 待计算线的节点集合,WGS84坐标,如:[[120,23],[123,23]]
   * @param {Number} distance 缓冲区距离,单位:米(m)
   * @returns {Array<Number[]>} 缓冲区点集,如[[120,23],[121,23],....,[120,23]]
   */
  polylineDegreesArray(positions, distance) {
    let polylineF = lineString(positions)
    let buffered = buffer(polylineF, distance, { units: 'meters' })
    let coordinates = buffered.geometry.coordinates
    const points = coordinates[0]
    return points
  }
  /**
   * 面缓冲区(笛卡尔坐标)
   * @param {Array<Cartesian3>} positions 待计算面的节点集合,笛卡尔坐标
   * @param {Number} distance 缓冲区距离,单位:米(m)
   * @returns {Array<Number[]>} 缓冲区点集,如[[120,23],[121,23],....,[120,23]]
   */
  polygon(positions, distance) {
    const points = positions.map((pos) => {
      const degree = transformCartesianToWGS84(pos)
      return [degree.x, degree.y]
    })
    return this.polygonDegreesArray(points, distance)
  }
  /**
   * 面缓冲区(WGS84坐标)
   * @param {Array<Number[]>} positions 待计算线的节点集合,WGS84坐标,如:[[120,23],[123,23],[123,21],[120,21],[120,23]]
   * @param {Number} distance 缓冲区距离,单位:米(m)
   * @returns {Array<Number[]>} 缓冲区点集,如[[120,23],[121,23],....,[120,23]]
   */
  polygonDegreesArray(positions, distance) {
    let polygonF = polygon([positions])
    let buffered = buffer(polygonF, distance, { units: 'meters' })
    let coordinates = buffered.geometry.coordinates
    const points = coordinates[0]
    return points
  }
}
export default Buffer