当前位置: 首页 > article >正文

Arcgis地图实战三:自定义导航功能的实现

文章目录

    • 1.最终效果预览
    • 2.计算两点之间的距离
    • 3.将点线画到地图上
    • 4.动态展示点线的变化
    • 5.动态画线
    • 6.动态画点

1.最终效果预览

loc222

2.计算两点之间的距离

let dis = this.utilsTools.returnDisByCoorTrans(qdXYData, zdXYData, "4549")

当距离小于我们在配置文件中预设置的值时调用我们自定义开发的导航,大于预设值则调用百度或者高德导航

在utilsTools工具类中我们封装了如下方法

returnDisByCoorTrans(curxy, tarxy, wikid) {
		let dis = "0";
		let pxy1 = this.coordinateUtil.coorConvert(curxy["latitude"], curxy["longitude"], wikid)
		let pxy2 = this.coordinateUtil.coorConvert(tarxy["y"], tarxy["x"], wikid)
		let pA = {
			x: pxy1.x,
			y: pxy1.y,
		}
		let pB = {
			x: pxy2.x,
			y: pxy2.y,
		}
		dis = this.returnDistanceByTwoPoint(pA, pB)
		return dis
	}

在坐标转换工具类coordinateUtil中我们封装了如下方法,参数以江苏通州为例

 coorConvert(lat, lon, targetWikid): any {
        if (targetWikid == "4549") {
            this.aAxis_Target = 6378137;
            this.bAxis_Target = 6356752.31414;
            this.m_dbMidLongitude = 120;
            return this.gaussBLtoXY(lat, lon, this.aAxis_Target, this.bAxis_Target, this.m_dbMidLongitude);
        }    
    }
    
    
    public gaussBLtoXY(mX: number, mY: number, Axis_Target_a: number, Axis_Target_b: number, m_dbMidLongitude: number): any {
        let m_aAxis = Axis_Target_a; //参考椭球长半轴
        let m_bAxis = Axis_Target_b; //参考椭球短半轴
        //double m_dbMidLongitude = transParaSeven.daihao*3;//中央子午线经度 济南117 威海123 巴州 87 通州120
        let m_xOffset = 500000;
        let m_yOffset = 0.0;
        try {
            //角度到弧度的系数
            let dblD2R = Math.PI / 180;
            //代表e的平方
            let e1 = (Math.pow(m_aAxis, 2) - Math.pow(m_bAxis, 2)) / Math.pow(m_aAxis, 2);
            //代表e'的平方
            let e2 = (Math.pow(m_aAxis, 2) - Math.pow(m_bAxis, 2)) / Math.pow(m_bAxis, 2);
            //a0
            let a0 = m_aAxis * (1 - e1) * (1.0 + (3.0 / 4.0) * e1 + (45.0 / 64.0) * Math.pow(e1, 2) + (175.0 / 256.0) * Math.pow(e1, 3) + (11025.0 / 16384.0) * Math.pow(e1, 4));
            //a2                
            let a2 = -0.5 * m_aAxis * (1 - e1) * (3.0 / 4 * e1 + 60.0 / 64 * Math.pow(e1, 2) + 525.0 / 512.0 * Math.pow(e1, 3) + 17640.0 / 16384.0 * Math.pow(e1, 4));
            //a4
            let a4 = 0.25 * m_aAxis * (1 - e1) * (15.0 / 64 * Math.pow(e1, 2) + 210.0 / 512.0 * Math.pow(e1, 3) + 8820.0 / 16384.0 * Math.pow(e1, 4));
            //a6
            let a6 = (-1.0 / 6.0) * m_aAxis * (1 - e1) * (35.0 / 512.0 * Math.pow(e1, 3) + 2520.0 / 16384.0 * Math.pow(e1, 4));
            //a8
            let a8 = 0.125 * m_aAxis * (1 - e1) * (315.0 / 16384.0 * Math.pow(e1, 4));
            纬度转换为弧度表示
            //B
            let B = mX * dblD2R;
            //l
            let l = (mY - m_dbMidLongitude) * dblD2R;
            X
            let X = a0 * B + a2 * Math.sin(2.0 * B) + a4 * Math.sin(4.0 * B) + a6 * Math.sin(6.0 * B) + a8 * Math.sin(8.0 * B);
            //
            let ll = Math.pow(Math.cos(B), 2) * e2;
            let c = m_aAxis * m_aAxis / m_bAxis;
            //N
            let N = c / Math.sqrt(1 + ll);
            //t
            let t = Math.tan(B);
            let p = Math.cos(B) * l;
            let dby = X + N * t * (1 + ((5.0 - t * t + (9.0 + 4.0 * ll) * ll) + ((61.0 + (t * t - 58.0) * t * t + (9.0 - 11.0 * t * t) * 30.0 * ll) + (1385.0 + (-31111.0 + (543 - t * t) * t * t) * t * t) * p * p / 56.0) * p * p / 30.0) * p * p / 12.0) * p * p / 2.0;
            let dbx;
            dbx = N * (1.0 + ((1.0 - t * t + ll) + ((5.0 + t * t * (t * t - 18.0 - 58.0 * ll) + 14 * ll) + (61.0 + (-479.0 + (179.0 - t * t) * t * t) * t * t) * p * p / 42.0) * p * p / 20.0) * p * p / 6.0) * p;
            let mTargetX = dbx + m_xOffset;
            let mTargetY = dby + m_yOffset;
            return { x: mTargetX, y: mTargetY };
        }
        catch (ex) {
            console.error(ex);
            return null;
        }
    }

