高德地图meshLine使用两个点画3D曲线

高德地图meshLine使用两个点画3D曲线

效果图:

在这里插入图片描述
高德官方示例的meshLine用了4个点画线,贝塞尔曲线2个点就能画,另外2个点应该是用来确定曲线垂直方向的弯曲,实现图上的需求只需要2个点,当然还需要一个弯曲度的参数,也就是曲线顶点到两点直线之间的距离。本人数学不好,只能拿官方的例子来改,源码见:MeshLine-线 Line-示例中心-地图 JS API | 高德地图API

var map = new AMap.Map("container", {
	mapStyle: 'amap://styles/darkblue', //设置地图的显示样式
	resizeEnable: true,
	center: [114, 30],
	zoom: 5.5,
	viewMode: '3D',
	pitch: 40  //3D地图倾斜度
});
const object3Dlayer = new AMap.Object3DLayer();
const center = {lng:114.301803,lat:30.599835};	//起点
const points = [								//终点集合,这些点最终和起点连线
	{lng:104.075809, lat:30.651239},
	{lng:113.543028, lat:22.186835},
	{lng:106.551643, lat:29.562849},
	{lng:102.710002, lat:25.045806},
	{lng:116.407394, lat:39.904211},
	{lng:112.562678, lat:37.873499},
	{lng:112.983602, lat:28.112743},
	{lng:108.954347, lat:34.265502},
	{lng:121.473662, lat:31.230372},
	{lng:120.152585, lat:30.266597},
	{lng:119.295143, lat:26.100779},
	{lng:106.705463, lat:26.600055},
	{lng:109.194828, lat:27.755017},
	{lng:116.369774, lat:28.000249},
	{lng:106.766385, lat:31.892508}
];
for (let i = 0; i < points.length; i++) {
	const point = points[i];
	const meshLine = new AMap.Object3D.MeshLine({
		path: computeBezier(center,point, 180),			//计算曲线
		height: getEllipseHeight(180, 4500000, 20),		//计算高度 maxHeight可自定义
		color: 'rgba(55,129,240, 1)',					//线条颜色
		width: 1										//线条宽度
	});
	meshLine.transparent = true;
	object3Dlayer.add(meshLine);
	meshLine['backOrFront'] = 'both';
}
map.add(object3Dlayer);

function computeBezier(center,point, numberOfPoints) {
	let dt;
	let i;
	const curve = [];
	dt = 1.0 / (numberOfPoints - 1);
	for (i = 0; i < numberOfPoints; i++) {
		curve[i] = pointOnCubicBezier(center,point, i * dt);//计算曲线
	}
	return curve;
}
function getEllipseHeight(count, maxHeight, minHeight) {
	const height = [];
	const radionUnit = Math.PI / count;
	
	for (let i = 0; i < count; i++) {
		const radion = i * radionUnit;
		height.push(minHeight + Math.sin(radion) * maxHeight);
	}
  return height;
}
function pointOnCubicBezier(center,point, t) {
	let cx;
	let cy;
	cx = (point.lng - center.lng);
	cy = (point.lat - center.lat);
	const lng =  (cx * t) + center.lng;
	const lat =  (cy * t) + center.lat;
	return new AMap.LngLat(lng, lat);
}
使用高德地图API来计算两个之间的公里数,你需要按照以下步骤操作: 1. 首先,确保你已经在项目中引入了高德地图JavaScript SDK。如果你还没有,可以从高德官网下载并引入相关的JS文件。 2. 注册开发者账号并在高德开放平台申请地图服务权限(http://lbs.amap.com/console/key),获取到你的key。 3. 创建一个地图实例,并设置中心和缩放级别,以便定位起和终。例如: ```javascript var map = new AMap.Map('container', { center: [经度, 纬度], // 两经纬度坐标 zoom: 10 // 显示比例尺大小,默认18 }); ``` 4. 使用`AMap.Geolocation`获取用户的当前位置作为起: ```javascript AMap.geolocation.getCurrentPosition(function(position) { var startLocation = [position.lng, position.lat]; // 计算终距离 }, function(error) { alert('获取位置失败'); }); ``` 5. 调用高德地图提供的`AMap.Polyline`或`AMap.Marker`来表示路径,然后获取路径长度(这里通常是按直线距离计算): ```javascript AMap.services.search.route({ start: startLocation, end: [目标经度, 目标纬度], origin: '起', destination: '终', travelMode: 'Driving', // 指定出行方式(如驾车、公交等) success: function(result) { var route = result.routes[0]; // 获取第一条路线 console.log('两地直线距离:', route.distance / 1000, '公里'); // 结果单位为米,除以1000转换成公里 }, error: function() { alert('路线查询失败'); } }); ``` 6. 在实际应用中,你可能需要处理回调中的错误信息,并考虑网络请求的情况,如果用户离线则可能无法获得准确的距离。 记得替换`startLocation`和`目标经度纬度`为你实际想要计算的两个的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值