根据给定文件的信息,我们可以提炼出以下几个核心知识点: ### 知识点一:三线算法Flex版概述 在地理信息系统(GIS)领域中,“三线算法Flex版”是一种用于计算和绘制平行线的方法。该算法的主要功能是基于给定的一条直线以及一个特定的距离值,计算出与该直线平行且位于其两侧的另外两条直线的位置。 ### 知识点二:计算两点之间的距离 #### 函数定义 - **函数名称**:`getDistance` - **输入参数**: - `startP`:起点坐标(类型为`MapPoint`) - `endP`:终点坐标(类型为`MapPoint`) - **返回值**:两点间的距离(单位为米) #### 实现细节 该函数首先定义了地球半径`R`为6378137.0米,并通过以下步骤计算两点间的距离: 1. 计算经度差和纬度差。 2. 使用球面三角公式计算两点间的大圆距离。 ### 知识点三:设置平行点 #### 函数定义 - **函数名称**:`setParallelPoints` - **输入参数**: - `MVCArray`:原始多边形顶点数组 - `L`:平行线之间的距离 - **返回值**:无 #### 实现细节 此函数的主要逻辑包括: 1. 初始化多边形顶点数组`polyArr`。 2. 遍历数组中的每个点,并计算与当前点相邻的前一点和后一点。 3. 对于数组中的每个点,调用`getParallelPoint`函数来计算平行点,并将这些点分别存储在`ParallelA`和`ParallelB`数组中。 ### 知识点四:初始化多边形顶点数组 #### 函数定义 - **函数名称**:`initPolyline` - **输入参数**: - `oldArr`:原始多边形顶点数组 - `L`:平行线之间的距离 - **返回值**:新的多边形顶点数组 #### 实现细节 为了确保最终生成的平行线足够平滑,此函数执行以下操作: 1. 检查输入数组长度是否小于2,如果是,则直接返回原数组。 2. 在数组的起始位置插入一个点,以确保曲线的连续性。 3. 遍历数组中的每个点,计算两点之间的距离。如果两点间的距离大于设定的阈值`L`,则将当前点添加到新数组中。 4. 在数组的末尾添加最后一个点。 ### 知识点五:计算平行点 虽然给定的部分代码中没有完整展示`getParallelPoint`函数的具体实现,但根据上下文可以推测,该函数主要负责: - 接收三个点`p0`, `p1`, `p2`作为输入。 - 根据这三个点计算出与中间点`p1`平行且位于其两侧的两个点。 - 计算过程中可能涉及到向量运算、角度计算等数学方法。 ### 结论 “三线算法Flex版”是一种高效的计算平行线的方法,它通过计算两点间的距离、初始化多边形顶点数组以及计算平行点等方式实现了这一功能。这种算法对于GIS应用非常有用,特别是在地图绘制、路径规划等领域。通过对上述知识点的理解,开发者可以更好地掌握该算法的核心思想并将其应用于实际项目中。


















/**
* 求两点间距离
* @param {LatLng} startP 起点
* @param {LatLng} endP 终点
* @return {number} 距离 单位:米
*/
private static function getDistance(startP:MapPoint,endP:MapPoint):Number{
// 大地反算,知道两点的纬度和经度,
// 求大地线的长度(和投影后的平面距离至差1cm左右). Help by LinXB
// <param name="startP">起点的纬度和经度,单位:度</param>
// <param name="endP">终点的纬度和经度,单位:度</param>
// <returns>输出:距离,单位:m</returns>
// 输入:170181690毫秒,475273606, 170181698, 475273509,结果是2.05米
var x:Number, y:Number, result:Number;
var R:Number = 6378137.0; //84椭球
x=(endP.x-startP.x)*Math.PI*R*Math.cos(((startP.y+endP.y)/2)*Math.PI/180)/180;
y=Math.PI*(endP.y - startP.y)*R/180;
result = Math.sqrt(x * x + y * y);
return result;
}
//生成平行线数组
private static function setParallelPoints(MVCArray:Array, L:Number):void{
var polytemp:Array = [], polyArr:Array = [];
// 优化主线点集
polyArr = initPolyline(MVCArray, L);
for (var i:int=1; i < polyArr.length-1; i++ )
{
var lat1:Number, lng1:Number, lat2:Number, lng2:Number;
var p0:MapPoint = polyArr[i-1];
var p1:MapPoint = polyArr[i];
var p2:MapPoint = polyArr[i+1];
if(MeasuredLineDistance==0){
GraphicSymbolInit();
}
var d_latlng:MapPoint = getParallelPoint(p0, p1, p2, MeasuredLineDistance);
lat1 = p1.y + d_latlng.y;
lng1 = p1.x + d_latlng.x;
lat2 = p1.y - d_latlng.y;
lng2 = p1.x- d_latlng.x;
ParallelA.push(new MapPoint(lng1,lat1 ));
ParallelB.push(new MapPoint(lng2,lat2 ));
}
}
/**
* 优化主线点集
* 折线点集首尾加上辅助点,去掉点间距离过紧的多余点
* @param {oldArr} 折线点集数组
* @param {L} 相邻两点间直线距离标准(单位:米)
* @return newArr 新折线点集数组
*/
private static function initPolyline(oldArr:Array, L:Number):Array{
var newArr:Array = [];
剩余6页未读,继续阅读


- 粉丝: 12
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源