3.将点线画到地图上

 this.utilsTools.navigationByPointsSelf(curXY, tarXY, 2, this.angleValue)

在utilsTools工具类中封装了画点及画线的方法如下

navigationByPointsSelf(beginPoint, endPoint, expand, angle) {
		this.locatedByBeginNavigationPoint(beginPoint, ['pointerArrow'], 'navigationLayer', angle)
		this.locatedByEndNavigationPoint(endPoint, ['runendsymbol'], 'navigationPointLayer')
		this.drawNavigationFirstLine(beginPoint, endPoint, "navigationLayer", 'polylineDASH')
		this.drawNavigationLineFirstByLocation(beginPoint, endPoint, expand)

	}

画当前点locatedByBeginNavigationPoint
画终点locatedByEndNavigationPoint
画当前点与终点的连线drawNavigationFirstLine
将点线的范围缩放到页面适当位置drawNavigationLineFirstByLocation

locatedByEndNavigationPoint(endPoint, endSymbol, layerName) {
		let pointEndObj = {
			x: Number(endPoint.longitude),
			y: Number(endPoint.latitude),
			spatialReference: { wkid: this.mapConfig.wkid, latestWkid: this.mapConfig.wkid }
		}
		let geoJson = JSON.stringify(pointEndObj)
		let attObj = ""
		let oneObj = { geomertyJSON: geoJson, attributes: attObj };
		let symbol = { "point": endSymbol };
		this.mapTool.AddGraphicToLayer(layerName, [oneObj], symbol);
	}

	locatedByBeginNavigationPoint(beginPoint, beginSymbols, layerName, angleValue) {
		let pointBeginObj = {
			x: Number(beginPoint.longitude),
			y: Number(beginPoint.latitude),
			spatialReference: { wkid: this.mapConfig.wkid, latestWkid: this.mapConfig.wkid }
		}
		let pgeoJson = JSON.stringify(pointBeginObj)
		let pattObj = {
			angle: angleValue
		}
		let beginObj = { geomertyJSON: pgeoJson, attributes: pattObj };
		let symbolpoint = { "point": beginSymbols };
		this.mapTool.AddGraphicToLayer(layerName, [beginObj], symbolpoint)

	}

	drawNavigationLineFirstByLocation(beginPoint, endPoint, expand) {
		let geoObj = {
			type: "polyline",
			paths: [[
				[Number(beginPoint.longitude), Number(beginPoint.latitude)],
				[Number(endPoint.longitude), Number(endPoint.latitude)]
			]],
			spatialReference: { wkid: this.mapConfig.wkid, latestWkid: this.mapConfig.wkid }
		}
		this.mapTool.setExtentByGeo(geoObj, expand)
	}

	drawNavigationFirstLine(beginPoint, endPoint, layerName, lineSymbol) {
		let geoObj = {
			paths: [[
				[Number(beginPoint.longitude), Number(beginPoint.latitude)],
				[Number(endPoint.longitude), Number(endPoint.latitude)]
			]],
			spatialReference: { wkid: this.mapConfig.wkid, latestWkid: this.mapConfig.wkid }
		}
		let geoJson = JSON.stringify(geoObj)
		let attObj = {}
		let oneObj = { geomertyJSON: geoJson, attributes: attObj };
		let symbol = { "polyline": [lineSymbol] };
		this.mapTool.AddGraphicToLayer(layerName, [oneObj], symbol);

	}

