tools/mapTools.js

const turf = require('../tools/turf');

// import * as turf from '../tools/turf';

/**
 * 计算球面两点距离的方法([经度1,纬度1],[经度2,纬度2])
 * @param start
 * @param end
 * return {Number} 米
 */
function getGreatCircleDistance(start, end) {

    let from = turf.point(start);
    let to = turf.point(end);
    let options = {steps: 10, units: 'kilometers'};
    return 1000 * turf.distance(from, to, options);

}

/**
 *@计算球面几何图形的面积
 * [[[125, -15], [113, -22], [154, -27], [144, -15], [125, -15]]
 *@author lc
 *@date 2018-04-13 15:38:15
 */
function getArea(coords) {

    let polygon = turf.polygon(coords);

    return turf.area(polygon);

}

/**
 * 将地球球面上的两个坐标转化为一个二维向量
 * @param startPoint
 * @param endPoint
 * @returns {Array}
 */
function coordinateToVector(startPoint, endPoint) {

    let distanceX = getGreatCircleDistance(startPoint, [endPoint[0], startPoint[1]]);    //获取起止点的经线方向的距离
    let distanceY = getGreatCircleDistance(startPoint, [startPoint[0], endPoint[1]]);    //获取起止点的纬线方向的距离

    if (endPoint[1] >= startPoint[1]) {

        distanceY = -distanceY;

    }
    if (endPoint[0] >= startPoint[0]) {

        distanceX = -distanceX;

    }
    return [distanceX, distanceY];

}

/**
 * 根据指定半径查询周边数据
 * @param center
 * @param radius
 * @param geojson
 */
function doQuerys(center, radius, geojson) {

    //查询的圆形范围
    let circle = turf.circle(center, radius, 50, 'kilometers');
    let searchWithin = turf.featureCollection([
        circle
    ]);
    //做相交运算得到结果
    return turf.within(geojson, searchWithin);

}

/**
 * 数组中每相邻两个数之间插入n个数
 * @param arr
 * @param num
 * @returns {Array}
 */
function insertInArray(arr, num) {

    let tem = [];
    for (let i = 0; i < arr.length - 1; i++) {

        for (let j = 0; j < num; j++) {

            tem.push([arr[i][0] + j / num * (arr[i + 1][0] - arr[i][0]), arr[i][1] + j / num * (arr[i + 1][1] - arr[i][1])]);

        }

    }
    return tem;

}

/**
 * 返回指定范围内的数
 * @param low
 * @param high
 * @returns {*}
 */
function randomRange(low, high) {

    return Math.random() * (high - low) + low;

}

export {
    doQuerys,
    coordinateToVector,
    insertInArray,
    randomRange,
    getGreatCircleDistance,
    getArea
};