Example #1
0
        //private Result parallelComputing(CellInfo cellInfo, double fromAngle, double toAngle)
        //{
        //    string bidstext = "-1";

        //    LTE.Geometric.Point p = cellInfo.SourcePoint;
        //    ProcessArgs pa = new ProcessArgs();
        //    ProcessStartInfo psi = new ProcessStartInfo();
        //    psi.UseShellExecute = true;
        //    psi.ErrorDialog = true;

        //    psi.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
        //    psi.FileName = "LTE.MultiProcessController.exe";
        //    psi.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22} {23} {24} {25} {26} {27} {28} {29} {30} {31} {32}",
        //        cellInfo.SourceName, p.X, p.Y, 0, 0, p.Z, cellInfo.eNodeB, cellInfo.CI,
        //        cellInfo.Azimuth, cellInfo.Inclination, cellInfo.cellType, cellInfo.frequncy, cellInfo.EIRP,
        //        cellInfo.directCoefficient, cellInfo.reflectCoefficient, cellInfo.diffracteCoefficient, cellInfo.diffracteCoefficient,
        //        fromAngle, toAngle, this.distance, this.reflectionNum, this.diffractionNum, this.computeIndoor,
        //        this.threadNum, bidstext, this.sideSplitUnit, this.computeVSide, false, false, true, false, LoadInfo.UserId.Value, LoadInfo.taskName.Value);

        //    try
        //    {
        //        pa.pro = Process.Start(psi);
        //        pa.pro.WaitForExit();
        //    }
        //    catch (InvalidOperationException exception)
        //    {
        //        return new Result(false, "多进程计算启动失败,原因: " + exception.Message);
        //    }
        //    catch (Exception ee)
        //    {
        //        return new Result(false, "多进程计算启动失败,原因: " + ee.Message);
        //    }
        //    return new Result(true);
        //}


        private Result parallelComputing(CellInfo cellInfo, double fromAngle, double toAngle, double dis, int userId, string taskName)
        {
            string bidstext = "-1";

            LTE.Geometric.Point p   = cellInfo.SourcePoint;
            ProcessArgs         pa  = new ProcessArgs();
            ProcessStartInfo    psi = new ProcessStartInfo();

            psi.UseShellExecute = true;
            psi.ErrorDialog     = true;

            psi.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
            psi.FileName         = "LTE.MultiProcessController.exe";
            psi.Arguments        = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22} {23} {24} {25} {26} {27} {28} {29} {30} {31} {32}",
                                                 cellInfo.SourceName, p.X, p.Y, 0, 0, p.Z, cellInfo.eNodeB, cellInfo.CI,
                                                 cellInfo.Azimuth, cellInfo.Inclination, cellInfo.cellType, cellInfo.frequncy, cellInfo.EIRP,
                                                 cellInfo.directCoefficient, cellInfo.reflectCoefficient, cellInfo.diffracteCoefficient, cellInfo.diffracteCoefficient,
                                                 fromAngle, toAngle, dis, this.reflectionNum, this.diffractionNum, this.computeIndoor,
                                                 this.threadNum, bidstext, this.sideSplitUnit, this.computeVSide, false, false, true, false, userId, taskName);

            try
            {
                pa.pro = Process.Start(psi);
                pa.pro.WaitForExit();
            }
            catch (InvalidOperationException exception)
            {
                return(new Result(false, "多进程计算启动失败,原因: " + exception.Message));
            }
            catch (Exception ee)
            {
                return(new Result(false, "多进程计算启动失败,原因: " + ee.Message));
            }
            return(new Result(true));
        }
        // ref https://blog.csdn.net/s0rose/article/details/78831570
        // 判断两线段是否相交
        public bool IsIntersec(LTE.Geometric.Point p1,
                               LTE.Geometric.Point p2,
                               LTE.Geometric.Point p3,
                               LTE.Geometric.Point p4) //判断两线段是否相交
        {
            bool D = false;

            //快速排斥,以l1、l2为对角线的矩形必相交,否则两线段不相交
            if (Math.Max(p1.X, p2.X) >= Math.Min(p3.X, p4.X) && //矩形1最右端大于矩形2最左端
                Math.Max(p3.X, p4.X) >= Math.Min(p1.X, p2.X) && //矩形2最右端大于矩形最左端
                Math.Max(p1.Y, p2.Y) >= Math.Min(p3.Y, p4.Y) && //矩形1最高端大于矩形最低端
                Math.Max(p3.Y, p4.Y) >= Math.Min(p1.Y, p2.Y))   //矩形2最高端大于矩形最低端
            {
                //若通过快速排斥则进行跨立实验
                if (cross(p1, p2, p3) * cross(p1, p2, p4) <= 0 &&
                    cross(p3, p4, p1) * cross(p3, p4, p2) <= 0)
                {
                    D = true;
                }
                else
                {
                    D = false;
                }
            }
            else
            {
                D = false;
            }
            return(D);
        }
        double Point2Line(LTE.Geometric.Point p0, LTE.Geometric.Point p1, LTE.Geometric.Point p2)
        {
            double den = distance(p1.Y, p2.Y, p1.X, p2.X);

            if (den < 0.00001)
            {
                return(0.0);
            }
            return(Math.Abs(xmult(p0, p1, p2) / den));
        }
        public double cross(LTE.Geometric.Point p1,
                            LTE.Geometric.Point p2,
                            LTE.Geometric.Point p3) //跨立实验
        {
            double x1 = p2.X - p1.X;
            double y1 = p2.Y - p1.Y;
            double x2 = p3.X - p1.X;
            double y2 = p3.Y - p1.Y;

            return(x1 * y2 - x2 * y1);
        }
        public Result parallelComputing(ref CellInfo cellInfo, double fromAngle, double toAngle, int eNodeB, int CI,
                                        ref List <ProcessArgs> paList, bool isReRay, bool isRecordReRay, bool isRayLoc, bool isRayAdj, int userID, string taskName)
        {
            string bidstext = "-1";

            if (!this.ExistProcess(eNodeB, CI, ref paList))
            {
                LTE.Geometric.Point p   = cellInfo.SourcePoint;
                ProcessArgs         pa  = new ProcessArgs();
                ProcessStartInfo    psi = new ProcessStartInfo();

                psi.UseShellExecute  = true;
                psi.ErrorDialog      = true;
                psi.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
                psi.FileName         = "LTE.MultiProcessController.exe";
                psi.Arguments        = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22} {23} {24} {25} {26} {27} {28} {29} {30} {31} {32}",
                                                     cellInfo.SourceName, p.X, p.Y, 0, 0, p.Z, cellInfo.eNodeB, cellInfo.CI,
                                                     cellInfo.Azimuth, cellInfo.Inclination, cellInfo.cellType, cellInfo.frequncy, cellInfo.EIRP,
                                                     cellInfo.directCoefficient, cellInfo.reflectCoefficient, cellInfo.diffracteCoefficient, cellInfo.diffracteCoefficient,
                                                     fromAngle, toAngle, this.distance, this.reflectionNum, this.diffractionNum, this.computeIndoor,
                                                     this.threadNum, bidstext, this.diffPointsMargin, this.computeDiffrac, isReRay, isRecordReRay, isRayLoc, isRayAdj, userID, taskName);

                try
                {
                    pa.pro = Process.Start(psi);
                    paList.Add(pa);

                    pa.pro.WaitForExit();  //----- 子进程入口
                    //子进程异常处理,防止父进程无限阻塞,Controller不能及时返回消息
                    if (pa.pro.ExitCode != 0)
                    {
                        return(new Result(false, "多进程计算失败,请重试,错误代码:" + pa.pro.ExitCode));
                    }
                }
                catch (InvalidOperationException exception)
                {
                    return(new Result(false, "多进程计算启动失败,原因: " + exception.Message));
                }
                catch (Exception ee)
                {
                    return(new Result(false, "多进程计算启动失败,原因: " + ee.Message));
                }
            }
            else
            {
                return(new Result(false, "该小区正在计算"));
            }

            return(new Result {
                ok = true, msg = "小区覆盖计算已提交", code = "1"
            });
        }
 ///<summary>
 /// 将点转换为经纬度点
 /// </summary>
 /// <param name="point">平面坐标点</param>
 ///<returns>经纬度点</returns>
 ///<remarks></remarks>
 public LTE.Geometric.Point GetGeoPoint(LTE.Geometric.Point point)
 {
     lock (syncGeo)
     {
         double[] p = new double[2];
         p[0] = point.X;
         p[1] = point.Y;
         ICoordinateTransformation trans = pCTFAC.CreateFromCoordinateSystems(pPCS, pGCS);
         p       = trans.MathTransform.Transform(p);
         point.X = p[0];
         point.Y = p[1];
     }
     return(point);
 }
        // 判断点p3和p4构成的线段是否和res_Points中的点构成的线段发生交叉
        // 例如: res_Pints=[p_0,p_1,p_2,p_3] 一共4个点
        // 则本函数判断 (p3,p4) 构成的线段是否和 (p_0,p_1),(p_1,p_2),(p_2,p_3)这3条线段发生线段交叉
        public bool checkValid(LTE.Geometric.Point p3,
                               LTE.Geometric.Point p4,
                               List <LTE.Geometric.Point> res_Points,
                               int n)
        {
            if (samePt(p4, res_Points[0]))
            {
                return(true);
            }

            for (int idx = 0; idx < n - 2; ++idx)
            {
                if (IsIntersec(res_Points[idx], res_Points[idx + 1], p3, p4))
                {
                    return(false);
                }
            }
            return(true);
        }
