my-openlayer 2.3.0 → 2.3.1
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/core/MapTools.d.ts +27 -0
- package/core/MapTools.js +50 -3
- package/package.json +1 -1
package/core/MapTools.d.ts
CHANGED
|
@@ -87,6 +87,29 @@ export default class MapTools {
|
|
|
87
87
|
maxZoom?: number;
|
|
88
88
|
duration?: number;
|
|
89
89
|
}): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* 根据GeoJSON数据定位地图视图
|
|
92
|
+
* @param jsonData GeoJSON格式的数据
|
|
93
|
+
* @param fitOptions fit 参数(可选)
|
|
94
|
+
* @returns true 表示已触发定位;false 表示未得到有效范围或数据无效
|
|
95
|
+
*/
|
|
96
|
+
fitByData(jsonData: MapJSONData, fitOptions?: {
|
|
97
|
+
padding?: [number, number, number, number];
|
|
98
|
+
maxZoom?: number;
|
|
99
|
+
duration?: number;
|
|
100
|
+
}): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* 根据GeoJSON数据定位地图视图(静态方法)
|
|
103
|
+
* @param map 地图实例
|
|
104
|
+
* @param jsonData GeoJSON格式的数据
|
|
105
|
+
* @param fitOptions fit 参数(可选)
|
|
106
|
+
* @returns true 表示已触发定位;false 表示未得到有效范围或数据无效
|
|
107
|
+
*/
|
|
108
|
+
static fitByData(map: Map, jsonData: MapJSONData, fitOptions?: {
|
|
109
|
+
padding?: [number, number, number, number];
|
|
110
|
+
maxZoom?: number;
|
|
111
|
+
duration?: number;
|
|
112
|
+
}): boolean;
|
|
90
113
|
/**
|
|
91
114
|
* 视图自适应到指定图层集合的整体范围(overallExtent)
|
|
92
115
|
* 说明:会取每个图层 source 的 extent,合并后执行 view.fit
|
|
@@ -100,4 +123,8 @@ export default class MapTools {
|
|
|
100
123
|
maxZoom?: number;
|
|
101
124
|
duration?: number;
|
|
102
125
|
}): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* 执行地图定位(内部辅助方法)
|
|
128
|
+
*/
|
|
129
|
+
private static executeFit;
|
|
103
130
|
}
|
package/core/MapTools.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
import VectorSource from "ol/source/Vector";
|
|
2
3
|
import GeoJSON from "ol/format/GeoJSON";
|
|
3
4
|
import { ErrorHandler, ErrorType } from "../utils/ErrorHandler";
|
|
4
5
|
import { ValidationUtils } from "../utils/ValidationUtils";
|
|
@@ -212,6 +213,43 @@ class MapTools {
|
|
|
212
213
|
fitToLayers(layerNameOrLayers, fitOptions) {
|
|
213
214
|
return MapTools.fitToLayers(this.map, layerNameOrLayers, fitOptions);
|
|
214
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* 根据GeoJSON数据定位地图视图
|
|
218
|
+
* @param jsonData GeoJSON格式的数据
|
|
219
|
+
* @param fitOptions fit 参数(可选)
|
|
220
|
+
* @returns true 表示已触发定位;false 表示未得到有效范围或数据无效
|
|
221
|
+
*/
|
|
222
|
+
fitByData(jsonData, fitOptions) {
|
|
223
|
+
return MapTools.fitByData(this.map, jsonData, fitOptions);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 根据GeoJSON数据定位地图视图(静态方法)
|
|
227
|
+
* @param map 地图实例
|
|
228
|
+
* @param jsonData GeoJSON格式的数据
|
|
229
|
+
* @param fitOptions fit 参数(可选)
|
|
230
|
+
* @returns true 表示已触发定位;false 表示未得到有效范围或数据无效
|
|
231
|
+
*/
|
|
232
|
+
static fitByData(map, jsonData, fitOptions) {
|
|
233
|
+
if (!map) {
|
|
234
|
+
throw new Error('Map instance is required');
|
|
235
|
+
}
|
|
236
|
+
if (!jsonData) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
try {
|
|
240
|
+
const features = new GeoJSON().readFeatures(jsonData);
|
|
241
|
+
if (!features || features.length === 0) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
const source = new VectorSource({ features });
|
|
245
|
+
const extent = source.getExtent();
|
|
246
|
+
return MapTools.executeFit(map, extent, fitOptions, 'Error fitting view to data');
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
ErrorHandler.getInstance().error('Error fitting view to data:', error);
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
215
253
|
/**
|
|
216
254
|
* 视图自适应到指定图层集合的整体范围(overallExtent)
|
|
217
255
|
* 说明:会取每个图层 source 的 extent,合并后执行 view.fit
|
|
@@ -249,11 +287,20 @@ class MapTools {
|
|
|
249
287
|
ErrorHandler.getInstance().error('Error calculating layer extent:', error);
|
|
250
288
|
}
|
|
251
289
|
});
|
|
252
|
-
if (!hasValidExtent
|
|
290
|
+
if (!hasValidExtent) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
return MapTools.executeFit(map, overallExtent, fitOptions, 'Error fitting view to extent');
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* 执行地图定位(内部辅助方法)
|
|
297
|
+
*/
|
|
298
|
+
static executeFit(map, extent, fitOptions, errorMessage = 'Error fitting view') {
|
|
299
|
+
if (!extent || isEmpty(extent)) {
|
|
253
300
|
return false;
|
|
254
301
|
}
|
|
255
302
|
try {
|
|
256
|
-
map.getView().fit(
|
|
303
|
+
map.getView().fit(extent, {
|
|
257
304
|
padding: fitOptions?.padding ?? [200, 200, 200, 200],
|
|
258
305
|
maxZoom: fitOptions?.maxZoom ?? 14,
|
|
259
306
|
duration: fitOptions?.duration ?? 1500,
|
|
@@ -261,7 +308,7 @@ class MapTools {
|
|
|
261
308
|
return true;
|
|
262
309
|
}
|
|
263
310
|
catch (error) {
|
|
264
|
-
ErrorHandler.getInstance().error(
|
|
311
|
+
ErrorHandler.getInstance().error(errorMessage, error);
|
|
265
312
|
return false;
|
|
266
313
|
}
|
|
267
314
|
}
|