import * as mars3d from "mars3d"
|
|
export let map // mars3d.Map三维地图对象
|
export let graphicLayer
|
|
let geoJsonLayerDTH
|
|
// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
|
export const mapOptions = {
|
scene: {
|
center: { lat: 43.822109, lng: 125.14311, alt: 890, heading: 337, pitch: -50 }
|
},
|
control: {
|
infoBox: false
|
}
|
}
|
|
export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中
|
|
/**
|
* 初始化地图业务,生命周期钩子函数(必须)
|
* 框架在地图初始化完成后自动调用该函数
|
* @param {mars3d.Map} mapInstance 地图对象
|
* @returns {void} 无
|
*/
|
export function onMounted(mapInstance) {
|
map = mapInstance // 记录map
|
|
// 三维模型
|
const tilesetLayer = new mars3d.layer.TilesetLayer({
|
type: "3dtiles",
|
name: "校园",
|
url: "//data.mars3d.cn/3dtiles/qx-xuexiao/tileset.json",
|
position: { alt: 15.8 },
|
maximumScreenSpaceError: 1,
|
maximumMemoryUsage: 1024
|
})
|
map.addLayer(tilesetLayer)
|
|
// 单体化图层
|
geoJsonLayerDTH = new mars3d.layer.GeoJsonLayer({
|
name: "校园-单体化",
|
symbol: {
|
type: "polygonP",
|
styleOptions: {
|
// 单体化默认显示样式
|
color: "rgba(255, 255, 255, 0.01)",
|
clampToGround: true,
|
classification: true,
|
buffer: 1,
|
// 单体化鼠标移入或单击后高亮的样式
|
highlight: {
|
type: mars3d.EventType.click,
|
color: "rgba(255,255,0,0.4)"
|
}
|
}
|
},
|
popup: [
|
{ field: "name", name: "学校场所" },
|
{ field: "sfkf", name: "是否开放" },
|
{ field: "remark", name: "备注信息" }
|
]
|
})
|
map.addLayer(geoJsonLayerDTH)
|
|
graphicLayer = new mars3d.layer.GraphicLayer({
|
hasEdit: true,
|
isAutoEditing: true, // 绘制完成后是否自动激活编辑
|
symbol: {
|
type: "polygon",
|
merge: true, // 是否合并并覆盖json中已有的style,默认不合并
|
styleOptions: {
|
color: "rgba(255, 255, 0, 0.4)",
|
clampToGround: true
|
}
|
}
|
})
|
map.addLayer(graphicLayer)
|
|
// 触发自定义事件
|
graphicLayer.on(mars3d.EventType.drawCreated, function (e) {
|
const graphic = e.graphic
|
eventTarget.fire("graphicEditor-start", { graphic })
|
})
|
graphicLayer.on(
|
[mars3d.EventType.editStart, mars3d.EventType.editMovePoint, mars3d.EventType.editStyle, mars3d.EventType.editRemovePoint],
|
function (e) {
|
const graphic = e.graphic
|
eventTarget.fire("graphicEditor-update", { graphic })
|
}
|
)
|
graphicLayer.on([mars3d.EventType.editStop, mars3d.EventType.removeGraphic], function (e) {
|
eventTarget.fire("graphicEditor-stop")
|
})
|
|
// 加载数据
|
const configUrl = "//data.mars3d.cn/file/geojson/dth-xuexiao-fd.json"
|
mars3d.Util.fetchJson({ url: configUrl })
|
.then(function (result) {
|
graphicLayer.loadGeoJSON(result)
|
})
|
.catch(function (error) {
|
console.log("加载JSON出错", error)
|
})
|
|
bindLayerContextMenu()
|
}
|
|
/**
|
* 释放当前地图业务的生命周期函数
|
* @returns {void} 无
|
*/
|
export function onUnmounted() {
|
map = null
|
}
|
|
/**
|
* 绑定右键菜单功能,开始编辑,删除等
|
*@returns {void} 无
|
*/
|
export function bindLayerContextMenu() {
|
graphicLayer.bindContextMenu([
|
{
|
text: "开始编辑对象",
|
icon: "fa fa-edit",
|
show: function (e) {
|
const graphic = e.graphic
|
if (!graphic || !graphic.startEditing) {
|
return false
|
}
|
return !graphic.isEditing
|
},
|
callback: function (e) {
|
const graphic = e.graphic
|
if (!graphic) {
|
return false
|
}
|
if (graphic) {
|
graphicLayer.startEditing(graphic)
|
}
|
}
|
},
|
{
|
text: "停止编辑对象",
|
icon: "fa fa-edit",
|
show: function (e) {
|
const graphic = e.graphic
|
if (!graphic) {
|
return false
|
}
|
return graphic.isEditing
|
},
|
callback: function (e) {
|
const graphic = e.graphic
|
if (!graphic) {
|
return false
|
}
|
if (graphic) {
|
graphicLayer.stopEditing(graphic)
|
}
|
}
|
},
|
{
|
text: "删除对象",
|
icon: "fa fa-trash-o",
|
show: (event) => {
|
const graphic = event.graphic
|
if (!graphic || graphic.isDestroy) {
|
return false
|
} else {
|
return true
|
}
|
},
|
callback: function (e) {
|
const graphic = e.graphic
|
if (!graphic) {
|
return
|
}
|
const parent = graphic._parent // 右击是编辑点时
|
graphicLayer.removeGraphic(graphic)
|
if (parent) {
|
graphicLayer.removeGraphic(parent)
|
}
|
}
|
},
|
{
|
text: "计算周长",
|
icon: "fa fa-medium",
|
callback: function (e) {
|
const graphic = e.graphic
|
const strDis = mars3d.MeasureUtil.formatDistance(graphic.distance)
|
globalAlert("该对象的周长为:" + strDis)
|
}
|
},
|
{
|
text: "计算面积",
|
icon: "fa fa-reorder",
|
callback: function (e) {
|
const graphic = e.graphic
|
const strArea = mars3d.MeasureUtil.formatArea(graphic.area)
|
globalAlert("该对象的面积为:" + strArea)
|
}
|
}
|
])
|
}
|
|
// 切换到预览模式
|
export function toYLMS() {
|
const geojson = graphicLayer.toGeoJSON()
|
|
geoJsonLayerDTH.load({ data: geojson })
|
|
graphicLayer.hasEdit = false
|
graphicLayer.show = false
|
}
|
|
// 切换到编辑模式
|
export function toBJMS() {
|
geoJsonLayerDTH.clear()
|
graphicLayer.hasEdit = true
|
graphicLayer.show = true
|
}
|
|
export function deleteAll() {
|
graphicLayer.clear()
|
}
|
|
export function drawPolygon() {
|
graphicLayer.startDraw({
|
type: "polygon",
|
style: {
|
color: "#ffff00",
|
opacity: 0.3,
|
outline: true,
|
outlineColor: "#000000",
|
clampToGround: true
|
}
|
})
|
}
|
|
/**
|
*打开geojson文件
|
*
|
* @export
|
* @param {FileInfo} file 文件名称
|
* @returns {void} 无
|
*/
|
export function openGeoJSON(file) {
|
const fileName = file.name
|
const fileType = fileName?.substring(fileName.lastIndexOf(".") + 1, fileName.length).toLowerCase()
|
|
if (fileType === "json" || fileType === "geojson") {
|
const reader = new FileReader()
|
reader.readAsText(file, "UTF-8")
|
reader.onloadend = function (e) {
|
const json = this.result
|
graphicLayer.loadGeoJSON(json, {
|
clear: true,
|
flyTo: true
|
})
|
|
}
|
} else {
|
globalMsg("暂不支持 " + fileType + " 文件类型的数据!")
|
}
|
}
|
|
// 保存JSON文件
|
export function saveGeoJSON() {
|
|
if (graphicLayer.length === 0) {
|
globalMsg("当前没有标注任何数据,无需保存!")
|
return
|
}
|
const layers = map.getLayerById(graphicLayer.id)
|
const geojson = layers.toGeoJSON()
|
mars3d.Util.downloadFile("单体化.json", JSON.stringify(geojson))
|
}
|