Example #8
0
        // 去掉被遮挡的面 2019.1.2
        public HashSet <int> getPolygonsID(Vector3 top, ref List <Polygon> polygons)
        {
            List <int> buildingids = new List <int>();

            for (int i = 0; i < polygons.Count; i++)
            {
                if (!polygons[i].m_ground)
                {
                    buildingids.Add(polygons[i].m_buildingID);
                }
            }

            LTE.Geometric.Point source = new LTE.Geometric.Point(top.x, top.y, top.z);
            Dictionary <int, LTE.InternalInterference.Grid.TriangleBound> dic = LTE.InternalInterference.Grid.BuildingGrid3D.getShelterDisAndAngleBeam(source, buildingids, 0);

            HashSet <int> ret = new HashSet <int>(dic.Keys.ToList());

            return(ret);
        }
Example #9
0
        // 强弱相间点、强点用到
        private void strongWeakPt()
        {
            Pt.Clear();
            for (int j = 1; j < n; j++)
            {
                if (gx[j] < leftBound || gx[j] > rightBound || gy[j] < downBound || gy[j] > upBound)
                {
                    continue;
                }
                if (gx[j - 1] < leftBound || gx[j - 1] > rightBound || gy[j - 1] < downBound || gy[j - 1] > upBound)
                {
                    continue;
                }

                if (pwrDbm[j] - pwrDbm[j - 1] > 15 && pwrDbm[j] - pwrDbm[j - 1] < 25 && (Math.Abs(gx[j - 1] - gx[j]) < 50 && Math.Abs(gy[j - 1] - gy[j]) < 50))
                {
                    // 拉大距离
                    int k = j;

                    LTE.Geometric.Point pt  = new LTE.Geometric.Point(gx[k], gy[k], 0);
                    LTE.Geometric.Point pt1 = new LTE.Geometric.Point(gx[j - 1], gy[j - 1], 0);
                    StrongWeakPt        p   = new StrongWeakPt(ref pt1, ref pt, Math.Abs(pwrDbm[k] - pwrDbm[j - 1]));

                    p.strongPower = pwrDbm[j];
                    Pt.Add(p);
                }
                else if (pwrDbm[j - 1] - pwrDbm[j] > 15 && pwrDbm[j - 1] - pwrDbm[j] < 25 && (Math.Abs(gx[j - 1] - gx[j]) < 100 && Math.Abs(gy[j - 1] - gy[j]) < 100))
                {
                    int k = j;

                    LTE.Geometric.Point pt  = new LTE.Geometric.Point(gx[j - 1], gy[j - 1], 0);
                    LTE.Geometric.Point pt1 = new LTE.Geometric.Point(gx[k], gy[k], 0);
                    StrongWeakPt        p   = new StrongWeakPt(ref pt1, ref pt, Math.Abs(pwrDbm[k] - pwrDbm[j - 1]));
                    p.strongPower = pwrDbm[j - 1];
                    Pt.Add(p);
                }
            }
        }
