平均温度、降水、冰雹概率、相对湿度、风速、海平面气压、露点、最高气温、最低气温、3小时变压、24小时变压、24小时变温和自行绘制都能在当前地图上出带轴线的图件。从 地面分析 各产品的「能力」进入。只对地面分析图层。对照着图看:图件出图。
库管图幅(边距、轴线、是否露底图、背景色)、操作块和容器。容器里放什么由调用侧决定。图层色标跟 getLegend(),图例容器不配 pieces 时用同一套。行政区划、切要素、填色条只在示例里画,不要写进 createFieldSheet。
图层必须已经 addTo(map)。open 整份写入本次配置,不要和上次合并。setOption 才是补丁合并。裁剪场范围和拖框是两套,可同时开。
调用
import { parse } from '@dingnl/ltvis-map/parse'
import { createFieldLayer, createFieldSheet, fieldSheetCaptionOf } from '@dingnl/ltvis-map/layer'
const parsed = await parse(buffer, {
format: 'micaps4',
// 一次只出这一列
product: 'pre'
})
const layer = createFieldLayer({
// 解析出口
data: parsed.values,
// 画哪一列,与 parse 相同
product: 'pre',
// 等值面填色
fill: 'isobands'
})
layer.addTo(map)
const sheet = createFieldSheet(layer)
const caption = fieldSheetCaptionOf('pre')
sheet.open({
// 露出底图瓦片
map: true,
// 出图纸色。边距、藏底图和下载共用
background: '#fff',
layout: {
// 相对地图容器的四边距,像素
left: 52,
top: 52,
right: 52,
bottom: 52,
// 图幅变了,内部容器保持像素
inner: 'fixed'
},
handle: {
// 图幅锚点和容器缩放块共用
shape: 'square',
stroke: true,
weight: 1,
color: '#000',
size: 10
},
graticule: {
// 轴线和刻度
show: true,
color: '#000',
weight: 1,
labels: true,
labelColor: '#000',
fontSize: 14,
// 内网格。不传或 false 则关
grid: { show: true, line: 'solid', color: '#000', weight: 1 }
},
items: [
{
id: 'sheet-title',
type: 'text',
// 相对轴线框 0~1
x: 0.15,
y: 0.02,
width: 0.7,
height: 0.08,
// 产品中文名
text: caption.name,
fontSize: 18,
fontWeight: 600,
align: 'center',
valign: 'middle'
},
{
id: 'sheet-legend',
type: 'legend',
x: 0.04,
y: 0.72,
// 不写 pieces 则跟图层色档
title: caption.name,
unit: caption.unit
}
]
})
sheet.onChange(option => {
// 拖框或改容器后回写面板
})
sheet.onSelect(id => {
// 当前在编的容器 id。点空白是 null
})
const blob = await sheet.download()
sheet.close()fieldSheetCaptionOf(product) 给出内置产品的中文名和单位。自行绘制列回退成 product 字面量,单位空串。
建好之后也可以补丁改、选中、只拿 Blob:
// 只改纸色和内网格。其余保持 open 时写入的值
sheet.setOption({
background: '#f7f7f7',
graticule: {
grid: { show: true, line: 'dashed' }
}
})
// 选中标题,开始编辑
sheet.select('sheet-title')
// 合成 PNG,不触发浏览器下载
const blob = await sheet.download({ save: false })打开后可拖轴线框改四边距。容器同时只编一项:双击开始编辑,右键打开菜单(开始编辑/结束编辑/删除),点其余位置结束。锚点移入后出跟随指针的操作指引。按钮由调用侧自己画。
会话方法
| 方法 | 说明 |
|---|---|
open(option?) | 整份写入并叠轴线和容器。不传则只有默认轴线。返回会话本身 |
setOption(option) | 补丁合并。layout / handle / graticule 按字段合并;items 整表替换。已打开则重画 |
getOption() | 拷贝当前配置。含拖过后的 layout 和每个容器的 0~1 盒子 |
isOpen() | 是否挂着装饰 |
select(id) | 选中容器开始编辑。传 null 结束 |
getSelected() | 当前在编的容器 id。没有则 null |
onSelect(handler) | 选中变化时通知。传 null 取消 |
onChange(handler) | 拖框、改容器后通知,参数是最新配置。拖动中按动画帧合并,松手立刻回写。传 null 取消 |
onClose(handler) | close() 之后通知。传 null 取消 |
download({ loadTile?, save? }) | 合成 PNG 并返回 Blob。save !== false 会触发浏览器下载 |
close() | 拆装饰。会话对象还在,可再 open |
图层卸下会拆装饰。close 之后会话仍可用。
参数
open / setOption 认这一套。全是可选。色值认 #000 / rgb() / rgba(),透明写 rgba(0, 0, 0, 0)。
| 字段 | 说明 | 默认 |
|---|---|---|
map | 是否露出底图瓦片。false 只藏瓦片,场和装饰还在 | 开 |
background | 出图纸色。边距、藏底图和下载共用 | #fff |
layout | 图幅四边距和内部容器怎么跟 | 见下节 |
handle | 操作块。图幅锚点和容器缩放块共用 | 见下节 |
graticule | 轴线。写 false 关刻度,轴线框仍画;写对象配刻度、标注、内网格 | 刻度、标注开;内网格关 |
items | 框内容器。type 为 text / image / legend | 空,只有轴线 |
filename | 下载文件名。不写则 产品-时次.png,没有时次则只有产品 | 产品 + 时次 |
图幅
layout 相对地图容器的四边距,单位像素。拖轴线框改这四个数。四边最小 8,图幅不够时按比例收。
| 字段 | 说明 | 默认 |
|---|---|---|
left | 左边距 | 52 |
top | 上边距 | 52 |
right | 右边距 | 52 |
bottom | 下边距 | 52 |
inner | 图幅尺寸变了,内部容器是固定像素(fixed)还是按 0~1 跟随(follow) | fixed |
sheet.setOption({
layout: {
left: 64,
top: 64,
right: 64,
bottom: 64,
// 拖大图幅时标题和图例跟着走
inner: 'follow'
}
})操作块
图幅四边、四角的锚点和容器缩放块共用 handle。编辑用,不进下载。
| 字段 | 说明 | 默认 |
|---|---|---|
shape | square / circle | square |
stroke | 是否画边框 | 开 |
weight | 边框粗细,像素 | 1 |
color | 边框颜色 | #000 |
size | 边长,像素 | 10 |
background | 底色 | rgba(0, 0, 0, 0) |
sheet.setOption({
handle: {
shape: 'circle',
stroke: true,
weight: 1,
color: '#000',
size: 12,
background: 'rgba(255, 255, 255, 0.8)'
}
})轴线
graticule 写 false 关刻度,轴线框仍画。写对象配下面字段。不传 step 时按视野跨度取整齐步长,可低于 1°。
| 字段 | 说明 | 默认 |
|---|---|---|
show | 刻度是否显示。轴线框仍画 | 开 |
step | 度。可写一个数,或 [经向, 纬向]。不传随缩放 | 随缩放 |
color | 轴线和刻度颜色 | #000 |
weight | 轴线和刻度宽度,像素 | 1 |
labels | 是否画经纬度标注 | 开 |
labelColor | 标注颜色 | #000 |
fontFamily | 标注字体 | sans-serif |
fontSize | 标注字号,像素 | 14 |
grid | 轴线内部网格。不传或 false 关;对象见下节 | 关 |
sheet.setOption({
graticule: {
show: true,
// 经向 1°、纬向 0.5°
step: [1, 0.5],
color: '#000',
weight: 1,
labels: true,
labelColor: '#000',
fontFamily: 'sans-serif',
fontSize: 14
}
})内网格
graticule.grid 不传或 false 关。写对象:
| 字段 | 说明 | 默认 |
|---|---|---|
show | 是否画 | 开 |
line | solid 实线 / dashed 虚线 / dotted 点线 | solid |
color | 线色 | #000 |
weight | 线宽,像素 | 1 |
sheet.setOption({
graticule: {
grid: {
show: true,
line: 'dashed',
color: '#000',
weight: 1
}
}
})容器
items 可任意多个。位置和宽高相对轴线框 0~1。不写 id 时库会补 item-1 起的编号,拖移、选中、删除认这个 id。建议自己写。
三种 type 共用盒子和外观:
| 字段 | 说明 | 默认 |
|---|---|---|
id | 选中、拖移、删除用的编号 | item-1 起 |
type | text / image / legend | — |
x / y | 左上角,相对轴线框 0~1 | 0 |
width / height | 宽高,相对轴线框 0~1 | 图例不写则包住内容;其余看类型 |
lock | true 锁移动和缩放;或 { move, resize } 分开锁 | 都不锁 |
shape | rect / circle。图例只认矩形 | rect |
radius | 矩形圆角,像素。圆形不看 | 0 |
border | 是否画容器边框。不要写成文字的 stroke | 关 |
borderColor | 容器边框颜色 | #000 |
borderWeight | 容器边框粗细,像素 | 1 |
background | 容器背景。字符串当纯色;对象写渐变或图。见下节 | 文字/图片透明;图例 rgba(255, 255, 255, 0.5) |
el / mount | 有则库不画默认内容,只给盒子。普通 HTML 不进下载 | 不挂 |
setOption({ items }) 整表替换,不会和上次的容器按 id 合并。
容器背景
background 字符串当纯色。对象:
| 字段 | 说明 | 默认 |
|---|---|---|
type | color / gradient / image | color |
color | 纯色 | — |
from / to | 渐变两端 | — |
angle | 渐变角度,度。0 向上、90 向右 | 180 |
src | 背景图地址 | — |
fit | 背景图 cover 铺满 / contain 完整 | cover |
background: {
type: 'gradient',
from: '#fff',
to: '#e8e8e8',
// 0 向上,90 向右
angle: 180
}文字
type: 'text'。文字样式与图例档位、标题、单位共用同一套字段。
| 字段 | 说明 | 默认 |
|---|---|---|
text | 文案 | 空 |
color | 字色 | #000 |
fontSize | 像素 | 14 |
fontWeight | CSS 字重 | 400 |
fontFamily | 不传走浏览器默认字体 | — |
stroke | 是否画文字边框 | 关 |
strokeColor | 文字边框颜色 | #000 |
strokeWeight | 文字边框粗细,像素 | 1 |
align | left / center / right,或 0~1 | center |
valign | top / middle / bottom,或 0~1 | middle |
{
id: 'sheet-title',
type: 'text',
x: 0.15,
y: 0.02,
width: 0.7,
height: 0.08,
text: '降水',
fontSize: 18,
fontWeight: 600,
align: 'center',
valign: 'middle'
}图片
type: 'image'。
| 字段 | 说明 | 默认 |
|---|---|---|
src | 图片地址 | — |
fit | ratio 原比例 / fill 填充容器 / custom 自定义像素 | fill |
fitWidth | custom 时的宽,像素 | — |
fitHeight | custom 时的高,像素 | — |
opacity | 0~1 | 1 |
align | left / center / right,或 0~1 | center |
valign | top / middle / bottom,或 0~1 | middle |
{
id: 'sheet-logo',
type: 'image',
x: 0.82,
y: 0.02,
width: 0.14,
height: 0.1,
src: '/logo.png',
// 保持原比例
fit: 'ratio',
opacity: 1,
align: 'center',
valign: 'middle'
}图例
type: 'legend'。只认矩形,可写 radius,不要写 circle。不写宽高时盒子刚好包住内容;缩放不能小于内容。不写 pieces 则跟图层 getLegend()。
| 字段 | 说明 | 默认 |
|---|---|---|
kind | blocks 色块 / ramp 渐变色条 | blocks |
orient | vertical / horizontal | vertical |
title | 标题。字符串只写文案;对象可单独配字体和对齐。不写跟产品中文名;空串不画 | 产品中文名 |
unit | 单位。写法同 title。不写跟产品单位;空串不画 | 产品单位 |
titleFlow | row 同行 / stack 换行 | stack |
titleSide | 标题整块在色块/色条的 top / bottom | top |
blockWidth | 色块或色条宽,像素。色块默认 30;竖向色条默认 10 | 见左 |
blockHeight | 色块或色条高,像素。色块默认 10;横向色条默认 10 | 见左 |
blockGap | 色块间距,像素。色条不用 | 8 |
blockBorder | 色块/色条边框 | 关 |
blockBorderColor | 边框颜色 | #999 |
blockBorderWeight | 边框粗细,像素 | 1 |
labels | 是否画档位文字 | 开 |
labelSide | 文字相对色块/色条。竖向 left / right(默认右);横向 top / bottom(默认下) | 竖向右、横向下 |
pieces | { value, color, label, src }[]。src 只给色块;渐变色条只认 color | 图层色档 |
档位文字字段与文字容器相同:color / fontSize(默认 12)/ fontWeight / fontFamily / stroke / strokeColor / strokeWeight / align / valign。竖向默认左对齐,横向默认居中。
title / unit 写成对象时,可单独配 text 和同一套文字字段。标题默认字号 14,单位默认字号 12。
{
id: 'sheet-legend',
type: 'legend',
x: 0.04,
y: 0.72,
kind: 'blocks',
orient: 'vertical',
title: '降水',
unit: 'mm',
titleFlow: 'stack',
titleSide: 'top',
labels: true,
labelSide: 'right'
}切成渐变色条、横向,并自定档位:
sheet.setOption({
items: [
{
id: 'sheet-legend',
type: 'legend',
x: 0.2,
y: 0.88,
width: 0.6,
kind: 'ramp',
orient: 'horizontal',
title: '降水',
unit: 'mm',
pieces: [
{ value: 0.1, color: 'rgb(180, 220, 255)', label: '0.1~10' },
{ value: 10, color: 'rgb(40, 120, 200)', label: '10~25' },
{ value: 25, color: 'rgb(10, 40, 120)', label: '≥25' }
]
}
]
})编辑
容器同时只编一项。双击开始编辑,右键打开菜单,点其余位置结束。菜单挂在容器上,不走底图右键。编辑态另有标识底,略大于容器,结束编辑即消失,不进下载。
sheet.onSelect(id => {
// 跟面板高亮对上
})
sheet.select('sheet-legend')
sheet.getSelected()
// 结束编辑
sheet.select(null)单项可锁:
{
id: 'sheet-title',
type: 'text',
text: '降水',
// 能改大小,不能拖走
lock: { move: true, resize: false }
}下载
download() 按轴线框四边同等留白合成 PNG 并返回 Blob。留白取当前四边距的最大,缺的一边用纸色补。分辨率跟当前屏幕像素比走。合成顺序是底图、场、叠层、装饰、容器扩展。
| 字段 | 说明 | 默认 |
|---|---|---|
save | 是否触发浏览器下载。false 只拿 Blob | 开 |
loadTile | (src) => Image | Canvas | Promise<…>。跨域瓦片换成同源图 | — |
// 触发浏览器下载,文件名看 option.filename
await sheet.download()
// 只拿 Blob,交给自己的上传或预览
const blob = await sheet.download({ save: false })
// 高德等不带 CORS 头的瓦片,先换成同源再画
await sheet.download({
loadTile: src => fetchProxyImage(src)
})底图瓦片要进 PNG,必须能被画布读。自有图源给 L.tileLayer 写 crossOrigin: true,且响应带 Access-Control-Allow-Origin。读不到的瓦片跳过,场和装饰仍导出。未 open 时调用也会临时叠再拆,仍返回 Blob。
下载前会等可见瓦片收齐(最多约 2 秒),再等两帧让场和装饰画完。按钮由调用侧自己画。