根据道路中心线矢量图层在三维场景中自动铺路
                        tePolyline.TextureTilingMethod = TilingMethodCode.TM_METERS_PER_TILE;
                        tePolyline.TextureScaleX = douRoadWidth;
                        tePolyline.TextureScaleY = douRoadWidth;
                        tePolyline.TextureRotateAngle = 90;
                        tePolyline.FgAlpha = 0.0;
                    }
                }
                recs.MoveNext();

            }
        }
        /// <summary>
        /// 获取多边形的顶点坐标数组   这个函数用来根据道路中心线的坐标串和道路宽度两个参数生成多边形节点坐标数组。
        /// </summary>
        private object[] GetPolygonPoints(Points ptsTemp,double douRoadWith)
        {
            double Alpha, douLength, dYaw;
            object dXL, dYL, dHL, dXR, dYR, dHR;
            object oYaw, oPich, oYaw1, oYaw2, oPich1, oPich2, oYawTemp;

            ESRI.MapObjects2.Core.Point ptS,ptE;
            object[] ptsPolygon=new object[ptsTemp.Count*6];
            for (int i = 0; i < ptsTemp.Count; i++)
            {
                Alpha=0;
                if (i == 0)
                {
                    ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
                    ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i + 1);
                    clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw, out oPich);
                    dYaw = (double)oYaw;
                }
                else
                {
                    if (i == ptsTemp.Count - 1)
                    {
                        ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i-1);
                        ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
                        clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw, out oPich);
                        dYaw = (double)oYaw;

                    }
                    else               
                    {
                        ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i - 1);
                        ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
                        clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw1, out oPich1);

                        ptS = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i);
                        ptE = (ESRI.MapObjects2.Core.Point)ptsTemp.Item(i+1);
                        clsTE.CoordSys.GetAimingAngles(ptS.X, ptS.Y, 1, ptE.X, ptE.Y, 1, out oYaw2, out oPich2);

                        dYaw = Math.Abs((double)oYaw1 - (double)oYaw2);
                        Alpha = dYaw / 2;
                        if (dYaw > 180) Alpha = 180 - Alpha;
                        if (dYaw > 180)
                        {
                            dYaw = ((double)oYaw1 + (double)oYaw2) / 2 - 180;
                        }
                        else
                        {
                            dYaw = ((double)oYaw1 + (double)oYaw2) / 2;
                        }
                       
                    }
                }
                douLength = douRoadWith / Math.Cos(Alpha*Math.PI/180);
                if (douLength > douRoadWith * 6)
                {
                    douLength = douRoadWith * 6;
                }
               
                dXL=dXR=(object)ptsTemp.Item(i).X;
                dYL=dYR=(object)ptsTemp.Item(i).Y;
                dHL=dHR=0;
                oYawTemp = (object)(dYaw - 90);

                clsTE.CoordSys.MoveCoordEx(ref dXL, ref dYL, ref dHL, ref oYawTemp, 0, 0, douLength, 0, 0);
                dHL = (object)clsTE.Terrain.GetGroundHeight((double)dXL, (double)dYL, AccuracyLevel.ACCURACY_BEST_FROM_MPT);
                oYawTemp = (object)(dYaw + 90);
                clsTE.CoordSys.MoveCoordEx(ref dXR, ref dYR, ref dHR, ref oYawTemp, 0, 0, douLength, 0, 0);
                dHR = (object)clsTE.Terrain.GetGroundHeight((double)dXR, (double)dYR, AccuracyLevel.ACCURACY_BEST_FROM_MPT);

                ptsPolygon[i * 3] = dXL;
                ptsPolygon[i * 3 + 1] = dHL;
                ptsPolygon[i * 3 + 2] = dYL;
                ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3] = dXR;
                ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3 + 1] = dHR;
                ptsPolygon[(ptsTemp.Count * 2 - 1 - i) * 3 + 2] = dYR;
            }
            return ptsPolygon;
        }

相关文章:

  • 2021-07-20
  • 2021-11-18
  • 2021-11-17
  • 2022-12-23
  • 2021-11-02
  • 2021-08-07
  • 2021-08-26
  • 2021-08-19
猜你喜欢
  • 2021-11-26
  • 2022-01-04
  • 2021-06-09
  • 2022-02-16
  • 2022-12-23
  • 2021-08-18
  • 2021-10-17
相关资源
相似解决方案