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