Example #10
0
        public Result parallelComputing(ref CellInfo cellInfo, double fromAngle, double toAngle, bool isRayLoc, bool isRayAdj)
        {
            int    processNum = this.threadNum;
            Random r          = new Random(DateTime.Now.Second);

            LTE.Geometric.Point p = cellInfo.SourcePoint;
            double     deltaA = (toAngle - fromAngle + 360) % 360 / processNum;
            double     from, to;
            List <int> bids = new List <int>();

            for (int i = 0; i < processNum; i++)
            {
                from = (fromAngle + i * deltaA + 360) % 360;
                to   = (fromAngle + (i + 1) * deltaA + 360) % 360;
                if (to > toAngle)
                {
                    to = toAngle;
                }

                Calc calc = new Calc(ref cellInfo, this.distance, from, to, this.reflectionNum, this.diffractionNum, this.computeIndoor, this.diffPointsMargin, bids, isRayLoc, isRayAdj);
                calc.start();
            }
            return(new Result(true));
        }
Example #11
0
        private void strongWeakPt2()
        {
            Pt2.Clear();
            double d = -49;

            while (Pt2.Count < 20)
            {
                for (int j = 1; j < n; j++)
                {
                    if (pwrDbm[j] > d)
                    {
                        // 拉大距离
                        int k = j;

                        LTE.Geometric.Point pt  = new LTE.Geometric.Point(gx[k], gy[k], 0);
                        LTE.Geometric.Point pt1 = new LTE.Geometric.Point(gx[j - 1], gy[j - 1], 0);
                        StrongWeakPt        p   = new StrongWeakPt(ref pt1, ref pt, Math.Abs(pwrDbm[k] - pwrDbm[j - 1]));
                        p.strongPower = pwrDbm[j];
                        Pt2.Add(p);
                    }
                }
                d--;
            }
        }
        double constraint_low_bound   = 0.02;   // 策略3的控制参数

        //public Result smoothBuildingPoints()
        //{
        //    IbatisHelper.ExecuteDelete("DeleteBuildingVertex", null);

        //    DataTable dt = new DataTable();
        //    dt.Columns.Add("BuildingID", System.Type.GetType("System.Int32"));
        //    dt.Columns.Add("VertexLong", System.Type.GetType("System.Double"));
        //    dt.Columns.Add("VertexLat", System.Type.GetType("System.Double"));
        //    dt.Columns.Add("VertexX", System.Type.GetType("System.Double"));
        //    dt.Columns.Add("VertexY", System.Type.GetType("System.Double"));
        //    dt.Columns.Add("VIndex", System.Type.GetType("System.Int16"));

        //    Hashtable ht = new Hashtable();
        //    int pageindex = 0;
        //    int pagesize = 10000;
        //    ht["pageindex"] = pageindex;
        //    ht["pagesize"] = pagesize;
        //    BuildingGrid3D.constructBuildingVertexOriginalByBatch(pageParam: ht);
        //    while (BuildingGrid3D.buildingVertexOriginal.Count > 0)
        //    {
        //        int minBid, maxBid;
        //        BuildingGrid3D.getAllBuildingIDRange(out minBid, out maxBid);

        //        for (int i = minBid; i <= maxBid; i++)
        //        {
        //            List<LTE.Geometric.Point> bpoints = BuildingGrid3D.getBuildingVertexOriginal(i);

        //            List<LTE.Geometric.Point> ps = Process(ref bpoints);  // 2018-05-08
        //            if (ps.Count < 20)
        //                ps = bpoints;

        //            for (int j = 0; j < ps.Count; j++)
        //            {
        //                //使用proj.net库转换坐标,by JinHaijia
        //                LTE.Geometric.Point pCopy=new LTE.Geometric.Point(ps[j]);
        //                pCopy = LTE.Utils.PointConvertByProj.Instance.GetGeoPoint(pCopy);

        //                //旧版使用arcgis接口转换坐标
        //                //ESRI.ArcGIS.Geometry.IPoint p = GeometryUtilities.ConstructPoint2D(ps[j].X, ps[j].Y);
        //                //PointConvert.Instance.GetGeoPoint(p);

        //                //System.Diagnostics.Debug.WriteLine("transfNew long:" + pCopy.X + " latitude:" + pCopy.Y);
        //                //System.Diagnostics.Debug.WriteLine("transfOld long:" + p.X + " latitude:" + p.Y);
        //                //System.Diagnostics.Debug.WriteLine("_________");

        //                DataRow dr = dt.NewRow();
        //                dr["BuildingID"] = i;
        //                dr["VertexLong"] = pCopy.X;
        //                dr["VertexLat"] = pCopy.Y;
        //                dr["VertexX"] = ps[j].X;
        //                dr["VertexY"] = ps[j].Y;
        //                dr["VIndex"] = j;
        //                dt.Rows.Add(dr);
        //            }
        //            if (dt.Rows.Count >= 5000)
        //            {
        //                DataUtil.BCPDataTableImport(dt, "tbBuildingVertex");
        //                dt.Clear();
        //            }
        //        }
        //        DataUtil.BCPDataTableImport(dt, "tbBuildingVertex");
        //        dt.Clear();
        //        BuildingGrid3D.clearBuildingVertexOriginal();
        //        ht["pageindex"] = ++pageindex;
        //        BuildingGrid3D.constructBuildingVertexOriginalByBatch(pageParam: ht);
        //    }
        //    return new Result(true,"建筑物顶点平滑完成");
        //}


        public Result smoothBuildingPoints()
        {
            BuildingGrid3D.constructBuildingVertexOriginal();
            int minBid, maxBid;

            BuildingGrid3D.getAllBuildingIDRange(out minBid, out maxBid);

            DataTable dt = new DataTable();

            dt.Columns.Add("BuildingID", System.Type.GetType("System.Int32"));
            dt.Columns.Add("VertexLong", System.Type.GetType("System.Double"));
            dt.Columns.Add("VertexLat", System.Type.GetType("System.Double"));
            dt.Columns.Add("VertexX", System.Type.GetType("System.Double"));
            dt.Columns.Add("VertexY", System.Type.GetType("System.Double"));
            dt.Columns.Add("VIndex", System.Type.GetType("System.Int16"));

            try
            {
                IbatisHelper.ExecuteDelete("DeleteBuildingVertex", null);
            }
            catch (Exception e)
            {
                return(new Result(false, e.ToString()));
            }

            for (int i = minBid; i <= maxBid; i++)
            {
                List <LTE.Geometric.Point> bpoints = BuildingGrid3D.getBuildingVertexOriginal(i);

                List <LTE.Geometric.Point> ps = Process(ref bpoints);  // 2018-05-08


                if (ps.Count < 20)
                {
                    ps = bpoints;
                }

                for (int j = 0; j < ps.Count; j++)
                {
                    LTE.Geometric.Point p     = new Geometric.Point(ps[j].X, ps[j].Y, 0);
                    LTE.Geometric.Point pCopy = new LTE.Geometric.Point(ps[j]);
                    p = LTE.Utils.PointConvertByProj.Instance.GetGeoPoint(p);

                    DataRow dr = dt.NewRow();
                    dr["BuildingID"] = i;
                    dr["VertexLong"] = p.X;
                    dr["VertexLat"]  = p.Y;
                    dr["VertexX"]    = ps[j].X;
                    dr["VertexY"]    = ps[j].Y;
                    dr["VIndex"]     = j;
                    dt.Rows.Add(dr);
                }
                if (dt.Rows.Count >= 5000)
                {
                    DataUtil.BCPDataTableImport(dt, "tbBuildingVertex");
                    dt.Clear();
                }
            }
            DataUtil.BCPDataTableImport(dt, "tbBuildingVertex");
            dt.Clear();
            BuildingGrid3D.clearBuildingVertexOriginal();

            return(new Result(true));
        }
 double xmult(LTE.Geometric.Point p1, LTE.Geometric.Point p2, LTE.Geometric.Point p0)
 {
     return((p1.X - p0.X) * (p2.Y - p0.Y) - (p2.X - p0.X) * (p1.Y - p0.Y));
 }
 bool samePt(LTE.Geometric.Point p1, LTE.Geometric.Point p2)
 {
     return(Math.Abs(p1.X - p2.X) <= 0.00000001 && Math.Abs(p1.Y - p2.Y) <= 0.00000001);
 }
Example #15
0
 public StrongWeakPt(ref LTE.Geometric.Point w, ref LTE.Geometric.Point s, double d)
 {
     this.weak   = w;
     this.strong = s;
     this.diff   = d;
 }