@3clear/basegis 0.1.6 → 0.1.8
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/README.md +120 -34
- package/dist/WindDataGrid-DA9pzsfX.js +508 -0
- package/dist/assets.js +5 -5
- package/dist/basegis.js +4684 -3278
- package/dist/{basemap.config-Bs1PwVYt.js → basemap.config-CtXrS74D.js} +22 -17
- package/dist/layers.js +23 -23
- package/dist/methods.js +1454 -1133
- package/package.json +1 -1
- package/dist/WindDataGrid-B1KZflZc.js +0 -438
package/README.md
CHANGED
|
@@ -498,6 +498,9 @@ onMounted(() => {
|
|
|
498
498
|
// 也可以传 container: HTMLElement。
|
|
499
499
|
containerId: 'map',
|
|
500
500
|
config: {
|
|
501
|
+
// 地图 / 底图投影与无元数据栅格默认源投影分开配置。
|
|
502
|
+
crs: 'EPSG:3857',
|
|
503
|
+
sourceProjectionCrs: 'EPSG:3857',
|
|
501
504
|
view: {
|
|
502
505
|
// 可选 2d / 2.5d / 3d。
|
|
503
506
|
defaultSceneMode: '3d',
|
|
@@ -571,7 +574,7 @@ onBeforeUnmount(() => {
|
|
|
571
574
|
| 配置入口 | 适用场景 | 是否写入运行时配置 | 是否立即重建地图 |
|
|
572
575
|
| --- | --- | --- | --- |
|
|
573
576
|
| `new BaseGIS({ ... })` | 创建实例并设置默认引擎、容器和整套配置。 | 是 | 否,仍需调用 `init()`。 |
|
|
574
|
-
| `init(options)` |
|
|
577
|
+
| `init(options)` | 创建或重新创建地图,并单次覆盖容器、引擎、CRS、场景模式或初始视角。 | `engineType` 会写入;`crs / sceneMode / initialView` 不写入。 | 是 |
|
|
575
578
|
| `setConfig(config)` | 修改实例保存的配置,供后续初始化或配置查询使用。 | 是 | 否 |
|
|
576
579
|
|
|
577
580
|
### 构造参数
|
|
@@ -581,6 +584,8 @@ const mapCore = new BaseGIS({
|
|
|
581
584
|
engineType: 'cesium',
|
|
582
585
|
containerId: 'map',
|
|
583
586
|
config: {
|
|
587
|
+
crs: 'EPSG:3857',
|
|
588
|
+
sourceProjectionCrs: 'EPSG:3857',
|
|
584
589
|
view: {
|
|
585
590
|
defaultSceneMode: '3d',
|
|
586
591
|
initialView: {
|
|
@@ -602,7 +607,8 @@ const mapCore = new BaseGIS({
|
|
|
602
607
|
| `container` | `HTMLElement \| string` | - | 地图容器 DOM,也兼容传容器 id 字符串。 |
|
|
603
608
|
| `containerId` | `string` | - | 地图容器 id。与 `container` 二选一即可。 |
|
|
604
609
|
| `config` | `Object` | 内置配置 | 推荐的配置入口,与内置配置做深合并。 |
|
|
605
|
-
| `
|
|
610
|
+
| `crs / sourceProjectionCrs` | `string` | 见下文 | 分别表示地图 / 底图投影和无元数据栅格的默认源投影,支持 `EPSG:4326` / `EPSG:3857`。 |
|
|
611
|
+
| `engine / view / basemap / dem / sourceTransport` | `Object` | - | 兼容直接写在构造参数顶层;`crs / sourceProjectionCrs` 也可如此传入。推荐统一放入 `config`,同名时 `config` 中的值优先。 |
|
|
606
612
|
|
|
607
613
|
### `init(options)` 参数与优先级
|
|
608
614
|
|
|
@@ -611,6 +617,7 @@ const result = mapCore.init({
|
|
|
611
617
|
// 都是选填;构造时已经设置过的内容不需要重复传。
|
|
612
618
|
containerId: 'map',
|
|
613
619
|
engineType: 'cesium',
|
|
620
|
+
crs: 'EPSG:3857',
|
|
614
621
|
sceneMode: '3d',
|
|
615
622
|
initialView: {
|
|
616
623
|
center: [104, 35],
|
|
@@ -630,6 +637,7 @@ if (!result.success) {
|
|
|
630
637
|
| `container` | `HTMLElement \| string` | 本次使用的容器 DOM 或容器 id,优先级最高。 |
|
|
631
638
|
| `containerId` | `string` | 本次使用的容器 id。 |
|
|
632
639
|
| `engineType` | `'cesium' \| 'leaflet'` | 本次使用的引擎,同时更新实例保存的 `engine.active`。 |
|
|
640
|
+
| `crs` | `'EPSG:4326' \| 'EPSG:3857'` | 本次创建地图使用的 CRS;只覆盖本次初始化,不写回 `config.crs`。 |
|
|
633
641
|
| `sceneMode` | `'2d' \| '2.5d' \| '3d'` | 本次初始化的场景模式;Leaflet 只支持 `2d`。不会写回 `config.view.defaultSceneMode`。 |
|
|
634
642
|
| `initialView` | `Object` | 本次初始化的视角。不会写回 `config.view.initialView`。 |
|
|
635
643
|
|
|
@@ -641,6 +649,7 @@ if (!result.success) {
|
|
|
641
649
|
| --- | --- |
|
|
642
650
|
| 容器 | `init.container` → `init.containerId` → 构造函数 `container` → 构造函数 `containerId` |
|
|
643
651
|
| 引擎 | `init.engineType` → 实例当前引擎(由构造函数 `engineType` 或 `config.engine.active` 得到)→ `cesium` |
|
|
652
|
+
| 地图 CRS | `init.crs` → `config.crs` → 旧版引擎默认(Leaflet `EPSG:4326`,Cesium `EPSG:3857`) |
|
|
644
653
|
| 场景模式 | Cesium:`init.sceneMode` → `config.view.defaultSceneMode` → `3d`;Leaflet 始终为 `2d` |
|
|
645
654
|
| 初始视角 | `init.initialView` → `config.view.initialView` → 引擎内置安全视角 |
|
|
646
655
|
|
|
@@ -656,16 +665,29 @@ if (result.success) {
|
|
|
656
665
|
|
|
657
666
|
### 完整配置分组
|
|
658
667
|
|
|
659
|
-
`config`
|
|
668
|
+
`config` 顶层包含两个 CRS 值和以下五个配置分组。页面不要直接依赖包内部的 `src/gis/config` 文件;需要查看当前实例最终合并后的配置时,使用 `mapCore.getConfig()`。
|
|
660
669
|
|
|
661
|
-
|
|
|
670
|
+
| 配置项 / 组 | 用途 | 主要生效时机 |
|
|
662
671
|
| --- | --- | --- |
|
|
672
|
+
| `crs` | 地图平面投影与底图瓦片矩阵。 | `init()` / 重新 `init()` |
|
|
673
|
+
| `sourceProjectionCrs` | 无 CRS 元数据栅格的默认源投影。 | 后续创建或更新栅格图层时 |
|
|
663
674
|
| `engine` | 默认引擎、引擎接入元数据及 Cesium 渲染质量。 | `init()` / 重新 `init()` |
|
|
664
675
|
| `view` | 默认场景模式和初始视角。 | `init()` / 重新 `init()` |
|
|
665
676
|
| `basemap` | 初始底图、可切换底图列表及内置服务元数据。 | `init()`;列表也供 `setBasemapById()` 查询 |
|
|
666
677
|
| `dem` | Cesium 默认地形及可切换地形列表。 | Cesium `init()`;列表也供 `loadDEMById()` 查询 |
|
|
667
678
|
| `sourceTransport` | 源解析传输图层的实例级默认视觉参数。 | 创建 adapter 时锁定;`setConfig()` 后需重新 `init()`,新 adapter 创建图层时才会读取 |
|
|
668
679
|
|
|
680
|
+
#### `crs` 与 `sourceProjectionCrs`
|
|
681
|
+
|
|
682
|
+
| 配置项 | 内置默认值 | 说明 |
|
|
683
|
+
| --- | --- | --- |
|
|
684
|
+
| `crs` | `''` | 地图平面和底图瓦片矩阵;空值保留旧版引擎默认,Leaflet 为 `EPSG:4326`,Cesium 为 `EPSG:3857`。 |
|
|
685
|
+
| `sourceProjectionCrs` | `'EPSG:4326'` | PNG / JPG / 灰度图 / 数值网格不携带 CRS 元数据时的默认源投影。 |
|
|
686
|
+
|
|
687
|
+
两个值独立:修改底图 `crs` 不会重新解释栅格数据,修改 `sourceProjectionCrs` 也不会改变底图矩阵。`area`、视角以及点线面业务坐标始终使用 WGS84 经纬度。Cesium 中 `crs` 控制 2D / Columbus 平面投影和内置底图矩阵,不改变 3D 地球的 WGS84 坐标。
|
|
688
|
+
|
|
689
|
+
栅格源投影的取值顺序是:单个数据源的 `sourceProjectionCrs`(兼容旧名 `sourceProjection`)→ GeoTIFF 可识别 GeoKey → BaseGIS `sourceProjectionCrs` → 内置 `EPSG:4326`。GeoTIFF 已声明但当前不支持的 CRS 会返回错误,不会被全局默认值覆盖。修改 `crs` 后必须重新 `init()`;修改 `sourceProjectionCrs` 只影响之后新建或重新加载且没有显式投影的栅格,不会自动重解释已加载数据。
|
|
690
|
+
|
|
669
691
|
#### `engine` 引擎配置
|
|
670
692
|
|
|
671
693
|
| 配置项 | 内置默认值 | 说明 |
|
|
@@ -721,6 +743,9 @@ Leaflet 不加载 DEM。`cesium-world-terrain` 需要 Cesium Ion 能力;`tiand
|
|
|
721
743
|
const mapCore = new BaseGIS({
|
|
722
744
|
containerId: 'map',
|
|
723
745
|
config: {
|
|
746
|
+
// 地图瓦片与无元数据栅格的默认投影分开管理。
|
|
747
|
+
crs: 'EPSG:3857',
|
|
748
|
+
sourceProjectionCrs: 'EPSG:3857',
|
|
724
749
|
engine: {
|
|
725
750
|
active: 'cesium',
|
|
726
751
|
cesium: {
|
|
@@ -831,7 +856,7 @@ mapCore.setConfig({
|
|
|
831
856
|
|
|
832
857
|
### `setConfig()` 怎么用
|
|
833
858
|
|
|
834
|
-
`setConfig(overrideConfig)`
|
|
859
|
+
`setConfig(overrideConfig)` 是同步方法,没有统一结果对象或其他返回值。它只更新 `BaseGIS` 实例保存的配置,不会把新配置推送给已经创建的 adapter,也不会自动改变当前场景、视角、底图、DEM 或渲染质量。`crs / sourceProjectionCrs` 会归一化为 BaseGIS 支持的名称;修改 `crs` 后需重新 `init()`,修改 `sourceProjectionCrs` 只作为后续新数据的回退值。`engine.active` 是另一个需要特别注意的字段:它会同步实例记录的引擎类型,但不会真正替换当前底层地图。
|
|
835
860
|
|
|
836
861
|
需要让整套初始化配置生效时,直接再次 `init()`,不要先调用 `destroy()`;否则托管图层快照会被清空:
|
|
837
862
|
|
|
@@ -909,6 +934,7 @@ basemap: {
|
|
|
909
934
|
- `tianditu-terrain` 是天地图地形底图瓦片,不是 Cesium 的 DEM 高程地形;如果要控制 Cesium terrainProvider,请看后文 DEM。
|
|
910
935
|
- `geoserver-wmts-sample` 和 `geoserver-wms-sample` 默认 `enabled: false`,只是配置格式示例;如果要作为默认底图,需要替换真实服务地址并改为 `enabled: true`。
|
|
911
936
|
- 天地图 provider 内置资源还包括 `imageryLabel`;默认 `basemap.list` 没有单独注册影像注记 id,但 `resourceKey: 'imagery'` 会自动推断使用 `imageryLabel` 注记。
|
|
937
|
+
- 内置天地图会根据地图 `crs` 选择 `_c` 或 `_w` 瓦片矩阵;自定义 XYZ / WMTS / WMS 的 URL 和矩阵必须由业务保证与地图 `crs` 一致。地图已创建后不能通过普通底图切换改变 CRS,必须修改配置并重新 `init()`。
|
|
912
938
|
|
|
913
939
|
### 底图切换
|
|
914
940
|
|
|
@@ -2345,6 +2371,9 @@ const imageLayer = new ImageLayerController({
|
|
|
2345
2371
|
// 选填:默认图片类型。color 表示图片已经填色;grayscale 表示灰度图需要运行时着色。
|
|
2346
2372
|
imageSourceType: 'color',
|
|
2347
2373
|
|
|
2374
|
+
// 普通图片未单独配置时,继承 mapCore 的 sourceProjectionCrs。
|
|
2375
|
+
// 同一批数据不需要在每次 update 中重复声明。
|
|
2376
|
+
|
|
2348
2377
|
// 选填:默认小数位,网格标注或探针显示数值时使用。
|
|
2349
2378
|
decimalPlaces: 2,
|
|
2350
2379
|
})
|
|
@@ -2377,6 +2406,9 @@ await imageLayer.update({
|
|
|
2377
2406
|
endLat: 54,
|
|
2378
2407
|
},
|
|
2379
2408
|
|
|
2409
|
+
// 选填:只有这张图与 BaseGIS 默认不同时才覆盖;area 仍是 WGS84。
|
|
2410
|
+
sourceProjectionCrs: 'EPSG:4326',
|
|
2411
|
+
|
|
2380
2412
|
// 选填:color 表示图片本身已经填色,不需要再按色带处理。
|
|
2381
2413
|
imageSourceType: 'color',
|
|
2382
2414
|
|
|
@@ -2636,10 +2668,8 @@ imageLayer.destroy({ layerId: 'radar-image' })
|
|
|
2636
2668
|
| `name` | 选填 | 当前数据名称,便于页面展示。 |
|
|
2637
2669
|
| `imageUrl` | 普通图片、灰度图、图片+TIF 必填 | 图片地址。仅 TIF 模式建议传空字符串清掉旧图片。 |
|
|
2638
2670
|
| `tifUrl` | 仅 TIF、图片+TIF 必填 | GeoTIFF 数值地址,用于鼠标探针或网格注记,不会单独生成彩色图片底图。 |
|
|
2639
|
-
| `area` | 传 `imageUrl` 时必填 |
|
|
2640
|
-
| `sourceProjection` | 选填 |
|
|
2641
|
-
| `sourceArea` | 选填 | 源图片范围,默认使用 `area`;支持墨卡托米坐标范围或经纬度范围。 |
|
|
2642
|
-
| `targetProjection` | 选填 | 默认从地图 CRS 推断;源投影与目标相同则不重采样。 |
|
|
2671
|
+
| `area` | 传 `imageUrl` 时必填 | WGS84 经纬度范围:`startLon / startLat / endLon / endLat`;不随图片或底图投影改变。 |
|
|
2672
|
+
| `sourceProjectionCrs` / `sourceProjection` | 选填 | 普通图片像素的排列投影,支持 `EPSG:4326`、`EPSG:3857`;不传时继承 BaseGIS `sourceProjectionCrs`。前者是推荐名称,后者保留兼容。 |
|
|
2643
2673
|
| `imageSourceType` | 灰度图必填,其他选填 | `color` 表示已填色图片;`grayscale` 表示灰度图。 |
|
|
2644
2674
|
| `colorize` | 灰度图必填 | 灰度图业务值和色带配置。 |
|
|
2645
2675
|
| `colorize.minValue` | 灰度图必填 | 色带映射最小值。 |
|
|
@@ -2656,7 +2686,7 @@ imageLayer.destroy({ layerId: 'radar-image' })
|
|
|
2656
2686
|
| `gridTotal` | 选填 | 切片网格数量。 |
|
|
2657
2687
|
| `tileSize` | 选填 | 切片尺寸。 |
|
|
2658
2688
|
|
|
2659
|
-
|
|
2689
|
+
页面只声明源投影,不需要传目标投影。未传时使用 BaseGIS `sourceProjectionCrs`,单个图层的 `sourceProjectionCrs`(兼容 `sourceProjection`)优先。Cesium 和 Leaflet 都会以当前地图 `crs` 为目标:投影相同直接使用原图,投影不同时做一次纬度方向逆向重采样;相同 URL、范围和处理参数在当前页面生命周期内复用缓存。目标为 EPSG:4326 时 Cesium 使用 `SingleTileImageryProvider`,目标为 EPSG:3857 时使用单级 WebMercator Provider。图片重采样、灰度着色和左右换位依赖 Canvas 读取像素,跨域图片需要服务端允许 CORS。
|
|
2660
2690
|
|
|
2661
2691
|
<a id="grid-layer-controller"></a>
|
|
2662
2692
|
|
|
@@ -2668,9 +2698,9 @@ imageLayer.destroy({ layerId: 'radar-image' })
|
|
|
2668
2698
|
|
|
2669
2699
|
| 数据模式 | 核心字段 | 数据契约 |
|
|
2670
2700
|
| --- | --- | --- |
|
|
2671
|
-
| GeoTIFF | `tifUrl` | `.tif/.tiff`
|
|
2672
|
-
| 灰度图 | `imageUrl/grayImageUrl + area` |
|
|
2673
|
-
| 直接数值网格 | `imageGridData` | `{ values, width, height, area
|
|
2701
|
+
| GeoTIFF | `tifUrl` | `.tif/.tiff` 地址;读取第一个栅格波段、文件范围和投影 GeoKey。 |
|
|
2702
|
+
| 灰度图 | `imageUrl/grayImageUrl + area` | 浏览器可解码的灰度图;`area` 是 WGS84 经纬度,像素行投影默认继承 BaseGIS `sourceProjectionCrs`。 |
|
|
2703
|
+
| 直接数值网格 | `imageGridData` | `{ values, width, height, area/bbox, projection?, bboxProjection? }`;`values` 必须是长度不小于 `width * height` 的一维数组或 TypedArray。 |
|
|
2674
2704
|
|
|
2675
2705
|
```js
|
|
2676
2706
|
import { GridLayerController } from '@3clear/basegis/methods'
|
|
@@ -2685,6 +2715,8 @@ const gridLayer = new GridLayerController({
|
|
|
2685
2715
|
|
|
2686
2716
|
await gridLayer.loadTif({
|
|
2687
2717
|
tifUrl: '/data/grid/temp.tif',
|
|
2718
|
+
// 文件没有可靠 CRS GeoKey 时可显式声明;有 GeoKey 时通常无需传。
|
|
2719
|
+
sourceProjectionCrs: 'EPSG:3857',
|
|
2688
2720
|
})
|
|
2689
2721
|
|
|
2690
2722
|
await gridLayer.loadGrayImage({
|
|
@@ -2739,6 +2771,8 @@ gridLayer.destroy()
|
|
|
2739
2771
|
|
|
2740
2772
|
灰度图要表达真实业务值时,应显式传入 `minValue / maxValue`。数值图层不使用色带绘制背景;如果需要同时显示彩色图片,请使用 `ImageLayerController`。
|
|
2741
2773
|
|
|
2774
|
+
投影判定顺序是:单个数据源的 `sourceProjectionCrs`(兼容 `sourceProjection`)、GeoTIFF 文件的投影 / 经纬度 GeoKey、BaseGIS `sourceProjectionCrs`、内置 EPSG:4326。GeoTIFF 已声明但不支持的投影会返回友好错误,不会被全局值覆盖。采样时会把鼠标经纬度转换到栅格 bbox 的坐标系,不会为探针重复转换整份 TIF。直接数值网格中,`projection` 描述像元排列,未传时继承 BaseGIS 默认;`bboxProjection` 单独描述 bbox 坐标单位,使用 WGS84 `area` 时固定为 EPSG:4326。
|
|
2775
|
+
|
|
2742
2776
|
### 方法
|
|
2743
2777
|
|
|
2744
2778
|
| 方法 | 说明 |
|
|
@@ -4408,14 +4442,16 @@ if (!result.success) {
|
|
|
4408
4442
|
await rasterContour.update({ interval: 2 })
|
|
4409
4443
|
```
|
|
4410
4444
|
|
|
4411
|
-
GeoTIFF 依赖宿主页面提供 `window.GeoTIFF`。控制器会读取波段、尺寸、坐标系和范围;当前原生支持 EPSG:4326、EPSG:3857
|
|
4445
|
+
GeoTIFF 依赖宿主页面提供 `window.GeoTIFF`。控制器会读取波段、尺寸、坐标系和范围;当前原生支持 EPSG:4326、EPSG:3857。文件 GeoKey 优先于 BaseGIS `sourceProjectionCrs` 回退值,只有缺少可用 CRS 元数据时才使用全局值;单份数据仍可显式覆盖。其他投影(如 UTM)需先在数据生产环节转换为这两种投影之一,只传 WGS84 `area` 不能代替真实的栅格重投影。
|
|
4412
4446
|
|
|
4413
4447
|
### 灰度图
|
|
4414
4448
|
|
|
4415
4449
|
```js
|
|
4416
4450
|
await rasterContour.loadGrayImage({
|
|
4417
4451
|
grayImageUrl: '/data/pressure-gray.png',
|
|
4418
|
-
area: [
|
|
4452
|
+
area: [73, 4, 135, 54],
|
|
4453
|
+
// 只有这份数据与 BaseGIS 默认不同时才需要覆盖。
|
|
4454
|
+
sourceProjectionCrs: 'EPSG:3857',
|
|
4419
4455
|
grayMinValue: 0,
|
|
4420
4456
|
grayMaxValue: 255,
|
|
4421
4457
|
minValue: 960,
|
|
@@ -4432,7 +4468,7 @@ await rasterContour.loadGrayImage({
|
|
|
4432
4468
|
* (maxValue - minValue) + minValue
|
|
4433
4469
|
```
|
|
4434
4470
|
|
|
4435
|
-
|
|
4471
|
+
灰度图片本身没有地理范围、CRS 和业务值含义,因此 `area` 必填,像素投影未传时继承 BaseGIS `sourceProjectionCrs`(其内置默认为 EPSG:4326);要表达真实数据,还应传正确的灰度范围与业务值范围。控制器只读取一次灰度值,生成线时按像素投影直接反算为 WGS84 坐标,不会为 Cesium / Leaflet 分别重采样整张图。已经着色的彩色 PNG 不能反推出原始业务值,应使用对应 TIF 或直接传数值网格。
|
|
4436
4472
|
|
|
4437
4473
|
上例虽然使用了气压值域,但 `centerDetection` 默认关闭,因此只生成普通等压线和线值标签。需要 H/L 中心时,按下方“自动检测 H/L 中心”配置显式开启。
|
|
4438
4474
|
|
|
@@ -4475,7 +4511,9 @@ await rasterContour.loadGrid({
|
|
|
4475
4511
|
| `values/data/grid` | `Array/TypedArray` | 数值网格必填 | - | 一维或二维数值。 |
|
|
4476
4512
|
| `width/height` | `number` | 一维网格必填 | `0` | 一维数组的网格尺寸。 |
|
|
4477
4513
|
| `area` | `object/number[]` | 图片和普通网格必填 | `null` | WGS84 范围;数组顺序为 `[west,south,east,north]`。 |
|
|
4478
|
-
| `sourceProjection` | `string` | 否 |
|
|
4514
|
+
| `sourceProjectionCrs/sourceProjection` | `string` | 否 | TIF GeoKey → BaseGIS `sourceProjectionCrs` | 灰度图/网格像元的排列投影,支持 `EPSG:4326`、`EPSG:3857`;前者是推荐名称,后者保留兼容。 |
|
|
4515
|
+
| `projection` | `string` | 否 | BaseGIS `sourceProjectionCrs` | 直接数值网格的像元排列投影别名。 |
|
|
4516
|
+
| `bboxProjection` | `string` | 否 | 使用 `area` 时为 `EPSG:4326`,否则跟随像元投影 | 使用 `bbox` 时声明 bbox 的坐标单位;使用 WGS84 `area` 时固定为 `EPSG:4326`。 |
|
|
4479
4517
|
| `noDataValue` | `number` | 否 | TIF 自动读取 | 指定无效值;灰度图不传时仅透明像素无效。 |
|
|
4480
4518
|
| `validMin/validMax` | `number` | 否 | - | 过滤值域外数据。 |
|
|
4481
4519
|
| `scale/offset` | `number` | 否 | `1/0` | 数值换算为 `value * scale + offset`。 |
|
|
@@ -4488,8 +4526,10 @@ await rasterContour.loadGrid({
|
|
|
4488
4526
|
| `thresholds/levels` | `number[]` | 三选一 | - | 显式等值线级别,仅保留实际值域内的值。 |
|
|
4489
4527
|
| `interval/contourInterval` | `number` | 三选一 | - | 固定等值距。 |
|
|
4490
4528
|
| `thresholdCount/levelCount` | `number` | 三选一 | `12` | 自动均分级别数量,范围 1~100。 |
|
|
4491
|
-
| `smooth` | `boolean` | 否 | `true` |
|
|
4529
|
+
| `smooth` | `boolean` | 否 | `true` | 是否使用 d3 的边上线性插值定位等值点;与高斯滤波、Chaikin 开关独立。 |
|
|
4492
4530
|
| `smoothingIterations` | `number` | 否 | `0` | Chaikin 补点平滑次数,范围 0~3;气象格点通常取 1~2,次数越高,点数越多。 |
|
|
4531
|
+
| `gridSmoothing` | `object` | 否 | 见下表 | 提线前的可分离高斯滤波;默认关闭,保留原始网格与 NoData。 |
|
|
4532
|
+
| `wrapLongitude` | `boolean` | 否 | `false` | 对经度跨度为 360°(容差 0.001°)的栅格启用周期取样、补列、完整线拼接和平滑;区域数据不启用。 |
|
|
4493
4533
|
| `excludeBoundary` | `boolean` | 否 | `true` | 去掉 d3 面边界中贴着栅格四边的伪矩形线。 |
|
|
4494
4534
|
| `maxCells` | `number` | 否 | `1000000` | 超过该像元数时先等比例抽样,避免大图阻塞页面。 |
|
|
4495
4535
|
| `minimumLinePoints` | `number` | 否 | `3` | 最短线点数,用于过滤栅格四角的两点补边。 |
|
|
@@ -4499,24 +4539,60 @@ await rasterContour.loadGrid({
|
|
|
4499
4539
|
|
|
4500
4540
|
级别选择优先级为 `thresholds` → `interval` → `thresholdCount`。显式传入 `thresholds` 时,只保留实际值域内的级别。
|
|
4501
4541
|
|
|
4542
|
+
### 格点平滑与全球接缝
|
|
4543
|
+
|
|
4544
|
+
| `gridSmoothing` 参数 | 默认值 | 说明 |
|
|
4545
|
+
| --- | --- | --- |
|
|
4546
|
+
| `enabled` | `false` | 显式开启格点高斯滤波。 |
|
|
4547
|
+
| `radius` | `2` | 邻域半径,以 `maxCells` 降采样后的格点为单位,取整并限制为 0~6;0 跳过滤波。 |
|
|
4548
|
+
| `sigma` | `null` | 正数;省略、null 或非正数时自动取 `Math.max(radius / 2, 0.8)`,单位同样为格点。 |
|
|
4549
|
+
| `passes` | `1` | 水平和垂直方向各处理一次为一轮,取整并限制为 1~3 轮。 |
|
|
4550
|
+
|
|
4551
|
+
```js
|
|
4552
|
+
await rasterContour.loadGrid({
|
|
4553
|
+
values, width, height, area,
|
|
4554
|
+
interval: 2,
|
|
4555
|
+
maxCells: 360000,
|
|
4556
|
+
gridSmoothing: { enabled: true, radius: 2, sigma: null, passes: 1 },
|
|
4557
|
+
smooth: true,
|
|
4558
|
+
smoothingIterations: 1,
|
|
4559
|
+
wrapLongitude: true,
|
|
4560
|
+
})
|
|
4561
|
+
|
|
4562
|
+
// 嵌套参数按字段合并,保留 enabled / passes;sigma 为 null 时随半径自动调整。
|
|
4563
|
+
await rasterContour.update({ gridSmoothing: { radius: 3 } })
|
|
4564
|
+
// 关闭额外平滑,仍保留等值点线性插值和全球接缝连续性。
|
|
4565
|
+
await rasterContour.update({ gridSmoothing: { enabled: false }, smoothingIterations: 0 })
|
|
4566
|
+
// 标签、样式和渲染简化更新直接复用已有等值线。
|
|
4567
|
+
await rasterContour.update({ showLabel: false, smoothFactor: 0.15 })
|
|
4568
|
+
```
|
|
4569
|
+
|
|
4570
|
+
处理顺序是原始网格 → 降采样 → 高斯滤波 → 全球补列(可选)→ d3 提线 → 拼接完整周期线(可选)→ Chaikin → 短线过滤 → 裁切和坐标取整。周期线在拼接前保留精度,避免低 `coordinatePrecision` 合并不同接缝端点;只按完整曲线判断 `minimumLinePoints`,切回边界后的片段允许小于该长度。源数据为 0°~360° 且需要左右半幅交换时,继续使用 `isSplit: true`。
|
|
4571
|
+
|
|
4572
|
+
滤波跳过无效邻点并重新归一化权重,原始 NoData 中心保持为空。`getRasterData()` 始终返回未经高斯滤波、未经周期补列的标准原始网格,反复调参不会累积平滑。高斯改变用于提线的数值场,Chaikin 调整线形,因此输出是平滑后的近似等值线。H/L 的 `closed-contour` 模式共用降采样和高斯滤波后的标量场;原 `neighborhood` 模式仍独立使用原始网格和 `centerDetection.smoothingIterations`。
|
|
4573
|
+
|
|
4574
|
+
`test-page-18` 的“平滑与接缝”“高 / 低值中心”“计算与渲染控制”面板可调整上述参数,滑杆松开时自动应用,并显示当前配置 JSON、中心筛选统计、线点数与耗时。演示数据为 ECMWF 海平面气压灰度图(`2026091015`),值差单位是 hPa;灰度 0~255 对应 950.9156494140625~1040.6756591796875 hPa。计算目前仍在主线程执行;可以通过 `maxCells` 和迭代次数限制开销。
|
|
4575
|
+
|
|
4502
4576
|
### 自动检测 H/L 中心
|
|
4503
4577
|
|
|
4504
|
-
|
|
4578
|
+
该能力默认关闭。它从数值网格查找局部极大值(H)和局部极小值(L),支持原邻域均值模式和闭合值差模式;仅在需要表达高低值中心时开启。下面是全球气压数据的闭合值差配置示例,输入单位为 hPa:
|
|
4505
4579
|
|
|
4506
4580
|
```js
|
|
4507
4581
|
await rasterContour.loadGrid({
|
|
4508
4582
|
values: pressureValues,
|
|
4509
4583
|
width,
|
|
4510
4584
|
height,
|
|
4511
|
-
area: [
|
|
4512
|
-
|
|
4585
|
+
area: [-180, -90, 180, 90],
|
|
4586
|
+
wrapLongitude: true,
|
|
4587
|
+
interval: 2,
|
|
4588
|
+
gridSmoothing: { enabled: true, radius: 2, sigma: null, passes: 1 },
|
|
4513
4589
|
showLabel: true,
|
|
4514
4590
|
centerDetection: {
|
|
4515
4591
|
enabled: true,
|
|
4516
|
-
|
|
4517
|
-
minProminence:
|
|
4518
|
-
|
|
4519
|
-
maxCount:
|
|
4592
|
+
method: 'closed-contour',
|
|
4593
|
+
minProminence: 1,
|
|
4594
|
+
minDistanceKm: 250,
|
|
4595
|
+
maxCount: 256,
|
|
4520
4596
|
},
|
|
4521
4597
|
centerAnnotation: {
|
|
4522
4598
|
visible: true,
|
|
@@ -4530,15 +4606,23 @@ await rasterContour.loadGrid({
|
|
|
4530
4606
|
| `centerDetection` 参数 | 默认值 | 说明 |
|
|
4531
4607
|
| --- | --- | --- |
|
|
4532
4608
|
| `enabled` | `false` | 开启 H/L 自动检测。 |
|
|
4533
|
-
| `
|
|
4534
|
-
| `minProminence` | `2` |
|
|
4535
|
-
| `
|
|
4536
|
-
| `maxCount` | `12` | H/L
|
|
4609
|
+
| `method` | `'neighborhood'` | `'neighborhood'` 保留原邻域均值筛选;`'closed-contour'` 检查闭合值差。 |
|
|
4610
|
+
| `minProminence` | `2` | 单位与输入网格一致。闭合模式中是最小闭合值差;邻域模式中是中心与邻域均值的差。 |
|
|
4611
|
+
| `minDistanceKm` | `250` | 仅闭合模式:同类中心最小球面距离,单位 km;`0` 关闭距离筛选,距离过近时优先保留更高的 H 或更低的 L。 |
|
|
4612
|
+
| `maxCount` | `12` | 全部 H/L 合计最大输出数;全球图建议显式提高并通过诊断计数检查是否触及上限。闭合模式按 H/L 交替取数,各类型内部按更高 H、更低 L 排序。 |
|
|
4537
4613
|
| `includeHigh/includeLow` | `true/true` | 是否输出 H 或 L。 |
|
|
4538
|
-
| `
|
|
4539
|
-
| `
|
|
4614
|
+
| `radius` | `6` | 仅邻域模式:计算邻域均值的网格半径。 |
|
|
4615
|
+
| `minGridDistance` | `20` | 仅邻域模式:同类中心的最小网格距离。 |
|
|
4616
|
+
| `excludeBoundary` | `true` | 仅邻域模式:排除贴近边界或 NoData 空洞的候选。闭合模式始终排除开口。 |
|
|
4617
|
+
| `smoothingIterations` | `1` | 仅邻域模式:独立的 3×3 有效值平滑次数,范围 0~3。闭合模式共用顶层 `gridSmoothing`,不额外平滑。 |
|
|
4618
|
+
|
|
4619
|
+
闭合模式先合并八连通的同值平台,每个平台只保留一个位于平台内部、接近平台中心的代表点,再检查整个边界是否满足局部极值。从 H 向外下降 `minProminence`、从 L 向外上升 `minProminence`,用漫水检查这段值差范围内是否遇到区域边界、缺测区或更强的同类中心。出现开口、或在达到阈值之前并入更强中心则过滤;恰好在阈值处合并允许通过。独立同值极值若在阈值内相连,只保留一个。它检查的是给定值差下的闭合性和合并通路,不输出完整的等值线树或真实鞍点显著度,也不要求当前 `thresholds` 正好绘制出那一条闭合线。
|
|
4540
4620
|
|
|
4541
|
-
|
|
4621
|
+
闭合模式与等值线共用 `maxCells` 降采样及高斯滤波后的标量场,中心值取该场的代表格点值,中心位置与 d3 一致采用像元中心坐标。`wrapLongitude: true` 且数据覆盖完整 360° 时,左右邻域周期相接;南北边界不循环。距离筛选用球面公里距离,因此同一经度差在不同纬度不会当作相同距离。最后再应用 `maxCount`。
|
|
4622
|
+
|
|
4623
|
+
原邻域模式先独立进行轻量平滑,再按中心与窗口均值的差过滤、合并过近同类中心并限制数量;超过 100 万格时只对候选搜索做块均值抽样,最终回到原网格取值和坐标。两种模式的 `minProminence` 含义不同,调参时不应直接等同。关闭检测后会清理上一次自动中心。
|
|
4624
|
+
|
|
4625
|
+
新模式通过 `getState().centerDiagnostics` 返回 `candidates`(极值候选)、`closed`(通过闭合检查)、`rejectedOpen`(边界或缺测开口)、`rejectedWeak`(阈值内合并)、`rejectedDistance`(距离去重)及 `rejectedLimit`(数量上限)。`closed` 包含之后被距离和数量筛掉的点。原模式返回 `null`;`clear/destroy` 清空诊断。`centerCount` 是实际输出中心数,`centerLabelCount` 是经过当前视野和碰撞避让后的可见标注数,两者可以不同。
|
|
4542
4626
|
|
|
4543
4627
|
`RasterContourController` 也可直接传顶层 `centers`。手工数组(包括 `[]`)优先于自动检测;传 `centers: null` 可恢复使用当前 `centerDetection` 的结果。检测只产生中心数据,仍需 `centerAnnotation.visible: true` 才会显示。
|
|
4544
4628
|
|
|
@@ -4551,12 +4635,14 @@ await rasterContour.loadGrid({
|
|
|
4551
4635
|
| `loadGeoTiff(payload, options)` | 从 GeoTIFF 生成。 |
|
|
4552
4636
|
| `loadGrayImage(payload, options)` | 从灰度图生成。 |
|
|
4553
4637
|
| `loadGrid(payload, options)` | 从数值网格生成。 |
|
|
4554
|
-
| `update(payload)` |
|
|
4638
|
+
| `update(payload)` | 算法参数变化时从原始网格重算;标签、颜色、线宽、渲染简化等显示参数直接复用等值线;修改数据源参数时重新加载。`gridSmoothing` 支持字段级合并。 |
|
|
4555
4639
|
| `show/hide/toggle` | 统一控制等值线、线值标签和中心标注显隐。 |
|
|
4556
4640
|
| `clear/destroy` | 清空或销毁控制器。 |
|
|
4557
|
-
| `getState()` | 返回尺寸、值域、级别、线数、`centerCount`、标注数、投影、耗时和底层 contour
|
|
4641
|
+
| `getState()` | 返回尺寸、值域、级别、线数、`pointCount`、`centerCount`、标注数、投影、耗时和底层 contour 状态;另含实际 `gridSmoothing`、`wrapLongitude`、`gridSmoothingElapsed`、`contoursReused`、`centerDiagnostics`。 |
|
|
4558
4642
|
| `getRasterData()` | 返回当前标准栅格,包含 `values/width/height/area`。 |
|
|
4559
4643
|
|
|
4644
|
+
`gridSmoothingElapsed` 已包含在 `generateElapsed` 中,不能重复相加;显示更新复用几何时,两项均为 0,`contoursReused` 为 true。`renderWidth/renderHeight` 不包含内部周期补列。`clear()` 释放等值线缓存并保留原始网格;`destroy()` 同时释放两者。
|
|
4645
|
+
|
|
4560
4646
|
```js
|
|
4561
4647
|
// clear 只清空当前渲染结果,控制器仍可继续 update/load。
|
|
4562
4648
|
rasterContour.clear()
|