giser-maptalks-drawtool 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{giser-maptalks-drawTool.cjs.js → giser-maptalks-drawtool.cjs.js} +24 -2
- package/dist/giser-maptalks-drawtool.cjs.js.map +1 -0
- package/dist/{giser-maptalks-drawTool.esm.js → giser-maptalks-drawtool.esm.js} +3 -1
- package/dist/giser-maptalks-drawtool.esm.js.map +1 -0
- package/dist/{giser-maptalks-drawTool.umd.js → giser-maptalks-drawtool.umd.js} +26 -6
- package/dist/giser-maptalks-drawtool.umd.js.map +1 -0
- package/package.json +4 -2
- package/dist/giser-maptalks-drawTool.cjs.js.map +0 -1
- package/dist/giser-maptalks-drawTool.esm.js.map +0 -1
- package/dist/giser-maptalks-drawTool.umd.js.map +0 -1
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
+
var maptalks = require('maptalks');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n["default"] = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var maptalks__namespace = /*#__PURE__*/_interopNamespace(maptalks);
|
|
26
|
+
|
|
5
27
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
6
28
|
const DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';
|
|
7
29
|
const DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';
|
|
@@ -32,7 +54,7 @@ class SelfIntersectionDrawTool {
|
|
|
32
54
|
constructor(options) {
|
|
33
55
|
this._hasSelfIntersection = false;
|
|
34
56
|
const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);
|
|
35
|
-
this._drawTool = new
|
|
57
|
+
this._drawTool = new maptalks__namespace.DrawTool(opts);
|
|
36
58
|
this.options = this._drawTool.options;
|
|
37
59
|
this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);
|
|
38
60
|
}
|
|
@@ -242,4 +264,4 @@ if (typeof window !== 'undefined') {
|
|
|
242
264
|
|
|
243
265
|
exports.SelfIntersectionDrawTool = SelfIntersectionDrawTool;
|
|
244
266
|
exports["default"] = SelfIntersectionDrawTool;
|
|
245
|
-
//# sourceMappingURL=giser-maptalks-
|
|
267
|
+
//# sourceMappingURL=giser-maptalks-drawtool.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"giser-maptalks-drawtool.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport * as maptalks from 'maptalks';\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":["maptalks"],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as maptalks from 'maptalks';
|
|
2
|
+
|
|
1
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
4
|
const DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';
|
|
3
5
|
const DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';
|
|
@@ -237,4 +239,4 @@ if (typeof window !== 'undefined') {
|
|
|
237
239
|
}
|
|
238
240
|
|
|
239
241
|
export { SelfIntersectionDrawTool, SelfIntersectionDrawTool as default };
|
|
240
|
-
//# sourceMappingURL=giser-maptalks-
|
|
242
|
+
//# sourceMappingURL=giser-maptalks-drawtool.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"giser-maptalks-drawtool.esm.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport * as maptalks from 'maptalks';\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.giserMaptalksDrawTool = {}));
|
|
5
|
-
})(this, (function (exports) { 'use strict';
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('maptalks')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'maptalks'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.giserMaptalksDrawTool = {}, global.maptalks));
|
|
5
|
+
})(this, (function (exports, maptalks) { 'use strict';
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n["default"] = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var maptalks__namespace = /*#__PURE__*/_interopNamespace(maptalks);
|
|
6
26
|
|
|
7
27
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
28
|
const DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';
|
|
@@ -34,7 +54,7 @@
|
|
|
34
54
|
constructor(options) {
|
|
35
55
|
this._hasSelfIntersection = false;
|
|
36
56
|
const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);
|
|
37
|
-
this._drawTool = new
|
|
57
|
+
this._drawTool = new maptalks__namespace.DrawTool(opts);
|
|
38
58
|
this.options = this._drawTool.options;
|
|
39
59
|
this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);
|
|
40
60
|
}
|
|
@@ -248,4 +268,4 @@
|
|
|
248
268
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
249
269
|
|
|
250
270
|
}));
|
|
251
|
-
//# sourceMappingURL=giser-maptalks-
|
|
271
|
+
//# sourceMappingURL=giser-maptalks-drawtool.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"giser-maptalks-drawtool.umd.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport * as maptalks from 'maptalks';\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":["maptalks"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "giser-maptalks-drawtool",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "maptalks DrawTool extension with self-intersection detection for polygon drawing",
|
|
5
5
|
"main": "dist/giser-maptalks-drawtool.cjs.js",
|
|
6
6
|
"module": "dist/giser-maptalks-drawtool.esm.js",
|
|
@@ -19,12 +19,14 @@
|
|
|
19
19
|
"polygon"
|
|
20
20
|
],
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"maptalks": ">=1.0.0"
|
|
22
|
+
"maptalks": ">=1.0.0",
|
|
23
|
+
"maptalks-gl": ">=0.124.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
26
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
26
27
|
"@rollup/plugin-typescript": "^8.5.0",
|
|
27
28
|
"maptalks": "^1.0.0",
|
|
29
|
+
"maptalks-gl": "^0.124.4",
|
|
28
30
|
"rollup": "^2.80.0",
|
|
29
31
|
"tslib": "^2.8.1",
|
|
30
32
|
"typescript": "^4.9.5"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"giser-maptalks-drawTool.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * 声明 maptalks 全局变量(UMD 模式下)\r\n */\r\ndeclare const maptalks: any;\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"giser-maptalks-drawTool.esm.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * 声明 maptalks 全局变量(UMD 模式下)\r\n */\r\ndeclare const maptalks: any;\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"giser-maptalks-drawTool.umd.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * 声明 maptalks 全局变量(UMD 模式下)\r\n */\r\ndeclare const maptalks: any;\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
|