面插值计算效果展示:
(离屏渲染方式)面插值效果展示:
面内插值计算插点效果展示:
线插值效果展示:
(离屏渲染方式)高密度线内插值计算效果展示:
相关代码:
import * as mars3d from "mars3d"
export let map // mars3d.Map三维地图对象
// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
export const mapOptions = {
scene: {
center: { lat: 30.841762, lng: 116.26537, alt: 3281, heading: 39, pitch: -63 }
}
}
/**
* 初始化地图业务,生命周期钩子函数(必须)
* 框架在地图初始化完成后自动调用该函数
* @param {mars3d.Map} mapInstance 地图对象
* @returns {void} 无
*/
export function onMounted(mapInstance) {
map = mapInstance // 记录map
}
/**
* 释放当前地图业务的生命周期函数
* @returns {void} 无
*/
export function onUnmounted() {
map = null
}
export function removeAll() {
map.graphicLayer.clear()
clearInterResult()
}
/**
* 面插值
*
* @export
* @param {number} val 步长
* @returns {void}
*/
export async function interPolygon(val) {
const graphic = await map.graphicLayer.startDraw({
type: "polygon",
style: {
color: "#29cf34",
opacity: 0.3,
outline: true,
outlineColor: "#ffffff",
clampToGround: true
}
})
const positions = graphic.positionsShow
map.graphicLayer.clear()
const resultInter = await mars3d.PolyUtil.interPolygon({
scene: map.scene,
positions,
splitNum: val // splitNum插值分割的个数
})
showInterPolygonResult(resultInter.list)
}
function showInterPolygonResult(list) {
clearInterResult() // 分析结果用于测试分析的,不做太多处理,直接清除之前的,只保留一个
let pt1, pt2, pt3
const arrData = []
for (let i = 0, len = list.length; i < len; i++) {
const item = list[i]
pt1 = item.point1.pointDM
pt2 = item.point2.pointDM
pt3 = item.point3.pointDM
// 点
for (const pt of [item.point1, item.point2, item.point3]) {
const graphic = new mars3d.graphic.PointPrimitive({
position: pt.pointDM,
style: {
pixelSize: 9,
color: Cesium.Color.fromCssColorString("#ff0000").withAlpha(0.5)
}
})
interGraphicLayer.addGraphic(graphic)
graphic.bindTooltip("点高度:" + mars3d.MeasureUtil.formatDistance(pt.height))
}
// 横截面面积
item.area = item.area || mars3d.MeasureUtil.getTriangleArea(pt1, pt2, pt3)
item.index = i
// 三角网及边线
arrData.push({
positions: [pt1, pt2, pt3, pt1],
style: {
color: Cesium.Color.fromRandom({ alpha: 0.6 })
},
attr: item
})
}
// 三角网面(单击用)
const primitivePoly = new mars3d.graphic.PolygonCombine({
instances: arrData,
highlight: {
type: mars3d.EventType.click,
color: Cesium.Color.YELLOW.withAlpha(0.9)
}
})
interGraphicLayer.addGraphic(primitivePoly)
primitivePoly.bindTooltip(function (event) {
const item = event.pickedObject?.data?.attr
if (!item) {
return
}
return "三角面积:" + mars3d.MeasureUtil.formatArea(item.area) + "(第" + item.index + "个)"
})
// 三角网边线
const primitiveLine = new mars3d.graphic.PolylineCombine({
instances: arrData,
highlight: {
type: mars3d.EventType.click,
color: Cesium.Color.YELLOW.withAlpha(0.9)
}
})
interGraphicLayer.addGraphic(primitiveLine)
}
export async function interPolygonGrid(val) {
clearInterResult()
const graphic = await map.graphicLayer.startDraw({
type: "polygon",
style: {
color: "#29cf34",
opacity: 0.3,
outline: true,
outlineColor: "#ffffff"
}
})
const positions = graphic.positionsShow
map.graphicLayer.clear()
const result = mars3d.PolyUtil.getGridPointsByPoly(positions, val)
result.forEach((p, i) => {
const graphic = new mars3d.graphic.PointPrimitive({
position: p,
style: {
color: "#ff0000",
pixelSize: 6
}
})
interGraphicLayer.addGraphic(graphic)
})
}
/**
* 面插值
*
* @export
* @param {number} val 步长
* @returns {void}
*/
export async function interPolygonByDepth(val) {
const graphic = await map.graphicLayer.startDraw({
type: "polygon",
style: {
color: "#29cf34",
opacity: 0.3,
outline: true,
outlineColor: "#ffffff",
clampToGround: true
}
})
const positions = graphic.positionsShow
map.graphicLayer.clear()
updateAllGraphicShow(map, false)
const resultInter = await mars3d.PolyUtil.interPolygonByDepth({
scene: map.scene,
positions,
splitNum: val // splitNum插值分割的个数
})
updateAllGraphicShow(map, true)
showInterPolygonByDepthResult(resultInter)
}
function showInterPolygonByDepthResult(resultInter) {
clearInterResult() // 分析结果用于测试分析的,不做太多处理,直接清除之前的,只保留一个
const arrData = []
for (let i = 0, len = resultInter.count; i < len; i++) {
const position = resultInter.positions[i]
// const graphic = new mars3d.graphic.PointPrimitive({
// position: position,
// style: {
// pixelSize: 9,
// color: Cesium.Color.fromCssColorString("#ff0000").withAlpha(0.5)
// }
// })
// interGraphicLayer.addGraphic(graphic)
// graphic.bindTooltip("点高度:" + mars3d.MeasureUtil.formatDistance(position.height))
arrData.push({
positions: position.getOutline(),
style: {
color: Cesium.Color.fromRandom({ alpha: 0.4 })
},
attr: { height: position.height, index: i }
})
}
const primitivePoly = new mars3d.graphic.PolygonCombine({
instances: arrData,
highlight: {
type: mars3d.EventType.click,
color: Cesium.Color.YELLOW.withAlpha(0.9)
}
})
interGraphicLayer.addGraphic(primitivePoly)
primitivePoly.bindTooltip(function (event) {
const item = event.pickedObject?.data?.attr
if (!item) {
return
}
return "点高度:" + mars3d.MeasureUtil.formatDistance(item.height) + "(第" + item.index + "个)"
})
}
// 线插值
export async function interPolyline(val) {
const graphic = await map.graphicLayer.startDraw({
type: "polyline",
style: {
color: "#55ff33",
width: 3,
clampToGround: true
}
})
const positions = graphic.positionsShow
map.graphicLayer.clear()
const arrLine = mars3d.PolyUtil.interPolyline({
scene: map.scene,
positions,
splitNum: val // 插值分割的个数
})
showInterLineResult(arrLine)
}
// 高度等分
export async function interLine(val) {
const graphic = await map.graphicLayer.startDraw({
type: "polyline",
style: {
color: "#55ff33",
width: 3
}
})
const positions = graphic.positionsShow
map.graphicLayer.clear()
const arrLine = mars3d.PolyUtil.interLine(positions, {
splitNum: val // 插值分割的个数
})
showInterLineResult(arrLine)
}
export async function interLineByDepth(val) {
const graphic = await map.graphicLayer.startDraw({
type: "polyline",
style: {
color: "#55ff33",
width: 3
}
})
const positions = graphic.positionsShow
map.graphicLayer.clear()
updateAllGraphicShow(map, false)
const resultInter = await mars3d.PolyUtil.interPolylineByDepth({
scene: map.scene,
positions,
splitNum: val // 插值分割的个数
})
updateAllGraphicShow(map, true)
showInterLineResult(resultInter.positions)
}
// 显示影藏矢量数据
function updateAllGraphicShow(map, show) {
map.eachLayer((layer) => {
if (layer.type === "graphic") {
layer.show = show
}
})
}
// 显示mars3d.polygon.interPolygon处理后的面内插值分析结果,主要用于测试对比
// 显示面的插值计算结果,方便比较分析
let interGraphicLayer
function clearInterResult() {
if (!interGraphicLayer) {
interGraphicLayer = new mars3d.layer.GraphicLayer()
map.addLayer(interGraphicLayer)
}
interGraphicLayer.clear()
}
//
function showInterLineResult(list) {
clearInterResult() // 分析结果用于测试分析的,不做太多处理,直接清除之前的,只保留最后一个
const colorList = [Cesium.Color.fromCssColorString("#ffff00"), Cesium.Color.fromCssColorString("#00ffff")]
const arrData = []
for (let i = 1, len = list.length; i < len; i++) {
const pt1 = list[i - 1]
const pt2 = list[i]
const color = colorList[i % 2]
arrData.push({
positions: [pt1, pt2],
style: {
width: 3,
color,
depthFailColor: color
},
attr: {
distance: Cesium.Cartesian3.distance(pt1, pt2),
index: i
}
})
}
const primitiveLine = new mars3d.graphic.PolylineCombine({
instances: arrData,
highlight: {
type: mars3d.EventType.click,
color: Cesium.Color.RED
}
})
interGraphicLayer.addGraphic(primitiveLine)
primitiveLine.bindTooltip(function (event) {
const item = event.pickedObject?.data?.attr
if (!item) {
return
}
return "长度:" + mars3d.MeasureUtil.formatDistance(item.distance) + "(第" + item.index + "个)"
})
}