import { booleanPointInPolygon, Feature, featureCollection, FeatureCollection, MultiPolygon, point } from "@turf/turf"; import ToolBase from "../../base/ToolBase"; import IPolygonDrawLayer from "../../IPolygonDrawLayer"; import IHPaaS from "../../../../../modules/hpaas-core/IHPaaS"; import IRender from "./IRender"; import PolygonRenderL7 from "./RenderL7"; import PolygonRenderDeckGL from "./RenderDeckGL"; import ToolsCenter from "../../ToolsCenter"; export interface mouseEventType { lnglat: { lng: number; lat: number; }; feature: Feature; } class PolygonSelector extends ToolBase { hpaas: IHPaaS; private render: IRender; isSelecting = false; private selectMode: "single" | "multi" = "single"; selectedFeatures: FeatureCollection = featureCollection([]); toolsCenter: ToolsCenter; // private sourceFeatures: PolygonFeatureType[] = []; constructor(toolsCenter: ToolsCenter) { super(); this.toolsCenter = toolsCenter; const hpaas = toolsCenter.hpaas; this.hpaas = hpaas; if (hpaas.type == "L7") { this.render = new PolygonRenderL7(this); } else if (hpaas.type == "DECKGL") { this.render = new PolygonRenderDeckGL(this); } else { this.render = new PolygonRenderDeckGL(this); } this._bindEvent(); } _bindEvent() { this.render.bindEvent({ click: this._mouseclickEventHandler, mousemove: this._mousemoveEventHandler, }); } _mouseclickEventHandler = async (e: mouseEventType) => { if (this.isSelecting && e) { const lng = e.lnglat.lng; const lat = e.lnglat.lat; const _point = point([lng, lat]); if (this.selectMode == "single") { this.drawLayer.store.unactiveAllFeature(); } this.drawLayer.store.features.forEach((feature) => { const isIn = booleanPointInPolygon(_point, feature); if (isIn && !this.selectedFeatures.features.includes(feature)) { this.selectedFeatures.features.push(feature); this.drawLayer.store.toggleActiveFeature(feature); } }); this.emit("SELECT_POLYGON_CHANGE", this.selectedFeatures); } }; _mousemoveEventHandler = (e: mouseEventType) => { if (this.isSelecting && e) { const lng = e.lnglat.lng; const lat = e.lnglat.lat; this.render.popup.html(`
点击区域选择
`); this.render.popup.pos({ lng, lat }); this.render.popup.show(); } }; setStatus(status: boolean) { this.isSelecting = status; } begin(drawLayer: IPolygonDrawLayer, selectMode: "multi" | "single" = "single") { this.drawLayer = drawLayer; this.selectMode = selectMode; // this.sourceFeatures = this.drawLayer.store.features; this.isSelecting = true; } end() { this.isSelecting = false; this.render.popup.hide(); } clear() { this.isSelecting = false; this.render.popup.hide(); this.selectedFeatures.features = []; // this.render.render(); this.drawLayer?.store?.unactiveAllFeature(); } } export default PolygonSelector;