解决思路及核心算法:
-
将在地图上所画的折线拆分成几个线段(直线),API中的Polyline对象提供了获取每个线段的接口:
Flex API中的POLYLINE接口
JavaScript API中的POLYLINE接口
备注:一条polyline由多个线段组成。
-
计算视频点到折线的垂直点即投影点:
核心算法如下:
/**
* 功能:根据线段的起点、终点和视频点坐标,计算视频点到直线垂直点
* point1:线段的起点
* point2:线段的终点
* point3:视频点
*/
privatefunction getVerticalPoint(point1:MapPoint,point2:MapPoint,point3:MapPoint):void{
//一般式方程aX+bY+c=0
var a:Number = point2.y - point1.y;
var b:Number = point1.x - point2.x;
var c:Number = point2.x*point1.y-point1.x*point2.y;
//计算点到直线的垂直点坐标
var vx:Number = (b*b*point3.x-a*b*point3.y-a*c)/(a*a+b*b);
var vy:Number = (a*a*point3.y-a*b*point3.x-b*c)/(a*a+b*b);
varverticalPoint:MapPoint = new MapPoint(vx,vy,map.spatialReference); //垂直点坐标
var verticalGraphic:Graphic = new Graphic(verticalPoint);
graphicsLayer.add(verticalGraphic); //添加到客户端图层
}
-
判断垂直点是否在此线段上,具体可以使用几何服务或几何引擎(如果使用的是JavaScript API,提供了本地几何引擎操作),里面提供了两个几何之间的是否相交的接口:
JavaScript API本地几何引擎的几何相交判断接口
-
如果垂直点和线段相交,那么再计算垂直点到线段起点的距离,并根据距离的长短来确定视频点的次序。