外观
markdown 扩展
标题锚点
标题会自动应用锚点。
自定义锚点
要为标题指定自定义锚点而不是使用自动生成的锚点,请向标题添加后缀:
# 使用自定义锚点 {#my-anchor}
这允许将标题链接为 #my-anchor
,而不是默认的 #使用自定义锚点
。
链接
内部和外部链接都会被特殊处理。
主题默认对每个 md 文件自动生成一个新的 链接,并保存在对应的 md 文件的 frontmatter 的 permalink
中。 你可以随时修改它们。你也可以通过 theme.autoFrontmatter
选项来禁用这个功能,这时会恢复为 VuePress 的默认行为。
内部链接
有三种方式来使用内部链接:
- 使用 生成的
permalink
作为内部链接的目标。 - 使用 md 文件的相对路径作为内部链接的目标。
- 使用 md 文件的绝对路径作为内部链接的目标, 绝对路径
/
表示从${sourceDir}
目录开始。
[Markdown](/guide/markdown/)
[Markdown](./markdown基础.md)
渲染为:
外部链接
外部链接带有 target="_blank" rel="noreferrer"
:
Github风格的表格
输入:
| Tables | Are | Cool |
| ------------- | :-----------: | ----: |
| col 3 is | right-aligned | $1600 |
| col 2 is | centered | $12 |
| zebra stripes | are neat | $1 |
输出:
Tables | Are | Cool |
---|---|---|
col 3 is | right-aligned | $1600 |
col 2 is | centered | $12 |
zebra stripes | are neat | $1 |
Emoji 🎉
输入:
:tada: :100:
输出:
🎉 💯
这里可以找到 所有支持的 emoji 列表。
目录表
输入:
[[TOC]]
输出:
自定义容器
自定义容器可以通过它们的类型、标题和内容来定义。
默认标题
输入:
::: note
This is a note box
:::
::: info
This is an info box.
:::
::: tip
This is a tip.
:::
::: warning
This is a warning.
:::
::: caution
This is a dangerous warning.
:::
::: details
This is a details block.
:::
输出:
注
This is a note box
相关信息
This is an info box.
提示
This is a tip.
注意
This is a warning.
警告
This is a dangerous warning.
详情
This is a details block.
自定义标题
可以通过在容器的 "type" 之后附加文本来设置自定义标题。
输入:
::: caution STOP
危险区域,请勿继续
:::
::: details 点我查看代码
```js
console.log('Hello, VitePress!')
```
:::
输出:
STOP
危险区域,请勿继续
点我查看代码
console.log('Hello, VitePress!')
GitHub 风格的警报
主题 同样支持以标注的方式渲染 GitHub 风格的警报。它们和自定义容器的渲染方式相同。
输入:
> [!NOTE]
> 强调用户在快速浏览文档时也不应忽略的重要信息。
> [!TIP]
> 有助于用户更顺利达成目标的建议性信息。
> [!IMPORTANT]
> 对用户达成目标至关重要的信息。
> [!WARNING]
> 因为可能存在风险,所以需要用户立即关注的关键内容。
> [!CAUTION]
> 行为可能带来的负面影响。
输出:
注
强调用户在快速浏览文档时也不应忽略的重要信息。
提示
有助于用户更顺利达成目标的建议性信息。
重要
对用户达成目标至关重要的信息。
注意
因为可能存在风险,所以需要用户立即关注的关键内容。
警告
行为可能带来的负面影响。
代码块中的语法高亮
主题 使用 Shiki 在 Markdown 代码块中使用彩色文本实现语法高亮。 Shiki 支持多种编程语言。需要做的就是将有效的语言别名附加到代码块的开头:
输入:
```js
export default {
name: 'MyComponent',
// ...
}
```
```html
<ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
</li>
</ul>
```
输出:
export default {
name: 'MyComponent',
// ...
}
<ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
</li>
</ul>
在 Shiki 的代码仓库中,可以找到 合法的编程语言列表。
在代码块中实现行高亮
输入:
```js{4}
export default {
data () {
return {
msg: 'Highlighted!'
}
}
}
```
输出:
export default {
data () {
return {
msg: 'Highlighted!'
}
}
}
除了单行之外,还可以指定多个单行、多行,或两者均指定:
- 多行:例如
{5-8}
、{3-10}
、{10-17}
- 多个单行:例如
{4,7,9}
- 多行与单行:例如
{4,7-13,16,23-27,40}
输入:
```js{1,4,6-8}
export default { // Highlighted
data () {
return {
msg: `Highlighted!
This line isn't highlighted,
but this and the next 2 are.`,
motd: 'VitePress is awesome',
lorem: 'ipsum'
}
}
}
```
输出:
export default { // Highlighted
data () {
return {
msg: `Highlighted!
This line isn't highlighted,
but this and the next 2 are.`,
motd: 'VitePress is awesome',
lorem: 'ipsum'
}
}
}
也可以使用 // [!code highlight]
注释实现行高亮。
输入:
```js
export default {
data () {
return {
msg: 'Highlighted!' // [!code highlight]
}
}
}
```
输出:
export default {
data() {
return {
msg: 'Highlighted!'
}
}
}
代码块中聚焦
在某一行上添加 // [!code focus]
注释将聚焦它并模糊代码的其他部分。
此外,可以使用 // [!code focus:<lines>]
定义要聚焦的行数。
输入:
```js
export default {
data () {
return {
msg: 'Focused!' // [!code focus]
}
}
}
```
输出:
export default {
data() {
return {
msg: 'Focused!'
}
}
}
代码块中的颜色差异
在某一行添加 // [!code --]
或 // [!code ++]
注释将会为该行创建 diff,同时保留代码块的颜色。
输入:
```js
export default {
data () {
return {
remove: 'Removed', // [!code --]
add: 'Added' // [!code ++]
}
}
}
```
输出:
export default {
data() {
return {
remove: 'Removed',
add: 'Added'
}
}
}
高亮“错误”和“警告”
在某一行添加 // [!code warning]
或 // [!code error]
注释将会为该行相应的着色。
输入:
```js
export default {
data () {
return {
error: 'Error', // [!code error]
warning: 'Warning' // [!code warning]
}
}
}
```
输出:
export default {
data() {
return {
error: 'Error',
warning: 'Warning'
}
}
}
代码块中 词高亮
输入:
```ts
export function foo() { // [!code word:Hello]
const msg = 'Hello World'
console.log(msg) // prints Hello World
}
```
输出:
export function foo() {
const msg = 'Hello World'
console.log(msg) // prints Hello World
}
你还可以指定高亮显示的次数,例如 [!code word:options:2]
会高亮显示近两个 options
。
输入:
```ts
// [!code word:options:2]
const options = { foo: 'bar' }
options.foo = 'baz'
console.log(options.foo) // 这个不会被高亮显示
```
输出:
const options = { foo: 'bar' }
options.foo = 'baz'
console.log(options.foo) // 这个不会被高亮显示
代码组
可以像这样对多个代码块进行分组:
输入:
::: code-tabs
@tab config.js
```js
/**
* @type {import('vuepress').UserConfig}
*/
const config = {
// ..
}
export default config
```
@tab config.ts
```ts
import type { UserConfig } from 'vuepress'
const config: UserConfig = {
// ..
}
export default config
```
:::
输出:
config.js
/**
* @type {import('vuepress').UserConfig}
*/
const config = {
// ..
}
export default config
config.ts
import type { UserConfig } from 'vuepress'
const config: UserConfig = {
// ..
}
export default config
你还可以通过 @tab:active
导入代码块
输入:
你可以使用下面的语法,从文件中导入代码块:
@[code](./test.js)
输出:
let map // mars3d.Map三维地图对象
let graphicLayer // 矢量图层对象
// 初始化地图业务,生命周期钩子函数(必须),框架在地图初始化完成后自动调用该函数
function onMounted(mapInstance) {
map = mapInstance // 记录map
// 创建矢量数据图层
graphicLayer = new mars3d.layer.GraphicLayer({
allowDrillPick: true // 如果存在坐标完全相同的图标点,可以打开该属性,click事件通过graphics判断
})
map.addLayer(graphicLayer)
// 在layer上绑定监听事件
graphicLayer.on(mars3d.EventType.click, (event) => {
console.log("监听layer,单击了矢量对象", event)
})
bindLayerPopup() // 在图层上绑定popup,对所有加到这个图层的矢量数据都生效
bindLayerContextMenu() // 在图层绑定右键菜单,对所有加到这个图层的矢量数据都生效
// 加一些演示数据
addDemoGraphic1(graphicLayer)
addDemoGraphic2(graphicLayer)
addDemoGraphic3(graphicLayer)
addDemoGraphic4(graphicLayer)
addDemoGraphic5(graphicLayer)
addDemoGraphic6(graphicLayer)
addDemoGraphic7(graphicLayer)
addDemoGraphic8(graphicLayer)
addDemoGraphic9(graphicLayer)
addDemoGraphic10(graphicLayer)
addDemoGraphic11(graphicLayer)
// addDemoGraphic12(graphicLayer)
addDemoGraphic13(graphicLayer)
addDemoGraphic14(graphicLayer)
}
// 释放当前地图业务的生命周期函数,具体项目中时必须写onMounted的反向操作(如解绑事件、对象销毁、变量置空)
function onUnmounted() {
map = null
graphicLayer.remove()
graphicLayer = null
}
//
function addDemoGraphic1(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: [116.1, 31.0, 1000],
style: {
image: "https://data.mars3d.cn/img/marker/lace-blue.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例1" }
})
graphicLayer.addGraphic(graphic) // 还可以另外一种写法: graphic.addTo(graphicLayer)
// 演示个性化处理graphic
initGraphicManager(graphic)
}
// 也可以在单个Graphic上做个性化管理及绑定操作
function initGraphicManager(graphic) {
// 3.在graphic上绑定监听事件
// graphic.on(mars3d.EventType.click, function (event) {
// console.log("监听graphic,单击了矢量对象", event)
// })
// 绑定Tooltip
// graphic.bindTooltip('我是graphic上绑定的Tooltip') //.openTooltip()
// 绑定Popup
const inthtml = `<table style="width: auto;">
<tr>
<th scope="col" colspan="2" style="text-align:center;font-size:15px;">我是graphic上绑定的Popup </th>
</tr>
<tr>
<td>提示:</td>
<td>这只是测试信息,可以任意html</td>
</tr>
</table>`
graphic.bindPopup(inthtml).openPopup()
// 绑定右键菜单
graphic.bindContextMenu([
{
text: "开始编辑对象[graphic绑定的]",
icon: "fa fa-edit",
show(e) {
const { graphic } = e
if (!graphic || !graphic.hasEdit) {
return false
}
return !graphic.isEditing
},
callback: (e) => {
const { graphic } = e
if (!graphic) {
return false
}
if (graphic) {
graphicLayer.startEditing(graphic)
}
}
},
{
text: "删除对象[graphic绑定的]",
icon: "fa fa-trash-o",
callback: (e) => {
const { graphic } = e
if (graphic) {
graphic.remove()
}
}
}
])
// 测试 颜色闪烁
if (graphic.startFlicker) {
graphic.startFlicker({
time: 20, // 闪烁时长(秒)
maxAlpha: 0.5,
setp: 5,
color: Cesium.Color.YELLOW,
onEnd() {
// 结束后回调
}
})
}
}
//
function addDemoGraphic2(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.2, 31.0, 1000),
style: {
image: "https://data.mars3d.cn/img/marker/lace-red.png",
scale: 1.0,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
clampToGround: true,
// heightReference: new Cesium.CallbackProperty(function (time) {
// if (map.scene.mode !== Cesium.SceneMode.SCENE3D) {
// return Cesium.HeightReference.NONE //解决2D贴地对象不显示问题
// } else {
// return Cesium.HeightReference.CLAMP_TO_GROUND
// }
// }, false),
label: { text: "鼠标移入会放大", pixelOffsetY: -50 },
// 高亮时的样式(默认为鼠标移入,也可以指定type:'click'单击高亮),构造后也可以openHighlight、closeHighlight方法来手动调用
highlight: {
scale: 1.5
}
},
attr: { remark: "示例2" }
})
graphicLayer.addGraphic(graphic) // 还可以另外一种写法: graphic.addTo(graphicLayer)
}
function addDemoGraphic3(graphicLayer) {
// 演示重叠图标
const graphic0 = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.307258, 30.999546, 1239.2),
style: {
image: "https://data.mars3d.cn/img/marker/lace-red.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(0, -6), // 偏移量
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 500000) // 按视距显示
},
attr: { remark: "示例3-重叠1" }
})
graphicLayer.addGraphic(graphic0) // 还可以另外一种写法: graphic.addTo(graphicLayer)
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.307258, 30.999546, 1239.2),
style: {
image: "https://data.mars3d.cn/img/marker/lace-yellow.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(0, -6), // 偏移量
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 500000) // 按视距显示
},
attr: { remark: "示例3-重叠2" }
})
graphicLayer.addGraphic(graphic)
}
//
function addDemoGraphic4(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: [116.4, 31.0, 1000],
style: {
image: "https://data.mars3d.cn/img/marker/route-start.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
label: {
text: "我是原始的",
font_size: 18,
color: "#ffffff",
pixelOffsetY: -50,
distanceDisplayCondition: true,
distanceDisplayCondition_far: 500000,
distanceDisplayCondition_near: 0
}
},
attr: { remark: "示例4" }
})
graphicLayer.addGraphic(graphic)
// graphic转json,clone一个对象
const json = graphic.toJSON()
delete json.id // 防止id冲突,实际业务中根据需要修改
console.log("转换后的json", json)
json.position = [116.5, 31.0, 1000] // 新的坐标
json.style.image = "https://data.mars3d.cn/img/marker/route-end.png"
json.style.label = json.style.label || {}
json.style.label.text = "我是转换后生成的"
graphicLayer.addGraphic(json) // 支持直接加json,内部转为graphic
}
function addDemoGraphic5(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: [116.1, 30.9, 1000],
style: {
image: "https://data.mars3d.cn/img/marker/mark-green.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例5" }
})
graphicLayer.addGraphic(graphic) // 还可以另外一种写法: graphic.addTo(graphicLayer)
}
function addDemoGraphic6(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: {
type: "time", // 时序动态坐标
speed: 360,
list: [
[116.149105, 30.907981, 503.6],
[116.190348, 30.955769, 594.9],
[116.246612, 30.915395, 604.5],
[116.231737, 30.859761, 405.2],
[116.184267, 30.859695, 323.1],
[116.153552, 30.899044, 521.4]
]
},
style: {
image: "https://data.mars3d.cn/img/marker/mark-red.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例6" }
})
graphicLayer.addGraphic(graphic) // 还可以另外一种写法: graphic.addTo(graphicLayer)
}
function addDemoGraphic7(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.3, 30.9, 1000),
style: {
image: "https://data.mars3d.cn/img/marker/mark-blue.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例7" }
})
graphicLayer.addGraphic(graphic) // 还可以另外一种写法: graphic.addTo(graphicLayer)
}
function addDemoGraphic8(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.4, 30.9, 1000),
style: {
image: "https://data.mars3d.cn/img/marker/point-red.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例8" }
})
graphicLayer.addGraphic(graphic) // 还可以另外一种写法: graphic.addTo(graphicLayer)
}
function addDemoGraphic9(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.5, 30.9, 1000),
style: {
image: "https://data.mars3d.cn/img/marker/point-yellow.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例9" }
})
graphicLayer.addGraphic(graphic)
}
function addDemoGraphic10(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.1, 30.8, 1000),
style: {
image: "https://data.mars3d.cn/img/marker/point-orange.png",
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { remark: "示例10" }
})
graphicLayer.addGraphic(graphic)
}
function addDemoGraphic11(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: {
type: "time", // 时序动态坐标
speed: 260,
list: [
[116.34591, 30.680609, 437],
[116.477653, 30.802623, 202.1],
[116.749545, 31.062176, 675.5]
]
},
style: {
image: "https://data.mars3d.cn/img/marker/svg/huojian.svg",
scale: 0.5,
alignedAxis: true
},
attr: { remark: "示例11" }
})
graphicLayer.addGraphic(graphic)
}
// 利用第3方库(gifler.js)加载gif
function addDemoGraphic12(graphicLayer) {
let gifImgBuffer
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.3, 30.8, 1000),
style: {
image: new Cesium.CallbackProperty(() => {
return gifImgBuffer
}, false),
scale: 0.1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.CENTER
},
attr: { remark: "示例12" }
})
graphicLayer.addGraphic(graphic)
// eslint-disable-next-line no-undef
const gif = gifler("https://data.mars3d.cn/img/marker/gif/typhoon.gif")
gif.frames(document.createElement("canvas"), (ctx, frame) => {
gifImgBuffer = frame.buffer.toDataURL()
})
}
function addDemoGraphic13(graphicLayer) {
const startPoint = Cesium.Cartesian3.fromDegrees(116.4, 30.8, 1000)
const stopPoint = Cesium.Cartesian3.fromDegrees(116.416914, 30.789235, 877.6)
const graphic = new mars3d.graphic.BillboardEntity({
position: startPoint,
style: {
image: "https://data.mars3d.cn/img/marker/street.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
label: {
text: "根据点位自动计算方向",
font_size: 18,
color: "#ffffff",
pixelOffsetY: -50,
distanceDisplayCondition: true,
distanceDisplayCondition_far: 500000,
distanceDisplayCondition_near: 0
}
},
attr: { remark: "示例13-BillboardEntity" }
})
graphicLayer.addGraphic(graphic)
// 计算点对点的方向
const direction = mars3d.MeasureUtil.getAngle(startPoint, stopPoint)
const sector = new mars3d.graphic.Sector({
position: startPoint,
style: {
radius: 5000,
startAngle: direction - 45,
endAngle: direction + 45,
color: "#3388ff",
opacity: 0.5,
outline: true,
outlineWidth: 3,
outlineColor: "#ffffff"
},
attr: { remark: "示例13-Sector" }
})
graphicLayer.addGraphic(sector)
const endPoint = new mars3d.graphic.PointEntity({
position: stopPoint,
style: {
color: "#ff0000",
pixelSize: 10,
outlineColor: "#ffffff",
outlineWidth: 2
},
attr: { remark: "示例13-PointEntity" }
})
graphicLayer.addGraphic(endPoint)
}
function addDemoGraphic14(graphicLayer) {
const graphic = new mars3d.graphic.BillboardEntity({
position: new mars3d.LngLatPoint(116.2, 30.8, 1000),
style: {
// 支持base64
image:
"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzRweCIgaGVpZ2h0PSI4MnB4IiB2aWV3Qm94PSIwIDAgNzQgODIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+56m6PC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMTAwJSIgeTE9IjUwJSIgeDI9IjMzLjYyOTE0ODglIiB5Mj0iNTcuNzg0Njc0MyUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzdCNzk3OSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC44MTk4MjA4MDQiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGZpbHRlciB4PSItOS4xJSIgeT0iLTE1LjclIiB3aWR0aD0iMTE4LjIlIiBoZWlnaHQ9IjEzMS40JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjEyIiBpbj0iU291cmNlR3JhcGhpYyI+PC9mZUdhdXNzaWFuQmx1cj4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjUwJSIgeTE9IjEwMCUiIHgyPSI1MCUiIHkyPSIzLjA2MTYxN2UtMTUlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkU2NTEiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGQzgyRCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8cGF0aCBkPSJNMzAuOTk3OTc4OSw2Ny4yMjAyOTE3IEMzMy42ODgyMDAzLDYyLjE3NzMwOTYgMzUuNzA2MDI5Niw1OS40OTQzMzI0IDM3LjA1MTQ2NjgsNTkuMTcxMzYwMSBDNTAuMjM0NjM4OCw1Ni4wMDY3Mzg1IDYwLjAzMiw0NC4xNDY5MDc1IDYwLjAzMiwzMCBDNjAuMDMyLDEzLjQzMTQ1NzUgNDYuNTkzMzc5LDAgMzAuMDE2LDAgQzEzLjQzODYyMSwwIDAsMTMuNDMxNDU3NSAwLDMwIEMwLDQ0LjExMzQwOTQgOS43NTEwMTgzMyw1NS45NTA1NjA1IDIyLjg4Njk0Miw1OS4xNDg3MzM2IEMyNC4yNDk5NDEsNTkuNDgwNTc5OCAyNi4yOTU3NDA0LDYyLjE3Mjc4NDUgMjkuMDI0MzQwMyw2Ny4yMjUzNDc2IEwyOS4wMjQzNjIsNjcuMjI1MzM1OSBDMjkuMzE4MjgxMSw2Ny43Njk1ODc1IDI5Ljk5Nzc1MjcsNjcuOTcyNTIyMSAzMC41NDIwMDQzLDY3LjY3ODYwMjkgQzMwLjczNTc0Myw2Ny41NzM5NzU4IDMwLjg5NDM0MzQsNjcuNDE0NTYyNiAzMC45OTc5Nzg5LDY3LjIyMDI5MTcgWiIgaWQ9InBhdGgtNCI+PC9wYXRoPgogICAgICAgIDxmaWx0ZXIgeD0iLTEyLjUlIiB5PSItMTAuOSUiIHdpZHRoPSIxMjUuMCUiIGhlaWdodD0iMTE5LjglIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIGlkPSJmaWx0ZXItNSI+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuNSIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC41IDAiIHR5cGU9Im1hdHJpeCIgaW49InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjUwJSIgeTE9Ii0yLjQ4OTQ5ODEzZS0xNSUiIHgyPSI1MCUiIHkyPSIxMDAlIiBpZD0ibGluZWFyR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZERkIiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y3QjUxRCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLmkJzntKIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJpY29u5LiO6aKc6ImyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTIwOS4wMDAwMDAsIC01MTIuMDAwMDAwKSI+CiAgICAgICAgICAgIDxnIGlkPSLnqboiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMTQuMDAwMDAwLCA1MTcuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6ELTIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHBvaW50cz0iMzAuMDE2IDY5LjEwNzE0MjkgNjcgNTMuNTcxNDI4NiA2NyA3NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPGcgaWQ9Iue8lue7hC0xNCI+CiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9IuakreWchuW9oiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci01KSIgeGxpbms6aHJlZj0iI3BhdGgtNCI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0zKSIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC00Ij48L3VzZT4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9IuakreWchuW9oiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIuNCIgZmlsbC1vcGFjaXR5PSIwLjUxIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTYpIiBjeD0iMzAuMTI1IiBjeT0iMzAuMTExNjA3MSIgcng9IjIzLjkyNSIgcnk9IjIzLjkxMTYwNzEiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8dGV4dCBpZD0iNiIgeD0nMzAnIHk9JzM0JyAgIHN0eWxlPSdkb21pbmFudC1iYXNlbGluZTptaWRkbGU7dGV4dC1hbmNob3I6bWlkZGxlOycgZm9udC1mYW1pbHk9IlBpbmdGYW5nU0MtU2VtaWJvbGQsIFBpbmdGYW5nIFNDIiBmb250LXNpemU9IjQwIiBmb250LXdlaWdodD0iNTAwIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgIDwvdGV4dD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+",
scale: 0.5,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.CENTER
},
attr: { remark: "示例14" }
})
graphicLayer.addGraphic(graphic)
}
// 生成演示数据(测试数据量)
function addRandomGraphicByCount(count) {
graphicLayer.clear()
graphicLayer.enabledEvent = false // 关闭事件,大数据addGraphic时影响加载时间
const bbox = [116.984788, 31.625909, 117.484068, 32.021504]
const result = mars3d.PolyUtil.getGridPoints(bbox, count, 30)
console.log("生成的测试网格坐标", result)
for (let j = 0; j < result.points.length; ++j) {
const position = result.points[j]
const index = j + 1
const graphic = new mars3d.graphic.BillboardEntity({
position,
style: {
image: "https://data.mars3d.cn/img/marker/point-red.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
attr: { index }
})
graphicLayer.addGraphic(graphic)
}
graphicLayer.enabledEvent = true // 恢复事件
return result.points.length
}
// 开始绘制
async function startDrawGraphic() {
const graphic = await graphicLayer.startDraw({
type: "billboard",
style: {
image: "https://data.mars3d.cn/img/marker/mark-red.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
label: {
// 不需要文字时,去掉label配置即可
text: "可以同时支持文字",
font_size: 30,
color: "#ffffff",
outline: true,
outlineColor: "#000000",
pixelOffsetY: -50
}
}
})
console.log("标绘完成", graphic.toJSON())
}
async function startDrawGraphic2() {
const graphic = await graphicLayer.startDraw({
type: "billboard",
position: {
type: "time", // 时序动态坐标
speed: 960
},
style: {
image: "https://data.mars3d.cn/img/marker/point-red.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
})
console.log("标绘完成", graphic.toJSON())
}
function btnStartBounce() {
graphicLayer.eachGraphic((graphic) => {
if (graphic.startBounce) {
graphic.startBounce()
}
})
}
function btnStartBounce2() {
graphicLayer.eachGraphic((graphic) => {
if (graphic.startBounce) {
graphic.startBounce({
autoStop: true,
step: 2,
maxHeight: 90
})
}
})
}
function btnStopBounce() {
graphicLayer.eachGraphic((graphic) => {
if (graphic.stopBounce) {
graphic.stopBounce()
}
})
}
// 在图层绑定Popup弹窗
function bindLayerPopup() {
graphicLayer.bindPopup(
(event) => {
if (event.graphics?.length > 1) {
return `您单击了重叠图标,该区域有${event.graphics.length}个对象` // 如果存在坐标完全相同的图标点时
}
const attr = event.graphic.attr || {}
attr["类型"] = event.graphic.type
attr["来源"] = "我是layer上绑定的Popup"
attr["备注"] = "我支持鼠标交互"
return mars3d.Util.getTemplateHtml({ title: "矢量图层", template: "all", attr })
},
{ useGraphicPostion: true }
)
}
// 绑定右键菜单
function bindLayerContextMenu() {
graphicLayer.bindContextMenu([
{
text: "开始编辑对象",
icon: "fa fa-edit",
show(e) {
const { graphic } = e
if (!graphic || !graphic.hasEdit) {
return false
}
return !graphic.isEditing
},
callback: (e) => {
const { graphic } = e
if (!graphic) {
return false
}
if (graphic) {
graphicLayer.startEditing(graphic)
}
}
},
{
text: "停止编辑对象",
icon: "fa fa-edit",
show(e) {
const { graphic } = e
if (!graphic || !graphic.hasEdit) {
return false
}
return graphic.isEditing
},
callback: (e) => {
const { graphic } = e
if (!graphic) {
return false
}
if (graphic) {
graphic.stopEditing()
}
}
},
{
text: "还原编辑(还原到初始)",
icon: "fa fa-pencil",
show: (event) => {
function hasRestore(graphic) {
if (!graphic || !graphic.hasEdit || !graphic.isEditing) {
return false
}
return graphic.editing?.hasRestore()
}
const { graphic } = event
if (hasRestore(graphic)) {
return true
}
if (graphic.isPrivate && graphic.parent) {
return hasRestore(graphic.parent) // 右击是编辑点时
}
return false
},
callback: (event) => {
const { graphic } = event
if (graphic.editing?.restore) {
graphic.editing.restore() // 撤销编辑,可直接调用
} else if (graphic.parent?.editing?.restore) {
graphic.parent.editing.restore() // 右击是编辑点时
}
}
},
{
text: "撤销编辑(还原到上一步)",
icon: "fa fa-pencil",
show: (event) => {
function hasRevoke(graphic) {
if (!graphic || !graphic.hasEdit || !graphic.isEditing) {
return false
}
return graphic.editing?.hasRevoke()
}
const { graphic } = event
if (hasRevoke(graphic)) {
return true
}
if (graphic.isPrivate && graphic.parent) {
return hasRevoke(graphic.parent) // 右击是编辑点时
}
return false
},
callback: (event) => {
const { graphic } = event
if (graphic.editing?.revoke) {
graphic.editing.revoke() // 撤销编辑,可直接调用
} else if (graphic.parent?.editing?.revoke) {
graphic.parent.editing.revoke() // 右击是编辑点时
}
}
},
{
text: "删除对象",
icon: "fa fa-trash-o",
show: (event) => {
const { graphic } = event
if (!graphic || graphic.isDestroy || graphic.isPrivate || graphic.graphicIds) {
return false
}
return true
},
callback: (e) => {
const { graphic } = e
if (!graphic) {
return
}
const { parent } = graphic // 右击是编辑点时
graphicLayer.removeGraphic(graphic)
if (parent) {
graphicLayer.removeGraphic(parent)
}
}
},
{
text: "查看聚合列表",
icon: "fa fa-info",
show: (event) => {
const { graphic } = event
if (graphic.cluster && graphic.graphics) {
return true
}
return false
},
callback: (e) => {
const graphics = e.graphic?.graphics
if (graphics) {
const names = []
for (let index = 0; index < graphics.length; index++) {
const g = graphics[index]
names.push(g.attr.name || g.attr.text || g.id)
}
return globalAlert(`${names.join(",")}`, `共${graphics.length}个聚合对象`)
}
}
}
])
}
如果你只想导入这个文件的一部分:
<!-- 仅导入第 1 行至第 10 行 -->
@[code{1-10}](./test.js)
代码语言会根据文件扩展名进行推断,但我们建议你显式指定:
<!-- 指定代码语言 -->
@[code js](./test.js)
<!-- 行高亮 -->
@[code js{2,4-5}](./test.js)
数学方程
输入:
When $a \ne 0$, there are two solutions to $(ax^2 + bx + c = 0)$ and they are
$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$
**Maxwell's equations:**
| equation | description |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| $\nabla \cdot \vec{\mathbf{B}} = 0$ | divergence of $\vec{\mathbf{B}}$ is zero |
| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | curl of $\vec{\mathbf{E}}$ is proportional to the rate of change of $\vec{\mathbf{B}}$ |
| $\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} = 4 \pi \rho$ | _wha?_ |
输出:
When a=0, there are two solutions to (ax2+bx+c=0) and they are
x=2a−b±b2−4ac
Maxwell's equations:
equation | description |
---|---|
∇⋅B=0 | divergence of B is zero |
∇×E+c1∂t∂B=0 | curl of E is proportional to the rate of change of B |
∇×B−c1∂t∂E=c4πj∇⋅E=4πρ | wha? |
标记
使用 == ==
进行标记。请注意两边需要有空格。
输入:
vuepress-theme-plume 是一个 ==简洁美观== 的 主题
输出:
vuepress-theme-plume 是一个 简洁美观 的 主题
上下角标
- 使用
^ ^
进行上角标标注。 - 使用
~ ~
进行下角标标注。
输入:
- 19^th^
- H~2~O
输出:
- 19th
- H2O
自定义对齐
输入:
::: left
左对齐的内容
:::
::: center
居中的内容
:::
::: right
右对齐的内容
:::
输出:
左对齐的内容
居中的内容
右对齐的内容
属性支持
你可以使用特殊标记为 Markdown 元素添加属性。
为图片添加属性:
这将为图片添加 一个 名为 full-width
的 class 属性,以及一个 width
属性,值为 100%
。
{.full-width width="100%"}
同时也支持其他属性:
一个包含文字的段落。 {#p .a .b align=center customize-attr="content with spaces"}
这将被渲染为:
<p id="p" class="a b" align="center" customize-attr="content with spaces">
一个包含文字的段落。
</p>
任务列表
输入:
- [ ] 任务 1
- [x] 任务 2
- [ ] 任务 3
输出:
脚注
输入:
人生自古谁无死,留取丹心照汗青[^脚注1]。
[^脚注1]: 出自 宋·文天祥 **《过零丁洋》**
输出:
人生自古谁无死,留取丹心照汗青[1]。
出自 宋·文天祥 《过零丁洋》 ↩︎