@vtx/ol-map 2.0.0-beta.12 → 2.0.0-beta.13

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.
@@ -0,0 +1,1277 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = _default;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _antd = require("antd");
10
+ var _Modal = _interopRequireDefault(require("../../components/Modal"));
11
+ var _jspdf = require("jspdf");
12
+ var _snapdom = require("@zumer/snapdom");
13
+ var _interaction = require("ol/interaction");
14
+ var _Vector = _interopRequireDefault(require("ol/layer/Vector"));
15
+ var _Tile = _interopRequireDefault(require("ol/layer/Tile"));
16
+ var _Image = _interopRequireDefault(require("ol/layer/Image"));
17
+ var _Vector2 = _interopRequireDefault(require("ol/source/Vector"));
18
+ var _Draw = require("ol/interaction/Draw");
19
+ var _Draw2 = require("../../Utils/Draw");
20
+ var _useProps2 = _interopRequireDefault(require("../../../use-props"));
21
+ var _olMap = require("@vtx/ol-map");
22
+ require("./index.less");
23
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
24
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
25
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
26
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
27
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
28
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
29
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
30
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
31
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
32
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
33
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
34
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
35
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
36
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
37
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
38
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
39
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
40
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
41
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
42
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
43
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
44
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
45
+ var pageSizeOptions = ['A4', 'A3', 'A2', 'A1', 'A0'];
46
+ var pageSizeMap = {
47
+ A4: {
48
+ width: 210,
49
+ height: 297
50
+ },
51
+ A3: {
52
+ width: 297,
53
+ height: 420
54
+ },
55
+ A2: {
56
+ width: 420,
57
+ height: 594
58
+ },
59
+ A1: {
60
+ width: 594,
61
+ height: 841
62
+ },
63
+ A0: {
64
+ width: 841,
65
+ height: 1189
66
+ }
67
+ };
68
+ var DIMENSION_DPI = 96;
69
+ var EXPORT_DPI = 144;
70
+ var PREVIEW_HEIGHT = 610;
71
+ var PREVIEW_WIDTH = 980;
72
+ var pxToMm = function pxToMm(px) {
73
+ var dpi = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DIMENSION_DPI;
74
+ return px * 25.4 / dpi;
75
+ };
76
+ var mmToPx = function mmToPx(mm) {
77
+ var dpi = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EXPORT_DPI;
78
+ return mm * dpi / 25.4;
79
+ };
80
+ var isValidExtent = function isValidExtent(extent) {
81
+ return Array.isArray(extent) && extent.length === 4 && extent.every(function (item) {
82
+ return Number.isFinite(item);
83
+ }) && extent[2] > extent[0] && extent[3] > extent[1];
84
+ };
85
+
86
+ // 按指定层级把地理范围换算成屏幕像素和毫米尺寸。
87
+ // 这里算出来的宽高是后面分幅、预览和导出的统一基础数据。
88
+ var calcMetricsFromZoom = function calcMetricsFromZoom(extent, view, zoom) {
89
+ if (!isValidExtent(extent)) {
90
+ return null;
91
+ }
92
+ var resolution = view.getResolutionForZoom(zoom) || view.getResolution();
93
+ var geoWidth = extent[2] - extent[0];
94
+ var geoHeight = extent[3] - extent[1];
95
+ var pixelWidth = geoWidth / resolution;
96
+ var pixelHeight = geoHeight / resolution;
97
+ var widthMm = pxToMm(pixelWidth, DIMENSION_DPI);
98
+ var heightMm = pxToMm(pixelHeight, DIMENSION_DPI);
99
+ return {
100
+ extent: extent,
101
+ zoom: zoom,
102
+ resolution: resolution,
103
+ geoWidth: geoWidth,
104
+ geoHeight: geoHeight,
105
+ pixelWidth: pixelWidth,
106
+ pixelHeight: pixelHeight,
107
+ widthMm: widthMm,
108
+ heightMm: heightMm,
109
+ ratio: heightMm / widthMm
110
+ };
111
+ };
112
+
113
+ // 根据总宽高、纸张尺寸和重叠边距,计算需要切成多少张纸,
114
+ // 以及每一张纸在整幅图中的毫米位置。
115
+ var calcSplitPlan = function calcSplitPlan(_ref) {
116
+ var totalWidthMm = _ref.totalWidthMm,
117
+ totalHeightMm = _ref.totalHeightMm,
118
+ pageSize = _ref.pageSize,
119
+ _ref$overlapMargin = _ref.overlapMargin,
120
+ overlapMargin = _ref$overlapMargin === void 0 ? 0 : _ref$overlapMargin;
121
+ var paper = pageSizeMap[pageSize];
122
+ if (!paper || !totalWidthMm || !totalHeightMm) {
123
+ return null;
124
+ }
125
+ var safeOverlap = Math.max(0, Number(overlapMargin) || 0);
126
+ var stepX = Math.max(1, paper.width - safeOverlap);
127
+ var stepY = Math.max(1, paper.height - safeOverlap);
128
+ var cols = Math.max(1, Math.ceil(totalWidthMm / stepX));
129
+ var rows = Math.max(1, Math.ceil(totalHeightMm / stepY));
130
+ var sheets = [];
131
+ for (var row = 0; row < rows; row++) {
132
+ for (var col = 0; col < cols; col++) {
133
+ var xMm = col * stepX;
134
+ var yMm = row * stepY;
135
+ var widthMm = Math.min(paper.width, totalWidthMm - xMm);
136
+ var heightMm = Math.min(paper.height, totalHeightMm - yMm);
137
+ sheets.push({
138
+ id: "".concat(row + 1, "-").concat(col + 1),
139
+ index: row * cols + col + 1,
140
+ row: row + 1,
141
+ col: col + 1,
142
+ xMm: xMm,
143
+ yMm: yMm,
144
+ widthMm: widthMm,
145
+ heightMm: heightMm,
146
+ isPartial: widthMm < paper.width || heightMm < paper.height
147
+ });
148
+ }
149
+ }
150
+ return {
151
+ paperWidthMm: paper.width,
152
+ paperHeightMm: paper.height,
153
+ overlapMargin: safeOverlap,
154
+ totalWidthMm: totalWidthMm,
155
+ totalHeightMm: totalHeightMm,
156
+ stepX: stepX,
157
+ stepY: stepY,
158
+ cols: cols,
159
+ rows: rows,
160
+ totalSheets: sheets.length,
161
+ sheets: sheets
162
+ };
163
+ };
164
+
165
+ // 把某一张分幅纸在整幅图中的毫米位置,映射回真实地图 extent。
166
+ var buildSheetExtent = function buildSheetExtent(sheet, plan, totalExtent) {
167
+ var _totalExtent = _slicedToArray(totalExtent, 4),
168
+ minX = _totalExtent[0],
169
+ minY = _totalExtent[1],
170
+ maxX = _totalExtent[2],
171
+ maxY = _totalExtent[3];
172
+ var xScale = (maxX - minX) / plan.totalWidthMm;
173
+ var yScale = (maxY - minY) / plan.totalHeightMm;
174
+ var left = minX + sheet.xMm * xScale;
175
+ var right = left + sheet.widthMm * xScale;
176
+ var top = maxY - sheet.yMm * yScale;
177
+ var bottom = top - sheet.heightMm * yScale;
178
+ return [left, bottom, right, top];
179
+ };
180
+
181
+ // 预览区显示的是“完整纸张网格”的外框,不是仅仅显示用户选中的蓝框范围。
182
+ // 这样最后一张纸即使没铺满,虚线纸张尺寸也仍然是完整的。
183
+ var buildPreviewFrameExtent = function buildPreviewFrameExtent(plan, totalExtent) {
184
+ if (!plan || !isValidExtent(totalExtent)) {
185
+ return null;
186
+ }
187
+ var _totalExtent2 = _slicedToArray(totalExtent, 4),
188
+ minX = _totalExtent2[0],
189
+ minY = _totalExtent2[1],
190
+ maxX = _totalExtent2[2],
191
+ maxY = _totalExtent2[3];
192
+ var xScale = (maxX - minX) / plan.totalWidthMm;
193
+ var yScale = (maxY - minY) / plan.totalHeightMm;
194
+ var frameWidthMm = plan.paperWidthMm + Math.max(0, plan.cols - 1) * plan.stepX;
195
+ var frameHeightMm = plan.paperHeightMm + Math.max(0, plan.rows - 1) * plan.stepY;
196
+ return [minX, maxY - frameHeightMm * yScale, minX + frameWidthMm * xScale, maxY];
197
+ };
198
+ var getPreviewFrameSizeMm = function getPreviewFrameSizeMm(plan) {
199
+ if (!plan) {
200
+ return null;
201
+ }
202
+ return {
203
+ width: plan.paperWidthMm + Math.max(0, plan.cols - 1) * plan.stepX,
204
+ height: plan.paperHeightMm + Math.max(0, plan.rows - 1) * plan.stepY
205
+ };
206
+ };
207
+ var getExtentCenter = function getExtentCenter(extent) {
208
+ return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2];
209
+ };
210
+
211
+ // 预览/导出地图会复用原地图的图层源。
212
+ // 矢量图层这里做一份克隆,避免直接操作原图层上的 feature。
213
+ var cloneVectorSource = function cloneVectorSource(source) {
214
+ if (!(source !== null && source !== void 0 && source.getFeatures)) {
215
+ return source;
216
+ }
217
+ return new _Vector2["default"]({
218
+ features: source.getFeatures().map(function (feature) {
219
+ return feature.clone();
220
+ })
221
+ });
222
+ };
223
+
224
+ // 这里只同步常见业务图层到隐藏导出地图中,
225
+ // 不把框选图层、高亮层和底图标注层混进去,避免预览污染。
226
+ var cloneLayer = function cloneLayer(layer) {
227
+ var _layer$getOpacity, _layer$getVisible, _layer$getZIndex, _layer$getExtent;
228
+ var common = {
229
+ opacity: (_layer$getOpacity = layer.getOpacity) === null || _layer$getOpacity === void 0 ? void 0 : _layer$getOpacity.call(layer),
230
+ visible: (_layer$getVisible = layer.getVisible) === null || _layer$getVisible === void 0 ? void 0 : _layer$getVisible.call(layer),
231
+ zIndex: (_layer$getZIndex = layer.getZIndex) === null || _layer$getZIndex === void 0 ? void 0 : _layer$getZIndex.call(layer),
232
+ extent: (_layer$getExtent = layer.getExtent) === null || _layer$getExtent === void 0 ? void 0 : _layer$getExtent.call(layer)
233
+ };
234
+ if (layer instanceof _Vector["default"]) {
235
+ var clonedLayer = new _Vector["default"](_objectSpread(_objectSpread({}, common), {}, {
236
+ source: cloneVectorSource(layer.getSource()),
237
+ style: layer.getStyle()
238
+ }));
239
+ clonedLayer.set('__sheetPrintClone', true);
240
+ return clonedLayer;
241
+ }
242
+ if (layer instanceof _Tile["default"]) {
243
+ var _clonedLayer = new _Tile["default"](_objectSpread(_objectSpread({}, common), {}, {
244
+ source: layer.getSource()
245
+ }));
246
+ _clonedLayer.set('__sheetPrintClone', true);
247
+ return _clonedLayer;
248
+ }
249
+ if (layer instanceof _Image["default"]) {
250
+ var _clonedLayer2 = new _Image["default"](_objectSpread(_objectSpread({}, common), {}, {
251
+ source: layer.getSource()
252
+ }));
253
+ _clonedLayer2.set('__sheetPrintClone', true);
254
+ return _clonedLayer2;
255
+ }
256
+ return null;
257
+ };
258
+ var clearClonedLayers = function clearClonedLayers(mapInstance) {
259
+ if (!mapInstance) {
260
+ return;
261
+ }
262
+ mapInstance.getLayers().getArray().filter(function (layer) {
263
+ return layer.get('__sheetPrintClone');
264
+ }).forEach(function (layer) {
265
+ return mapInstance.removeLayer(layer);
266
+ });
267
+ };
268
+
269
+ // 隐藏导出地图和主地图不是同一个实例,所以需要把当前可见业务图层同步过去。
270
+ var syncBusinessLayers = function syncBusinessLayers(sourceMap, targetMap, excludeLayer) {
271
+ if (!sourceMap || !targetMap) {
272
+ return;
273
+ }
274
+ clearClonedLayers(targetMap);
275
+ sourceMap.getLayers().getArray().filter(function (layer) {
276
+ var _layer$getVisible2;
277
+ if (layer === excludeLayer) {
278
+ return false;
279
+ }
280
+ if (!(layer !== null && layer !== void 0 && (_layer$getVisible2 = layer.getVisible) !== null && _layer$getVisible2 !== void 0 && _layer$getVisible2.call(layer))) {
281
+ return false;
282
+ }
283
+ if (layer.get('key') === 'Highlight') {
284
+ return false;
285
+ }
286
+ if (layer.get('key') === '__TDT_TILE' || layer.get('key') === '__TDT_MARK') {
287
+ return false;
288
+ }
289
+ return layer instanceof _Vector["default"] || layer instanceof _Tile["default"] || layer instanceof _Image["default"];
290
+ }).forEach(function (layer) {
291
+ var clonedLayer = cloneLayer(layer);
292
+ if (clonedLayer) {
293
+ targetMap.addLayer(clonedLayer);
294
+ }
295
+ });
296
+ };
297
+ var waitNextFrame = function waitNextFrame() {
298
+ return new Promise(function (resolve) {
299
+ requestAnimationFrame(function () {
300
+ requestAnimationFrame(resolve);
301
+ });
302
+ });
303
+ };
304
+ var waitMapRender = function waitMapRender(mapInstance) {
305
+ return new Promise(function (resolve) {
306
+ var _mapInstance$renderSy;
307
+ if (!mapInstance) {
308
+ resolve();
309
+ return;
310
+ }
311
+ var done = false;
312
+ var finish = function finish() {
313
+ if (done) {
314
+ return;
315
+ }
316
+ done = true;
317
+ resolve();
318
+ };
319
+ mapInstance.once('rendercomplete', finish);
320
+ setTimeout(finish, 600);
321
+ (_mapInstance$renderSy = mapInstance.renderSync) === null || _mapInstance$renderSy === void 0 || _mapInstance$renderSy.call(mapInstance);
322
+ });
323
+ };
324
+
325
+ // 统一用 html2canvas 截取隐藏导出地图的 DOM,
326
+ // 预览图和最终分幅图片都走这条截图链路。
327
+ var captureDomCanvas = /*#__PURE__*/function () {
328
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(dom, width, height) {
329
+ var snapshot, canvas, ctx;
330
+ return _regenerator().w(function (_context) {
331
+ while (1) switch (_context.n) {
332
+ case 0:
333
+ _context.n = 1;
334
+ return _snapdom.snapdom.toCanvas(dom, {
335
+ scale: 1,
336
+ backgroundColor: '#ffffff'
337
+ });
338
+ case 1:
339
+ snapshot = _context.v;
340
+ canvas = document.createElement('canvas');
341
+ canvas.width = Math.max(1, Math.round(width));
342
+ canvas.height = Math.max(1, Math.round(height));
343
+ ctx = canvas.getContext('2d');
344
+ ctx.fillStyle = '#fff';
345
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
346
+ ctx.drawImage(snapshot, 0, 0, canvas.width, canvas.height);
347
+ return _context.a(2, canvas);
348
+ }
349
+ }, _callee);
350
+ }));
351
+ return function captureDomCanvas(_x, _x2, _x3) {
352
+ return _ref2.apply(this, arguments);
353
+ };
354
+ }();
355
+ var loadImage = function loadImage(src) {
356
+ return new Promise(function (resolve, reject) {
357
+ var img = new Image();
358
+ img.onload = function () {
359
+ return resolve(img);
360
+ };
361
+ img.onerror = reject;
362
+ img.src = src;
363
+ });
364
+ };
365
+ var createPdfFromImages = function createPdfFromImages(_ref3) {
366
+ var images = _ref3.images,
367
+ pageWidthMm = _ref3.pageWidthMm,
368
+ pageHeightMm = _ref3.pageHeightMm,
369
+ title = _ref3.title;
370
+ if (!(images !== null && images !== void 0 && images.length)) {
371
+ return;
372
+ }
373
+ var orientation = pageWidthMm > pageHeightMm ? 'landscape' : 'portrait';
374
+ var pdf = new _jspdf.jsPDF({
375
+ orientation: orientation,
376
+ unit: 'mm',
377
+ format: [pageWidthMm, pageHeightMm],
378
+ compress: true
379
+ });
380
+ images.forEach(function (item, index) {
381
+ if (index > 0) {
382
+ pdf.addPage([pageWidthMm, pageHeightMm], orientation);
383
+ }
384
+ pdf.addImage(item.url, 'JPEG', 0, 0, pageWidthMm, pageHeightMm, undefined, 'FAST');
385
+ });
386
+ pdf.save(decodeURIComponent("".concat(title || 'map-sheet-print', ".pdf")));
387
+ };
388
+ function _default(props) {
389
+ var _splitPlan$sheets2;
390
+ var onClose = props.onClose;
391
+ var _useProps = (0, _useProps2["default"])(),
392
+ map = _useProps.map,
393
+ TextEnum = _useProps.TextEnum;
394
+ var _Form$useForm = _antd.Form.useForm(),
395
+ _Form$useForm2 = _slicedToArray(_Form$useForm, 1),
396
+ form = _Form$useForm2[0];
397
+ var _useState = (0, _react.useState)(false),
398
+ _useState2 = _slicedToArray(_useState, 2),
399
+ previewVisible = _useState2[0],
400
+ setPreviewVisible = _useState2[1];
401
+ var _useState3 = (0, _react.useState)(false),
402
+ _useState4 = _slicedToArray(_useState3, 2),
403
+ sheetVisible = _useState4[0],
404
+ setSheetVisible = _useState4[1];
405
+ var _useState5 = (0, _react.useState)({}),
406
+ _useState6 = _slicedToArray(_useState5, 2),
407
+ formVal = _useState6[0],
408
+ setFormVal = _useState6[1];
409
+ var _useState7 = (0, _react.useState)('A4'),
410
+ _useState8 = _slicedToArray(_useState7, 2),
411
+ pageSizeValue = _useState8[0],
412
+ setPageSizeValue = _useState8[1];
413
+ var _useState9 = (0, _react.useState)(0),
414
+ _useState0 = _slicedToArray(_useState9, 2),
415
+ overlapMarginValue = _useState0[0],
416
+ setOverlapMarginValue = _useState0[1];
417
+ var _useState1 = (0, _react.useState)(null),
418
+ _useState10 = _slicedToArray(_useState1, 2),
419
+ metrics = _useState10[0],
420
+ setMetrics = _useState10[1];
421
+ var _useState11 = (0, _react.useState)(null),
422
+ _useState12 = _slicedToArray(_useState11, 2),
423
+ totalWidthMm = _useState12[0],
424
+ setTotalWidthMm = _useState12[1];
425
+ var _useState13 = (0, _react.useState)(null),
426
+ _useState14 = _slicedToArray(_useState13, 2),
427
+ totalHeightMm = _useState14[0],
428
+ setTotalHeightMm = _useState14[1];
429
+ var _useState15 = (0, _react.useState)(false),
430
+ _useState16 = _slicedToArray(_useState15, 2),
431
+ previewReady = _useState16[0],
432
+ setPreviewReady = _useState16[1];
433
+ var _useState17 = (0, _react.useState)(''),
434
+ _useState18 = _slicedToArray(_useState17, 2),
435
+ previewImage = _useState18[0],
436
+ setPreviewImage = _useState18[1];
437
+ var _useState19 = (0, _react.useState)([]),
438
+ _useState20 = _slicedToArray(_useState19, 2),
439
+ sheetImages = _useState20[0],
440
+ setSheetImages = _useState20[1];
441
+ var _useState21 = (0, _react.useState)([]),
442
+ _useState22 = _slicedToArray(_useState21, 2),
443
+ selectedSheetIds = _useState22[0],
444
+ setSelectedSheetIds = _useState22[1];
445
+ var _useState23 = (0, _react.useState)(false),
446
+ _useState24 = _slicedToArray(_useState23, 2),
447
+ generating = _useState24[0],
448
+ setGenerating = _useState24[1];
449
+ var drawTool = (0, _react.useRef)(null);
450
+ var boxExtentRef = (0, _react.useRef)(null);
451
+ var boxLayerRef = (0, _react.useRef)(null);
452
+ var exportMapRef = (0, _react.useRef)(null);
453
+ var exportStageRef = (0, _react.useRef)(null);
454
+ var renderLayersSyncedRef = (0, _react.useRef)(false);
455
+ var previewRenderSeqRef = (0, _react.useRef)(0);
456
+ var previewRenderTimerRef = (0, _react.useRef)(null);
457
+ var _useState25 = (0, _react.useState)({
458
+ width: 1,
459
+ height: 1
460
+ }),
461
+ _useState26 = _slicedToArray(_useState25, 2),
462
+ exportSize = _useState26[0],
463
+ setExportSize = _useState26[1];
464
+ (0, _react.useEffect)(function () {
465
+ form.setFieldsValue({
466
+ range: '1',
467
+ pageSize: 'A4',
468
+ overlapMargin: 0
469
+ });
470
+ }, []);
471
+ (0, _react.useEffect)(function () {
472
+ var boxSource = new _Vector2["default"]();
473
+ var boxLayer = new _Vector["default"]({
474
+ source: boxSource,
475
+ style: (0, _Draw2.drawStyle)(),
476
+ zIndex: 9999
477
+ });
478
+ var tool = new _interaction.Draw({
479
+ source: boxSource,
480
+ type: 'Circle',
481
+ style: function style(feature) {
482
+ return (0, _Draw2.drawStyle)(feature);
483
+ },
484
+ geometryFunction: (0, _Draw.createBox)()
485
+ });
486
+ boxLayerRef.current = boxLayer;
487
+ drawTool.current = tool;
488
+ tool.setActive(false);
489
+ tool.on('drawstart', function () {
490
+ boxSource.clear();
491
+ map.showTip(TextEnum.clickAgainToEnd);
492
+ });
493
+ tool.on('drawend', function (event) {
494
+ var extent = event.feature.getGeometry().getExtent();
495
+ boxExtentRef.current = extent;
496
+ map.showTip(TextEnum.leftClickToStart);
497
+ });
498
+ map.addLayer(boxLayer);
499
+ map.addInteraction(tool);
500
+ return function () {
501
+ if (previewRenderTimerRef.current) {
502
+ clearTimeout(previewRenderTimerRef.current);
503
+ }
504
+ boxSource.clear();
505
+ map.removeLayer(boxLayer);
506
+ map.removeInteraction(tool);
507
+ map.hideTip();
508
+ };
509
+ }, []);
510
+ var splitPlan = (0, _react.useMemo)(function () {
511
+ return calcSplitPlan({
512
+ totalWidthMm: totalWidthMm,
513
+ totalHeightMm: totalHeightMm,
514
+ pageSize: pageSizeValue,
515
+ overlapMargin: overlapMarginValue
516
+ });
517
+ }, [totalWidthMm, totalHeightMm, pageSizeValue, overlapMarginValue]);
518
+ var previewFrameExtent = (0, _react.useMemo)(function () {
519
+ return buildPreviewFrameExtent(splitPlan, metrics === null || metrics === void 0 ? void 0 : metrics.extent);
520
+ }, [splitPlan, metrics === null || metrics === void 0 ? void 0 : metrics.extent]);
521
+
522
+ // 预览按“整张纸面的真实尺寸”缩放,而不是按选区本身缩放。
523
+ // 这样手动框选较小时,不会被自动放大到几乎铺满预览区域。
524
+ var previewScale = (0, _react.useMemo)(function () {
525
+ var frameSizeMm = getPreviewFrameSizeMm(splitPlan);
526
+ if (!frameSizeMm) {
527
+ return 1;
528
+ }
529
+ var scaleX = frameSizeMm.width / PREVIEW_WIDTH;
530
+ var scaleY = frameSizeMm.height / PREVIEW_HEIGHT;
531
+ return Math.max(scaleX, scaleY, 0.0001);
532
+ }, [splitPlan]);
533
+ var selectedMapPixels = (0, _react.useMemo)(function () {
534
+ if (!totalWidthMm || !totalHeightMm || !previewScale) {
535
+ return null;
536
+ }
537
+ return {
538
+ width: Math.max(1, totalWidthMm / previewScale),
539
+ height: Math.max(1, totalHeightMm / previewScale)
540
+ };
541
+ }, [totalWidthMm, totalHeightMm, previewScale]);
542
+ var previewFramePixels = (0, _react.useMemo)(function () {
543
+ var frameSizeMm = getPreviewFrameSizeMm(splitPlan);
544
+ if (!frameSizeMm || !previewScale) {
545
+ return null;
546
+ }
547
+ return {
548
+ width: Math.max(1, frameSizeMm.width / previewScale),
549
+ height: Math.max(1, frameSizeMm.height / previewScale)
550
+ };
551
+ }, [splitPlan, previewScale]);
552
+ var selectedRangeCoverage = (0, _react.useMemo)(function () {
553
+ var frameSizeMm = getPreviewFrameSizeMm(splitPlan);
554
+ if (!frameSizeMm || !totalWidthMm || !totalHeightMm) {
555
+ return null;
556
+ }
557
+ return {
558
+ widthPercent: totalWidthMm / frameSizeMm.width * 100,
559
+ heightPercent: totalHeightMm / frameSizeMm.height * 100
560
+ };
561
+ }, [splitPlan, totalWidthMm, totalHeightMm]);
562
+ (0, _react.useEffect)(function () {
563
+ if (splitPlan) {
564
+ setSelectedSheetIds(splitPlan.sheets.map(function (item) {
565
+ return item.id;
566
+ }));
567
+ }
568
+ }, [splitPlan]);
569
+ var handleRangeChange = function handleRangeChange(value) {
570
+ var _drawTool$current;
571
+ if (value === '1') {
572
+ var _boxLayerRef$current;
573
+ map.hideTip();
574
+ (_boxLayerRef$current = boxLayerRef.current) === null || _boxLayerRef$current === void 0 || (_boxLayerRef$current = _boxLayerRef$current.getSource()) === null || _boxLayerRef$current === void 0 || _boxLayerRef$current.clear();
575
+ boxExtentRef.current = null;
576
+ } else {
577
+ map.showTip(TextEnum.leftClickToStart);
578
+ }
579
+ (_drawTool$current = drawTool.current) === null || _drawTool$current === void 0 || _drawTool$current.setActive(value === '2');
580
+ };
581
+ var handlePageSizeChange = function handlePageSizeChange(value) {
582
+ var nextPageSize = value || 'A4';
583
+ setPageSizeValue(nextPageSize);
584
+ form.setFieldValue('pageSize', nextPageSize);
585
+ };
586
+ var handleExportMapCreated = function handleExportMapCreated(exportMap) {
587
+ exportMapRef.current = exportMap;
588
+ exportMap.getInteractions().forEach(function (item) {
589
+ return item.setActive(false);
590
+ });
591
+ syncBusinessLayers(map, exportMap, boxLayerRef.current);
592
+ };
593
+
594
+ // 隐藏导出地图只在第一次真正需要时补同步业务图层,
595
+ // 后面同一轮预览/导出尽量复用,避免频繁清空重建。
596
+ var ensureRenderMapLayers = function ensureRenderMapLayers() {
597
+ if (!exportMapRef.current) {
598
+ return false;
599
+ }
600
+ if (!renderLayersSyncedRef.current) {
601
+ syncBusinessLayers(map, exportMapRef.current, boxLayerRef.current);
602
+ renderLayersSyncedRef.current = true;
603
+ }
604
+ return true;
605
+ };
606
+
607
+ // 点击“执行分幅”时,直接读取外部主地图当前层级,
608
+ // 也就是“外面地图是什么层级,进去就按什么层级算”。
609
+ var handleSubmit = function handleSubmit(values) {
610
+ var _values$overlapMargin, _map$getView$getZoom, _map$getView;
611
+ var pageSize = values.pageSize || form.getFieldValue('pageSize');
612
+ var overlapMargin = Number((_values$overlapMargin = values.overlapMargin) !== null && _values$overlapMargin !== void 0 ? _values$overlapMargin : form.getFieldValue('overlapMargin')) || 0;
613
+ // const overlapMargin = 10
614
+
615
+ console.log('overlapMargin', values.overlapMargin, form.getFieldValue('overlapMargin'), overlapMargin);
616
+ var extent = values.range === '1' ? map.getView().calculateExtent(map.getSize()) : boxExtentRef.current;
617
+ if (!isValidExtent(extent)) {
618
+ return;
619
+ }
620
+ var zoom = Math.round(((_map$getView$getZoom = (_map$getView = map.getView()).getZoom) === null || _map$getView$getZoom === void 0 ? void 0 : _map$getView$getZoom.call(_map$getView)) || 0);
621
+ var nextMetrics = calcMetricsFromZoom(extent, map.getView(), zoom);
622
+ if (!nextMetrics) {
623
+ return;
624
+ }
625
+ console.log('[MapSheetPrint] 执行分幅参数', {
626
+ rangeMode: values.range,
627
+ extent: extent,
628
+ zoom: zoom,
629
+ pageSize: pageSize,
630
+ overlapMargin: overlapMargin,
631
+ metrics: {
632
+ geoWidth: nextMetrics.geoWidth,
633
+ geoHeight: nextMetrics.geoHeight,
634
+ pixelWidth: nextMetrics.pixelWidth,
635
+ pixelHeight: nextMetrics.pixelHeight,
636
+ widthMm: nextMetrics.widthMm,
637
+ heightMm: nextMetrics.heightMm,
638
+ ratio: nextMetrics.ratio
639
+ }
640
+ });
641
+ setFormVal(_objectSpread(_objectSpread({}, values), {}, {
642
+ pageSize: pageSize,
643
+ overlapMargin: overlapMargin,
644
+ printZoom: zoom
645
+ }));
646
+ setPageSizeValue(pageSize);
647
+ setOverlapMarginValue(overlapMargin);
648
+ setMetrics(nextMetrics);
649
+ setTotalWidthMm(Number(nextMetrics.widthMm.toFixed(3)));
650
+ setTotalHeightMm(Number(nextMetrics.heightMm.toFixed(3)));
651
+ setPreviewReady(false);
652
+ setPreviewImage('');
653
+ renderLayersSyncedRef.current = false;
654
+ setSheetImages([]);
655
+ setSheetVisible(false);
656
+ setPreviewVisible(true);
657
+ };
658
+ var handleWidthChange = function handleWidthChange(value) {
659
+ if (!metrics || !value) {
660
+ return;
661
+ }
662
+ var nextWidth = Number(value);
663
+ setTotalWidthMm(nextWidth);
664
+ setTotalHeightMm(Number((nextWidth * metrics.ratio).toFixed(3)));
665
+ };
666
+ var handleHeightChange = function handleHeightChange(value) {
667
+ if (!metrics || !value) {
668
+ return;
669
+ }
670
+ var nextHeight = Number(value);
671
+ setTotalHeightMm(nextHeight);
672
+ setTotalWidthMm(Number((nextHeight / metrics.ratio).toFixed(3)));
673
+ };
674
+ var renderSheetImage = /*#__PURE__*/function () {
675
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(sheet) {
676
+ var previewImg, frameSizeMm, frameTotalWidthMm, frameTotalHeightMm, sourceX, sourceY, sourceWidth, sourceHeight, pageWidthPx, pageHeightPx, pageCanvas, ctx;
677
+ return _regenerator().w(function (_context2) {
678
+ while (1) switch (_context2.n) {
679
+ case 0:
680
+ if (!(!splitPlan || !previewFramePixels || !previewImage)) {
681
+ _context2.n = 1;
682
+ break;
683
+ }
684
+ return _context2.a(2, null);
685
+ case 1:
686
+ _context2.n = 2;
687
+ return loadImage(previewImage);
688
+ case 2:
689
+ previewImg = _context2.v;
690
+ frameSizeMm = getPreviewFrameSizeMm(splitPlan);
691
+ frameTotalWidthMm = frameSizeMm.width;
692
+ frameTotalHeightMm = frameSizeMm.height;
693
+ sourceX = sheet.xMm / frameTotalWidthMm * previewFramePixels.width;
694
+ sourceY = sheet.yMm / frameTotalHeightMm * previewFramePixels.height;
695
+ sourceWidth = splitPlan.paperWidthMm / frameTotalWidthMm * previewFramePixels.width;
696
+ sourceHeight = splitPlan.paperHeightMm / frameTotalHeightMm * previewFramePixels.height;
697
+ pageWidthPx = Math.max(1, Math.round(mmToPx(splitPlan.paperWidthMm, EXPORT_DPI)));
698
+ pageHeightPx = Math.max(1, Math.round(mmToPx(splitPlan.paperHeightMm, EXPORT_DPI)));
699
+ console.log('[MapSheetPrint] 生成单张图幅', {
700
+ sheetId: sheet.id,
701
+ sheetIndex: sheet.index,
702
+ sheetWidthMm: sheet.widthMm,
703
+ sheetHeightMm: sheet.heightMm,
704
+ sourceX: sourceX,
705
+ sourceY: sourceY,
706
+ sourceWidth: sourceWidth,
707
+ sourceHeight: sourceHeight,
708
+ pageWidthPx: pageWidthPx,
709
+ pageHeightPx: pageHeightPx
710
+ });
711
+ pageCanvas = document.createElement('canvas');
712
+ pageCanvas.width = pageWidthPx;
713
+ pageCanvas.height = pageHeightPx;
714
+ ctx = pageCanvas.getContext('2d');
715
+ ctx.fillStyle = '#fff';
716
+ ctx.fillRect(0, 0, pageWidthPx, pageHeightPx);
717
+ ctx.drawImage(previewImg, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, pageWidthPx, pageHeightPx);
718
+ return _context2.a(2, _objectSpread(_objectSpread({}, sheet), {}, {
719
+ url: pageCanvas.toDataURL('image/jpeg', 0.92),
720
+ pixelWidth: pageWidthPx,
721
+ pixelHeight: pageHeightPx
722
+ }));
723
+ }
724
+ }, _callee2);
725
+ }));
726
+ return function renderSheetImage(_x4) {
727
+ return _ref4.apply(this, arguments);
728
+ };
729
+ }();
730
+
731
+ // 预览始终裁同一个原始 extent。
732
+ // 宽高变大时,不改 extent,而是先把隐藏地图按更大的像素尺寸重新渲染,
733
+ // 相当于“放大地图层级”,再把同一个 extent 裁成预览图。
734
+ var renderPreviewImage = /*#__PURE__*/function () {
735
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(seq) {
736
+ var _exportMapRef$current, _exportMapRef$current2;
737
+ var widthScale, heightScale, captureWidthPx, captureHeightPx, targetResolution, targetCenter, view, sourceCanvas, previewCanvas, ctx;
738
+ return _regenerator().w(function (_context3) {
739
+ while (1) switch (_context3.n) {
740
+ case 0:
741
+ if (!(!previewVisible || !(metrics !== null && metrics !== void 0 && metrics.extent) || !selectedMapPixels || !previewFramePixels || !exportMapRef.current || !exportStageRef.current)) {
742
+ _context3.n = 1;
743
+ break;
744
+ }
745
+ return _context3.a(2);
746
+ case 1:
747
+ widthScale = totalWidthMm / metrics.widthMm;
748
+ heightScale = totalHeightMm / metrics.heightMm;
749
+ captureWidthPx = Math.max(1, Math.round(metrics.pixelWidth * widthScale));
750
+ captureHeightPx = Math.max(1, Math.round(metrics.pixelHeight * heightScale));
751
+ targetResolution = Math.max(metrics.geoWidth / captureWidthPx, metrics.geoHeight / captureHeightPx);
752
+ targetCenter = getExtentCenter(metrics.extent);
753
+ console.log('[MapSheetPrint] 生成预览裁图', {
754
+ seq: seq,
755
+ extent: metrics.extent,
756
+ zoom: metrics.zoom,
757
+ totalWidthMm: totalWidthMm,
758
+ totalHeightMm: totalHeightMm,
759
+ previewScale: previewScale,
760
+ previewFrameExtent: previewFrameExtent,
761
+ previewFramePixels: previewFramePixels,
762
+ selectedMapPixels: selectedMapPixels,
763
+ captureWidthPx: captureWidthPx,
764
+ captureHeightPx: captureHeightPx,
765
+ targetResolution: targetResolution,
766
+ targetCenter: targetCenter,
767
+ splitPlan: splitPlan ? {
768
+ cols: splitPlan.cols,
769
+ rows: splitPlan.rows,
770
+ totalSheets: splitPlan.totalSheets,
771
+ paperWidthMm: splitPlan.paperWidthMm,
772
+ paperHeightMm: splitPlan.paperHeightMm,
773
+ stepX: splitPlan.stepX,
774
+ stepY: splitPlan.stepY
775
+ } : null
776
+ });
777
+ setPreviewReady(false);
778
+ _context3.n = 2;
779
+ return waitNextFrame();
780
+ case 2:
781
+ if (!(seq !== previewRenderSeqRef.current)) {
782
+ _context3.n = 3;
783
+ break;
784
+ }
785
+ return _context3.a(2);
786
+ case 3:
787
+ if (ensureRenderMapLayers()) {
788
+ _context3.n = 4;
789
+ break;
790
+ }
791
+ return _context3.a(2);
792
+ case 4:
793
+ setExportSize({
794
+ width: captureWidthPx,
795
+ height: captureHeightPx
796
+ });
797
+ _context3.n = 5;
798
+ return waitNextFrame();
799
+ case 5:
800
+ if (!(seq !== previewRenderSeqRef.current)) {
801
+ _context3.n = 6;
802
+ break;
803
+ }
804
+ return _context3.a(2);
805
+ case 6:
806
+ (_exportMapRef$current = (_exportMapRef$current2 = exportMapRef.current).updateSize) === null || _exportMapRef$current === void 0 || _exportMapRef$current.call(_exportMapRef$current2);
807
+ view = exportMapRef.current.getView();
808
+ view.setCenter(targetCenter);
809
+ view.setResolution(targetResolution);
810
+ _context3.n = 7;
811
+ return waitMapRender(exportMapRef.current);
812
+ case 7:
813
+ _context3.n = 8;
814
+ return waitNextFrame();
815
+ case 8:
816
+ if (!(seq !== previewRenderSeqRef.current)) {
817
+ _context3.n = 9;
818
+ break;
819
+ }
820
+ return _context3.a(2);
821
+ case 9:
822
+ _context3.n = 10;
823
+ return captureDomCanvas(exportStageRef.current, captureWidthPx, captureHeightPx);
824
+ case 10:
825
+ sourceCanvas = _context3.v;
826
+ if (!(seq !== previewRenderSeqRef.current)) {
827
+ _context3.n = 11;
828
+ break;
829
+ }
830
+ return _context3.a(2);
831
+ case 11:
832
+ previewCanvas = document.createElement('canvas');
833
+ previewCanvas.width = Math.max(1, Math.round(previewFramePixels.width));
834
+ previewCanvas.height = Math.max(1, Math.round(previewFramePixels.height));
835
+ ctx = previewCanvas.getContext('2d');
836
+ ctx.fillStyle = '#fff';
837
+ ctx.fillRect(0, 0, previewCanvas.width, previewCanvas.height);
838
+ ctx.drawImage(sourceCanvas, 0, 0, captureWidthPx, captureHeightPx, 0, 0, selectedMapPixels.width, selectedMapPixels.height);
839
+ setPreviewImage(previewCanvas.toDataURL('image/jpeg', 0.92));
840
+ setPreviewReady(true);
841
+ case 12:
842
+ return _context3.a(2);
843
+ }
844
+ }, _callee3);
845
+ }));
846
+ return function renderPreviewImage(_x5) {
847
+ return _ref5.apply(this, arguments);
848
+ };
849
+ }();
850
+ (0, _react.useEffect)(function () {
851
+ if (previewRenderTimerRef.current) {
852
+ clearTimeout(previewRenderTimerRef.current);
853
+ }
854
+ if (!previewVisible) {
855
+ return;
856
+ }
857
+ var seq = previewRenderSeqRef.current + 1;
858
+ previewRenderSeqRef.current = seq;
859
+ previewRenderTimerRef.current = setTimeout(function () {
860
+ renderPreviewImage(seq);
861
+ }, 120);
862
+ return function () {
863
+ if (previewRenderTimerRef.current) {
864
+ clearTimeout(previewRenderTimerRef.current);
865
+ }
866
+ };
867
+ }, [previewVisible, metrics === null || metrics === void 0 ? void 0 : metrics.extent, previewFrameExtent, previewFramePixels, selectedMapPixels, totalWidthMm, totalHeightMm]);
868
+ (0, _react.useEffect)(function () {
869
+ if (!splitPlan) {
870
+ return;
871
+ }
872
+ console.log('[MapSheetPrint] 分幅计算结果', {
873
+ totalWidthMm: totalWidthMm,
874
+ totalHeightMm: totalHeightMm,
875
+ pageSize: pageSizeValue,
876
+ overlapMargin: overlapMarginValue,
877
+ cols: splitPlan.cols,
878
+ rows: splitPlan.rows,
879
+ totalSheets: splitPlan.totalSheets,
880
+ paperWidthMm: splitPlan.paperWidthMm,
881
+ paperHeightMm: splitPlan.paperHeightMm,
882
+ sheets: splitPlan.sheets.map(function (item) {
883
+ return {
884
+ id: item.id,
885
+ index: item.index,
886
+ xMm: item.xMm,
887
+ yMm: item.yMm,
888
+ widthMm: item.widthMm,
889
+ heightMm: item.heightMm,
890
+ isPartial: item.isPartial
891
+ };
892
+ })
893
+ });
894
+ }, [splitPlan, totalWidthMm, totalHeightMm, pageSizeValue, overlapMarginValue]);
895
+ var handleGenerateSheets = /*#__PURE__*/function () {
896
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
897
+ var _splitPlan$sheets;
898
+ var images, _iterator, _step, sheet, image, _t;
899
+ return _regenerator().w(function (_context4) {
900
+ while (1) switch (_context4.p = _context4.n) {
901
+ case 0:
902
+ if (splitPlan !== null && splitPlan !== void 0 && (_splitPlan$sheets = splitPlan.sheets) !== null && _splitPlan$sheets !== void 0 && _splitPlan$sheets.length) {
903
+ _context4.n = 1;
904
+ break;
905
+ }
906
+ return _context4.a(2);
907
+ case 1:
908
+ setGenerating(true);
909
+ _context4.p = 2;
910
+ images = [];
911
+ _iterator = _createForOfIteratorHelper(splitPlan.sheets);
912
+ _context4.p = 3;
913
+ _iterator.s();
914
+ case 4:
915
+ if ((_step = _iterator.n()).done) {
916
+ _context4.n = 7;
917
+ break;
918
+ }
919
+ sheet = _step.value;
920
+ _context4.n = 5;
921
+ return renderSheetImage(sheet);
922
+ case 5:
923
+ image = _context4.v;
924
+ if (image) {
925
+ images.push(image);
926
+ }
927
+ case 6:
928
+ _context4.n = 4;
929
+ break;
930
+ case 7:
931
+ _context4.n = 9;
932
+ break;
933
+ case 8:
934
+ _context4.p = 8;
935
+ _t = _context4.v;
936
+ _iterator.e(_t);
937
+ case 9:
938
+ _context4.p = 9;
939
+ _iterator.f();
940
+ return _context4.f(9);
941
+ case 10:
942
+ setSheetImages(images);
943
+ setSelectedSheetIds(images.map(function (item) {
944
+ return item.id;
945
+ }));
946
+ setPreviewVisible(false);
947
+ setSheetVisible(true);
948
+ case 11:
949
+ _context4.p = 11;
950
+ setGenerating(false);
951
+ return _context4.f(11);
952
+ case 12:
953
+ return _context4.a(2);
954
+ }
955
+ }, _callee4, null, [[3, 8, 9, 10], [2,, 11, 12]]);
956
+ }));
957
+ return function handleGenerateSheets() {
958
+ return _ref6.apply(this, arguments);
959
+ };
960
+ }();
961
+ var handleExportPdf = function handleExportPdf() {
962
+ var selectedImages = sheetImages.filter(function (item) {
963
+ return selectedSheetIds.includes(item.id);
964
+ });
965
+ if (!selectedImages.length || !splitPlan) {
966
+ return;
967
+ }
968
+ createPdfFromImages({
969
+ images: selectedImages,
970
+ pageWidthMm: splitPlan.paperWidthMm,
971
+ pageHeightMm: splitPlan.paperHeightMm,
972
+ title: formVal.title
973
+ });
974
+ };
975
+ return /*#__PURE__*/_react["default"].createElement(_Modal["default"], {
976
+ title: TextEnum.toolMapSheetPrint,
977
+ onClose: onClose
978
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Form, {
979
+ form: form,
980
+ name: "mapSheetPrint",
981
+ labelCol: {
982
+ span: 8
983
+ },
984
+ wrapperCol: {
985
+ span: 16
986
+ },
987
+ onFinish: handleSubmit
988
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Form.Item, {
989
+ label: TextEnum.mapTitle,
990
+ name: "title",
991
+ rules: [{
992
+ required: true,
993
+ message: TextEnum.pleaseInputTitle
994
+ }]
995
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Input, {
996
+ placeholder: TextEnum.pleaseInput
997
+ })), /*#__PURE__*/_react["default"].createElement(_antd.Form.Item, {
998
+ label: TextEnum.downloadRange,
999
+ name: "range",
1000
+ rules: [{
1001
+ required: true,
1002
+ message: TextEnum.pleaseSelect
1003
+ }]
1004
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Select, {
1005
+ placeholder: TextEnum.pleaseSelect,
1006
+ allowClear: true,
1007
+ onChange: handleRangeChange,
1008
+ options: [{
1009
+ value: '1',
1010
+ label: TextEnum.currentView
1011
+ }, {
1012
+ value: '2',
1013
+ label: TextEnum.manualBoxSelect
1014
+ }]
1015
+ })), /*#__PURE__*/_react["default"].createElement(_antd.Form.Item, {
1016
+ label: "\u7EB8\u5F20\u5C3A\u5BF8",
1017
+ name: "pageSize",
1018
+ rules: [{
1019
+ required: true,
1020
+ message: TextEnum.pleaseSelect
1021
+ }]
1022
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Select, {
1023
+ placeholder: TextEnum.pleaseSelect,
1024
+ allowClear: true,
1025
+ onChange: handlePageSizeChange,
1026
+ options: pageSizeOptions.map(function (item) {
1027
+ return {
1028
+ value: item,
1029
+ label: item
1030
+ };
1031
+ })
1032
+ })), /*#__PURE__*/_react["default"].createElement(_antd.Form.Item, {
1033
+ label: "\u91CD\u53E0\u8FB9\u8DDD"
1034
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Form.Item, {
1035
+ name: "overlapMargin",
1036
+ noStyle: true
1037
+ }, /*#__PURE__*/_react["default"].createElement(_antd.InputNumber, {
1038
+ min: 0,
1039
+ precision: 0,
1040
+ changeOnBlur: false,
1041
+ style: {
1042
+ width: 'calc(100% - 40px)'
1043
+ }
1044
+ })), /*#__PURE__*/_react["default"].createElement("span", null, "\uFF08mm\uFF09")), /*#__PURE__*/_react["default"].createElement(_antd.Form.Item, {
1045
+ wrapperCol: {
1046
+ offset: 8,
1047
+ span: 16
1048
+ }
1049
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Button, {
1050
+ type: "primary",
1051
+ htmlType: "submit"
1052
+ }, "\u6267\u884C\u5206\u5E45"))), /*#__PURE__*/_react["default"].createElement(_antd.Modal, {
1053
+ open: previewVisible,
1054
+ title: TextEnum.preview,
1055
+ onCancel: function onCancel() {
1056
+ return setPreviewVisible(false);
1057
+ },
1058
+ onOk: handleGenerateSheets,
1059
+ okText: "\u786E\u5B9A",
1060
+ cancelText: TextEnum.cancel,
1061
+ width: map.getViewport().clientWidth - 80,
1062
+ centered: true,
1063
+ wrapClassName: "ol-mapprint-modal",
1064
+ confirmLoading: generating,
1065
+ destroyOnHidden: false
1066
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1067
+ style: {
1068
+ display: 'flex',
1069
+ gap: 12,
1070
+ alignItems: 'center',
1071
+ marginBottom: 12
1072
+ }
1073
+ }, /*#__PURE__*/_react["default"].createElement("span", null, "\u5BBD"), /*#__PURE__*/_react["default"].createElement(_antd.InputNumber, {
1074
+ min: 0.001,
1075
+ precision: 3,
1076
+ value: totalWidthMm,
1077
+ onChange: handleWidthChange
1078
+ }), /*#__PURE__*/_react["default"].createElement("span", null, "mm"), /*#__PURE__*/_react["default"].createElement("span", {
1079
+ style: {
1080
+ color: '#999'
1081
+ }
1082
+ }, "\u56FA\u5B9A\u6BD4\u4F8B"), /*#__PURE__*/_react["default"].createElement("span", null, "\u9AD8"), /*#__PURE__*/_react["default"].createElement(_antd.InputNumber, {
1083
+ min: 0.001,
1084
+ precision: 3,
1085
+ value: totalHeightMm,
1086
+ onChange: handleHeightChange
1087
+ }), /*#__PURE__*/_react["default"].createElement("span", null, "mm"), splitPlan && /*#__PURE__*/_react["default"].createElement("span", {
1088
+ style: {
1089
+ marginLeft: 'auto',
1090
+ color: '#666'
1091
+ }
1092
+ }, splitPlan.cols, " \u5217 x ", splitPlan.rows, " \u884C\uFF0C\u5171 ", splitPlan.totalSheets, " \u5E45")), /*#__PURE__*/_react["default"].createElement("div", {
1093
+ style: {
1094
+ position: 'relative',
1095
+ height: PREVIEW_HEIGHT,
1096
+ overflow: 'auto',
1097
+ background: '#f5f5f5',
1098
+ border: '1px solid #e5e5e5'
1099
+ }
1100
+ }, !previewReady && /*#__PURE__*/_react["default"].createElement("div", {
1101
+ style: {
1102
+ position: 'absolute',
1103
+ inset: 0,
1104
+ display: 'flex',
1105
+ alignItems: 'center',
1106
+ justifyContent: 'center',
1107
+ zIndex: 2,
1108
+ background: 'rgba(255,255,255,0.72)'
1109
+ }
1110
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Spin, null)), metrics && previewFramePixels && splitPlan && selectedMapPixels && /*#__PURE__*/_react["default"].createElement("div", {
1111
+ style: {
1112
+ position: 'relative',
1113
+ width: previewFramePixels.width,
1114
+ height: previewFramePixels.height,
1115
+ transformOrigin: 'top left'
1116
+ }
1117
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1118
+ style: {
1119
+ position: 'absolute',
1120
+ left: 0,
1121
+ top: 0,
1122
+ width: previewFramePixels.width,
1123
+ height: previewFramePixels.height
1124
+ }
1125
+ }, /*#__PURE__*/_react["default"].createElement("img", {
1126
+ src: previewImage,
1127
+ alt: "sheet-preview",
1128
+ style: {
1129
+ width: '100%',
1130
+ height: '100%',
1131
+ display: previewImage ? 'block' : 'none'
1132
+ }
1133
+ })), selectedRangeCoverage && selectedRangeCoverage.widthPercent < 100 && /*#__PURE__*/_react["default"].createElement("div", {
1134
+ style: {
1135
+ position: 'absolute',
1136
+ top: 0,
1137
+ right: 0,
1138
+ width: "".concat(100 - selectedRangeCoverage.widthPercent, "%"),
1139
+ height: "".concat(selectedRangeCoverage.heightPercent, "%"),
1140
+ background: 'rgba(255,255,255,0.96)',
1141
+ pointerEvents: 'none'
1142
+ }
1143
+ }), selectedRangeCoverage && selectedRangeCoverage.heightPercent < 100 && /*#__PURE__*/_react["default"].createElement("div", {
1144
+ style: {
1145
+ position: 'absolute',
1146
+ left: 0,
1147
+ bottom: 0,
1148
+ width: '100%',
1149
+ height: "".concat(100 - selectedRangeCoverage.heightPercent, "%"),
1150
+ background: 'rgba(255,255,255,0.96)',
1151
+ pointerEvents: 'none'
1152
+ }
1153
+ }), selectedRangeCoverage && /*#__PURE__*/_react["default"].createElement("div", {
1154
+ style: {
1155
+ position: 'absolute',
1156
+ left: 0,
1157
+ top: 0,
1158
+ width: "".concat(selectedRangeCoverage.widthPercent, "%"),
1159
+ height: "".concat(selectedRangeCoverage.heightPercent, "%"),
1160
+ border: '2px solid rgba(24, 144, 255, 0.9)',
1161
+ boxSizing: 'border-box',
1162
+ pointerEvents: 'none'
1163
+ }
1164
+ }), splitPlan === null || splitPlan === void 0 || (_splitPlan$sheets2 = splitPlan.sheets) === null || _splitPlan$sheets2 === void 0 ? void 0 : _splitPlan$sheets2.map(function (sheet) {
1165
+ return /*#__PURE__*/_react["default"].createElement("div", {
1166
+ key: sheet.id,
1167
+ style: {
1168
+ position: 'absolute',
1169
+ left: "".concat(sheet.xMm / getPreviewFrameSizeMm(splitPlan).width * 100, "%"),
1170
+ top: "".concat(sheet.yMm / getPreviewFrameSizeMm(splitPlan).height * 100, "%"),
1171
+ width: "".concat(splitPlan.paperWidthMm / getPreviewFrameSizeMm(splitPlan).width * 100, "%"),
1172
+ height: "".concat(splitPlan.paperHeightMm / getPreviewFrameSizeMm(splitPlan).height * 100, "%"),
1173
+ border: '2px dashed #333',
1174
+ boxSizing: 'border-box',
1175
+ pointerEvents: 'none'
1176
+ }
1177
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1178
+ style: {
1179
+ position: 'absolute',
1180
+ top: 4,
1181
+ left: 4,
1182
+ background: 'rgba(255,255,255,0.92)',
1183
+ padding: '0 4px',
1184
+ fontSize: 12
1185
+ }
1186
+ }, sheet.index));
1187
+ })))), /*#__PURE__*/_react["default"].createElement(_antd.Modal, {
1188
+ open: sheetVisible,
1189
+ title: "\u56FE\u5E45\u7ED3\u679C",
1190
+ onCancel: function onCancel() {
1191
+ return setSheetVisible(false);
1192
+ },
1193
+ onOk: handleExportPdf,
1194
+ okText: "\u6253\u5370",
1195
+ cancelText: TextEnum.cancel,
1196
+ width: map.getViewport().clientWidth - 80,
1197
+ centered: true,
1198
+ wrapClassName: "ol-mapprint-modal"
1199
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1200
+ style: {
1201
+ marginBottom: 12
1202
+ }
1203
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Checkbox, {
1204
+ indeterminate: selectedSheetIds.length > 0 && selectedSheetIds.length < sheetImages.length,
1205
+ checked: sheetImages.length > 0 && selectedSheetIds.length === sheetImages.length,
1206
+ onChange: function onChange(e) {
1207
+ return setSelectedSheetIds(e.target.checked ? sheetImages.map(function (item) {
1208
+ return item.id;
1209
+ }) : []);
1210
+ }
1211
+ }, "\u5168\u9009")), /*#__PURE__*/_react["default"].createElement("div", {
1212
+ style: {
1213
+ display: 'grid',
1214
+ gridTemplateColumns: 'repeat(auto-fill, minmax(240px, 1fr))',
1215
+ gap: 16,
1216
+ maxHeight: '70vh',
1217
+ overflow: 'auto'
1218
+ }
1219
+ }, sheetImages.map(function (item) {
1220
+ return /*#__PURE__*/_react["default"].createElement("label", {
1221
+ key: item.id,
1222
+ style: {
1223
+ display: 'block',
1224
+ border: '1px solid #ddd',
1225
+ borderRadius: 6,
1226
+ padding: 12,
1227
+ background: '#fff'
1228
+ }
1229
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1230
+ style: {
1231
+ marginBottom: 8,
1232
+ display: 'flex',
1233
+ alignItems: 'center',
1234
+ gap: 8
1235
+ }
1236
+ }, /*#__PURE__*/_react["default"].createElement(_antd.Checkbox, {
1237
+ checked: selectedSheetIds.includes(item.id),
1238
+ onChange: function onChange(e) {
1239
+ setSelectedSheetIds(function (current) {
1240
+ return e.target.checked ? [].concat(_toConsumableArray(current), [item.id]) : current.filter(function (id) {
1241
+ return id !== item.id;
1242
+ });
1243
+ });
1244
+ }
1245
+ }), /*#__PURE__*/_react["default"].createElement("span", null, "\u7B2C ", item.index, " \u5E45 (", item.row, "-", item.col, ")")), /*#__PURE__*/_react["default"].createElement("img", {
1246
+ src: item.url,
1247
+ alt: "sheet-".concat(item.index),
1248
+ style: {
1249
+ width: '100%',
1250
+ display: 'block',
1251
+ border: '1px solid #eee'
1252
+ }
1253
+ }));
1254
+ }))), /*#__PURE__*/_react["default"].createElement("div", {
1255
+ style: {
1256
+ position: 'absolute',
1257
+ left: '-100000px',
1258
+ top: 0,
1259
+ width: exportSize.width,
1260
+ height: exportSize.height,
1261
+ overflow: 'hidden'
1262
+ }
1263
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1264
+ ref: exportStageRef,
1265
+ style: {
1266
+ width: exportSize.width,
1267
+ height: exportSize.height
1268
+ }
1269
+ }, /*#__PURE__*/_react["default"].createElement(_olMap.Map, {
1270
+ width: "".concat(exportSize.width, "px"),
1271
+ height: "".concat(exportSize.height, "px"),
1272
+ tk: "1adbb6e47668cb33757cd799548bf1f4",
1273
+ hidePopupTable: true,
1274
+ createdMap: handleExportMapCreated
1275
+ }))));
1276
+ }
1277
+ //# sourceMappingURL=index.js.map