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;