Source: ext/tool/index.js

import { EasyMap } from "../../easyMap";
import * as maptalks from "../../libs/maptalks";
import Geom from "../geom/index";
import proj4 from "proj4";
class Tool {
    /**
     * tool类
     * @constructor
     * @class Tool
     */
    constructor() {}

    /**
     * 获取当前地图范围
     * @param {object} - 必传,地图的map对象
     * @return {Array} - [xmin, ymin, xmax, ymax]左下角及右上角坐标
     * @memberof Tool
     */
    getCurrentExtent(map) {
        if (map && map instanceof EasyMap) {
            var extent = map.map.getExtent();
            return [extent.xmin, extent.ymin, extent.xmax, extent.ymax];
        }
    }
    /**
     *  查找指定位置
     *
     * @param {Geom} geometry 覆盖物对象
     * @return {Array} 覆盖物的地理中心坐标[x,y]
     * @memberof Tool
     */
    forEachFeatureAtPixel(geometry) {
        if (geometry && geometry instanceof Geom) {
            return geometry.getCenter();
        }
    }

    /**
     *获取覆盖物的屏幕坐标
     *
     * @param {map} map 覆盖物所在的地图对象
     * @param {Geom} geometry 覆盖物对象
     * @return {Array} 覆盖物相对于地图容器左上角点的像素中心坐标[x,y]
     * @memberof Tool
     */
    getCenterofPixel(map, geometry) {
        if (geometry && geometry instanceof Geom && map) {
            let coordinate =
                geometry.type === "HtmlPoint"
                    ? geometry._geometry.getCoordinates()
                    : geometry._geometry.getCenter();
            let point = map.map.coordinateToContainerPoint(coordinate);
            return [point.x, point.y];
        }
    }

    /**
     *将点坐标的坐标系转换,proj4.js中预定义了三个坐标系('EPSG:4326','EPSG:4269','EPSG:3857'),其他的坐标系则需要自己定义
     *
     * @param {*} fromProjection 源坐标系
     * @param {*} toProjection 目标坐标系
     * @param {*} coordinate 需要转换的坐标值,可以是对象{x:x,y:y},也可以是数组[x,y]
     * @return {*} 转换后的坐标
     * @memberof Tool
     */
    transform(fromProjection, toProjection, coordinate) {
        var transformPoint = proj4(fromProjection, toProjection, coordinate);
        return transformPoint;
    }

    /**
     *定位到覆盖物
     *
     * @param {*} map 覆盖物所在的地图对象
     * @param {*} geometry 覆盖物对象
     * @param {*} options 移动动画的配置项
     * @memberof Tool
     */
    locateFeature(map, geometry, options) {
        let point = geometry.getCenter();
        map.map.panTo(point, options);
    }

    /**
     *将一个或多个GeoJSON对象转换为几何
     *
     * @param {String | Object | Array.<Object>} json GeoJSON对象或GeoJSON字符串
     * @param {function} foreachFn 每个几何的回调函数
     * @return {Array} 生成的几何数组
     * @memberof Tool
     */
    createFeatureFromGeoJson(json, foreachFn) {
        if (json) {
            let arr = maptalks.GeoJSON.toGeometry(
                json,
                foreachFn
                    ? (geometry) => {
                          let g = new Geom(geometry, geometry.type);
                          foreachFn(g);
                      }
                    : ""
            );
            if (Array.isArray(arr)) {
                return arr.map((geometry) => {
                    return new Geom(geometry, geometry.type);
                });
            } else {
                return new Geom(arr, arr.type);
            }
        }
    }

    /**
     *将几何导出为GeoJSON
     *
     * @param {Object} geometry 几何实例
     * @return {Object} 几何的GeoJSON
     * @memberof Tool
     */
    loadGeoJsonFromFeature(geometry) {
        try {
            return geometry._geometry.toGeoJSON();
        } catch (error) {
            return null;
        }
    }
}
export default Tool;