public override float[] CalculateRayPathLoss(RayMethodParam rayParam, IPropagationModel model, ref bool isStopCalculator) { RelayUEPropagationModel propModel = model as RelayUEPropagationModel; float[] rayLossArray = new float[rayParam.EndIndex - rayParam.StartIndex + 1]; if (propModel == null||isStopCalculator) return rayLossArray; for (int i = 0; i < rayLossArray.Length; i++) { if (rayParam.TxEffHeight[i] == -32768 || rayParam.RxEffHeight[i] == -32768f) { rayLossArray[i] = float.MinValue; } else { float distance = GetDotDistance(rayParam.StartIndex,rayParam.CalcResolution, i); float prob = CalcProbability(propModel, distance); rayLossArray[i] = GetPathLoss(propModel, distance, prob); } if (base.m_Log4net.IsDebugEnabled) { string message = string.Concat(new object[] { DateTime.Now.ToString("G"), ",", rayParam.CellName, ",", rayParam.X, ",", rayParam.Y, ",", rayParam.TxEffHeight[0], ",", rayParam.RxEffHeight[i], ",",propModel.PropModelName, ",", base.m_RayIndex, ",", i, ",", rayParam.CalcResolution, ",,,,", rayLossArray[i], ",", rayLossArray[i] }); base.m_Log4net.Debug(message); } } return rayLossArray; }
public override float[] CalculateRayPathLoss(RayMethodParam rayParam, IPropagationModel model, ref bool isStopCalculator) { ITURPPropagationModel iTURPModel = model as ITURPPropagationModel; int startIndex = rayParam.StartIndex; float[] numArray = new float[(rayParam.EndIndex - startIndex) + 1]; if (iTURPModel != null) { StructAntennaParam antennaGainParam = rayParam.AntennaGainParam; float calcResolution = rayParam.CalcResolution; float num5 = (float) Math.Log10((double) rayParam.Frequency); for (int i = 0; i < numArray.Length; i++) { if (isStopCalculator) { return numArray; } if (rayParam.RxEffHeight[i] != -32768f) { float num6; if ((i + startIndex) == 0) { num6 = 0f; } else { num6 = (float) Math.Log10((double) ((i + startIndex) * rayParam.CalcResolution)); } float num3 = (i + startIndex) * calcResolution; numArray[i] = ((iTURPModel.K2 + (iTURPModel.K1 * num5)) + (iTURPModel.N * num6)) + this.GetLf(iTURPModel); string message = string.Concat(new object[] { DateTime.Now.ToString("G"), ",", rayParam.CellName, ",", rayParam.X, ",", rayParam.Y, ",", rayParam.TxEffHeight[0], ",", rayParam.RxEffHeight[i], ",", iTURPModel.PropModelName, ",", base.m_RayIndex, ",", i, ",", rayParam.CalcResolution, ",,,,", numArray[i], ",", numArray[i] }); if (base.m_Log4net.IsDebugEnabled) { base.m_Log4net.Debug(message); } } else { numArray[i] = float.MinValue; } } } return numArray; }
/// <summary> /// 计算某一条射线上的路径损耗(未实现) /// </summary> /// <param name="rayParam"></param> /// <param name="model"></param> /// <param name="isStopCalculator"></param> /// <returns></returns> public virtual float[] CalculateRayPathLoss(RayMethodParam rayParam, IPropagationModel model, ref bool isStopCalculator) { throw new Exception("The method or operation is not implemented."); }
/// <summary> /// 获取按射线计算的参数 /// </summary> /// <param name="sectionParam"></param> /// <param name="rayIndex"></param> /// <param name="gisData"></param> /// <returns></returns> public virtual RayMethodParam BuildCalcParam(SectionPathLossCalcParam sectionParam, int rayIndex, Dictionary<DemDataType, GisPreLoadData> gisData) { int startIndex = sectionParam.GetStartPointIndex(); int endIndex = sectionParam.GetEndPointIndex(); RayMethodParam param = new RayMethodParam(startIndex, endIndex); param.CalcResolution = sectionParam.CalcResolution; param.Angle = rayIndex * sectionParam.GetAngleResolution(); param.SectionIndex = sectionParam.SectionIndex; param.AntennaGainParam = sectionParam.AntennaGainParam; param.Frequency = sectionParam.Frequency; param.CellName = sectionParam.TransmitterName; param.AntHeight = sectionParam.TxAntennaHeight; param.X = sectionParam.X; param.Y = sectionParam.Y; return param; }
//public override float[] CalculateRayPathLoss(RayMethodParam param, IPropagationModel model, ref bool isStopCalculator) //{ // OkumuHataPropagationModel okumuHataPropagationModel = model as OkumuHataPropagationModel; // float f = param.Frequency; // int startIndex = param.StartIndex; // int endIndex = param.EndIndex; // float calcResolution = param.CalcResolution; // float[] txEffHeight = param.TxEffHeight; // float[] rxEffHeight = param.RxEffHeight; // float[] numArray3 = new float[(endIndex - startIndex) + 1]; // if (okumuHataPropagationModel != null) // { // float num8 = this.CellSelect(f, okumuHataPropagationModel); // float num7 = (float) Math.Log10((double) f); // float num6 = (float) Math.Log10((double) txEffHeight[0]); // StructAntennaParam antennaGainParam = param.AntennaGainParam; // for (int i = 0; i < numArray3.Length; i++) // { // if (isStopCalculator) // { // return numArray3; // } // if ((param.TxEffHeight[i] != -32768f) && (param.RxEffHeight[i] != -32768f)) // { // float num5 = this.GetDistance(startIndex, i, calcResolution); // float num11 = this.AhrCalculate(f, rxEffHeight, i, okumuHataPropagationModel); // float num9 = (i + startIndex) * calcResolution; // float num12 = base.CalcDiffLoss(i * calcResolution, i); // float num13 = ((((okumuHataPropagationModel.K1 + (okumuHataPropagationModel.K2 * num7)) - (okumuHataPropagationModel.K3 * num6)) + ((okumuHataPropagationModel.K4 - (okumuHataPropagationModel.K5 * num6)) * num5)) + num11) + num8; // numArray3[i] = num13 + (num12 * okumuHataPropagationModel.KDiffraction); // string message = string.Concat(new object[] { // DateTime.Now.ToString("G"), ",", param.CellName, ",", param.X, ",", param.Y, ",", txEffHeight[0], ",", param.RxEffHeight[i], ",", okumuHataPropagationModel.PropModelName, ",", base.m_RayIndex, ",", // i, ",", calcResolution, ",,,", num12, ",", num13, ",", numArray3[i] // }); // if (base.m_Log4net.IsDebugEnabled) // { // base.m_Log4net.Debug(message); // } // } // else // { // numArray3[i] = float.MinValue; // } // } // } // return numArray3; //} #endregion #region modified 2012.9.24 public override float[] CalculateRayPathLoss(RayMethodParam param, IPropagationModel model, ref bool isStopCalculator) { OkumuHataPropagationModel okumuHataPropagationModel = model as OkumuHataPropagationModel; float f = param.Frequency; int startIndex = param.StartIndex; int endIndex = param.EndIndex; float calcResolution = param.CalcResolution; float[] txEffHeight = param.TxEffHeight; float[] rxEffHeight = param.RxEffHeight; float[] numArray3 = new float[(endIndex - startIndex) + 1]; param.PeakHeightMatrix = new short[(endIndex - startIndex) + 1]; param.PeakDotMatrix = new int[(endIndex - startIndex) + 1]; PeakTempValue peakTempValue = new PeakTempValue(); if (okumuHataPropagationModel != null) { float num8 = this.CellSelect(f, okumuHataPropagationModel); float num7 = (float)Math.Log10((double)f); float num6 = (float)Math.Log10((double)txEffHeight[0]); StructAntennaParam antennaGainParam = param.AntennaGainParam; for (int i = 0; i < numArray3.Length; i++) { if (isStopCalculator) { return numArray3; } if ((param.TxEffHeight[i] != -32768f) && (param.RxEffHeight[i] != -32768f)) { float num5 = this.GetDistance(startIndex, i, calcResolution); float num11 = this.AhrCalculate(f, rxEffHeight, i, okumuHataPropagationModel); float num9 = (i + startIndex) * calcResolution; float num12 = base.CalcDiffLoss(i * calcResolution, i, peakTempValue); param.PeakDotMatrix[i] = (int)peakTempValue.PeakDot; param.PeakHeightMatrix[i] = peakTempValue.PeakHeight; float num13 = ((((okumuHataPropagationModel.K1 + (okumuHataPropagationModel.K2 * num7)) - (okumuHataPropagationModel.K3 * num6)) + ((okumuHataPropagationModel.K4 - (okumuHataPropagationModel.K5 * num6)) * num5)) + num11) + num8; numArray3[i] = num13 + (num12 * okumuHataPropagationModel.KDiffraction); string message = string.Concat(new object[] { DateTime.Now.ToString("G"), ",", param.CellName, ",", param.X, ",", param.Y, ",", txEffHeight[0], ",", param.RxEffHeight[i], ",", okumuHataPropagationModel.PropModelName, ",", base.m_RayIndex, ",", i, ",", calcResolution, ",,,", num12, ",", num13, ",", numArray3[i] }); if (base.m_Log4net.IsDebugEnabled) { base.m_Log4net.Debug(message); } } else { numArray3[i] = float.MinValue; } } } return numArray3; }
/// <summary> /// 计算射线上的点的路径损耗 /// </summary> /// <param name="param"></param> /// <param name="model"></param> /// <param name="isStopCalculator"></param> /// <returns></returns> public override float[] CalculateRayPathLoss(RayMethodParam param, IPropagationModel model, ref bool isStopCalculator) { Dictionary<GeoXYPoint, float> results = new Dictionary<GeoXYPoint, float>(); ITUR230PropagationModel ITUR230PropModel = model as ITUR230PropagationModel; float frequency = param.Frequency;//频率 float height = param.AntHeight;//基站高度 // float height = 0; int startIndex = param.StartIndex; param.PeakHeightMatrix = new short[(param.EndIndex - startIndex) + 1]; param.PeakDotMatrix = new int[(param.EndIndex - startIndex) + 1]; PeakTempValue peakTempValue = new PeakTempValue(); GeoXYPoint sitePoint = new GeoXYPoint(param.X, param.Y); float[] pointsPathLossOnRay = new float[(param.EndIndex - startIndex) + 1]; if (ITUR230PropModel != null) { float calcResolution = param.CalcResolution; for (int i = 0; i < pointsPathLossOnRay.Length; i++) { if (isStopCalculator) return pointsPathLossOnRay; if ((param.TxEffHeight[i] != -32768f) && (param.RxEffHeight[i] != -32768f)) { GeoXYPoint calPoint = new GeoXYPoint(param.X + (i + startIndex) * param.CalcResolution * Math.Sin(param.Angle), param.Y + (i + startIndex) * param.CalcResolution * Math.Cos(param.Angle)); double distance = GetDistance(calPoint, sitePoint);//每个点到基站的距离 param.PeakHeightMatrix[i] = peakTempValue.PeakHeight; param.PeakDotMatrix[i] = (int)peakTempValue.PeakDot; //pointsPathLossOnRay[i] = CalculatePointPathLossOnRayByITUR230(height, frequency, distance, ref isStopCalculator);//每个点到基站的路损计算 pointsPathLossOnRay[i] = (float)getLoss(230, distance / 1000, height, 10, 10) - k1;//getLoss(Double frequence, Double distance, Double height, Double G, Double Heff) //frequence:频率,distance:距离,height:天线高度,G:天线增益,单位dB ,Heff:附近环境的平均高度,通过Gis获得?(典型场景:中心城市30m,郊区20m,农村10m?) results.Add(calPoint, pointsPathLossOnRay[i]); } } } return pointsPathLossOnRay; }