在mapTool工具类中封装了将点或者线添加到地图上的操作

4.动态展示点线的变化

 this.navigationInterval = setInterval(() => {
            this.setIntervalData(curXY, tarXY)
        }, 1500);
async setIntervalData(curXY, tarXY) {
        this.angleValue = await this.utilsTools.getAngleData()
        curXY = await this.utilsTools.getDynamicCurXY(curXY)
        this.topNavigationMsg = this.utilsTools.getTopNavigationBoxMgs(curXY, tarXY)
        this.utilsTools.getCaluShowNavigationByInterval(curXY, tarXY, this.angleValue, 2)

    }

在工具类utilsTools中封装了获取当前设备角度的方法getAngleData
在工具类utilsTools中封装了动态获取当前位置的方法getDynamicCurXY
在工具类utilsTools中封装了动态展示导航顶部弹框数据方法getTopNavigationBoxMgs
在工具类utilsTools中封装了动态画点及线的方法getCaluShowNavigationByInterval

动态获取当前设备旋转角度

getAngleData() {
		return new Promise((resolve, reject) => {
			let value = 0
			if (this.mapConfig.isTestData) {
				value = this.getRandomInt(0, 360)
				resolve(value)
			} else {
				this.deviceOrientation.getCurrentHeading().then(
					(data: DeviceOrientationCompassHeading) => {
						value = data["magneticHeading"]
						resolve(value)
					},
					(error: any) => {
						reject(value)
					});
			}
		});
	}
    

动态获取当前坐标

async getDynamicCurXY(xyData) {
		if (this.mapConfig.isTestData) {
			xyData.longitude = xyData.longitude - 0.0008
			xyData.latitude = xyData.latitude - 0.0008
		} else {
			let obj = Object.assign({}, this.mapConfig.mapLocationObj)
			obj.isKeepCallBack = false
			xyData = await this.getXYLocationDataByDeviceType(obj)
		}
		return xyData
	}

导航顶部信息展示

getTopNavigationBoxMgs(beginPoint, endPoint) {
		let topNavigationMsg = {
			up: true,
			upDistance: "",
			down: false,
			downDistance: "",
			left: true,
			leftDistance: "",
			right: false,
			rightDistance: "",
			difDistance: "",
			lineDistance: "",
		}
		let pxy1 = this.coordinateUtil.coorConvert(beginPoint.latitude, beginPoint.longitude, "4549")
		let pxy2 = this.coordinateUtil.coorConvert(endPoint.latitude, endPoint.longitude, "4549")
		let pA = {
			x: pxy1.x,
			y: pxy1.y,
		}
		let pB = {
			x: pxy2.x,
			y: pxy2.y,
		}
		let dis: any = this.returnDistanceByTwoPoint(pA, pB)
		let dx = (pA.x - pB.x)
		let dy = (pA.y - pB.y)
		if (dx >= 0) {
			topNavigationMsg.right = false
			topNavigationMsg.left = true
			topNavigationMsg.leftDistance = Math.abs(dx).toFixed(2)
		} else {
			topNavigationMsg.right = true
			topNavigationMsg.left = false
			topNavigationMsg.rightDistance = Math.abs(dx).toFixed(2)
		}
		if (dy > 0) {
			topNavigationMsg.down = true
			topNavigationMsg.up = false
			topNavigationMsg.downDistance = Math.abs(dy).toFixed(2)
		} else {
			topNavigationMsg.down = false
			topNavigationMsg.up = true
			topNavigationMsg.upDistance = Math.abs(dy).toFixed(2)
		}
		topNavigationMsg.lineDistance = dis
		topNavigationMsg.difDistance = "0"
		return topNavigationMsg
	}

动态画当前点与线的变化

getCaluShowNavigationByInterval(curxy, tarxy, angle, expand) {
		this.drawNavigationLineDynamic(curxy, tarxy, "navigationLayer", 'polylineDASH', expand)
		this.locatedByBeginNavigationPoint(curxy, ['pointerArrow'], "navigationLayer", angle)
	}

5.动态画线

drawNavigationLineDynamic(beginPoint, endPoint, layerName, lineSymbol, expand) {
		let geoObj = {
			type: "polyline",
			paths: [[
				[Number(beginPoint.longitude), Number(beginPoint.latitude)],
				[Number(endPoint.longitude), Number(endPoint.latitude)]
			]],
			spatialReference: { wkid: this.mapConfig.wkid, latestWkid: this.mapConfig.wkid }
		}
		let geoJson = JSON.stringify(geoObj)
		let attObj = {}
		let oneObj = { geomertyJSON: geoJson, attributes: attObj };
		let symbol = { "polyline": [lineSymbol] };
		this.mapTool.ClearGraphicLayerById(layerName)
		this.mapTool.AddGraphicToLayer(layerName, [oneObj], symbol);
		this.mapTool.setCenterByGeo(geoObj, expand, 0.0001)

每次画线前需要将之前图层的起点与线清除ClearGraphicLayerById
画完点线后根据设定的距离判断是否进行缩放setCenterByGeo,0.0001度大约是11米,在mapTool工具类中封装了所有的地图方面的操作,方法基本都是集成的arcgis中的方法

6.动态画点

画带有角度的当前位置点

locatedByBeginNavigationPoint(beginPoint, beginSymbols, layerName, angleValue) {
		let pointBeginObj = {
			x: Number(beginPoint.longitude),
			y: Number(beginPoint.latitude),
			spatialReference: { wkid: this.mapConfig.wkid, latestWkid: this.mapConfig.wkid }
		}
		let pgeoJson = JSON.stringify(pointBeginObj)
		let pattObj = {
			angle: angleValue
		}
		let beginObj = { geomertyJSON: pgeoJson, attributes: pattObj };
		let symbolpoint = { "point": beginSymbols };
		this.mapTool.AddGraphicToLayer(layerName, [beginObj], symbolpoint)

	}

http://www.kler.cn/a/397093.html

相关文章:

  • Java爬虫(HttpURLConnection)详解
  • 双子数(枚举素数)
  • linux逻辑卷练习
  • web——sqliabs靶场——第六关——报错注入和布尔盲注
  • SpringBoot整合Mybatis-Plus实践汇总
  • 论文阅读 - Causally Regularized Learning with Agnostic Data Selection
  • code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED 证书过期
  • 基于社交关系的电商平台发展与创新:以微店买家版为例兼论开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序
  • uniapp 面试题总结常考
  • 5.4.2-1 编写Java程序在HDFS上创建文件
  • 深度学习--优化器
  • 车载诊断架构 --- 关于DTC的开始检测条件
  • Node.js | npm下载安装及环境配置教程
  • 创建第一个react项目
  • 电子可靠性 - 振动
  • Flutter:异步多线程结合
  • 15分钟学 Go 第 57 天 :持续集成与持续部署
  • np.zeros_like奇怪的bug
  • web——sqliabs靶场——第六关——报错注入和布尔盲注
  • AntFlow:一款高效灵活的开源工作流引擎
  • Nginx 上安装 SSL 证书并启用 HTTPS 访问
  • 踏入 C++ 的深邃世界:实现 unordered_set 与 unordered_map 的优雅之旅
  • 问题大集-01-kafka问题
  • 【C语言】前端虚拟DOM
  • 软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
  • 超全超详细使用SAM进行高效图像分割标注(GPU加速推理)