Example #1
0
        //public string mSerialNo;  // 序列号编码

        //            string sqlstr = @"select FirmName ,a.FirmTypeID, CategoryCode, SerialNo, UpdateTime, Longitude, Latitude from (select * from FirmInfo)a, (select FirmTypeID,FirmTypeCategoryName from FirmTypeInfo)b where a.FirmTypeID=b.FirmTypeID and( FirmTypeCategoryName='单位' or FirmTypeCategoryName='分支机构') and Longitude > 10 AND Latitude > 10 order by a.FirmTypeID asc ;";

        //this, Convert.ToInt32(dataReader["Num"]), Convert.ToInt32(dataReader["firmid"]), dataReader["ShorName"].ToString(),
        //                Convert.ToDouble(dataReader["Longitude"]), Convert.ToDouble(dataReader["Latitude"]), firmType, fileName

        public CRailwayFirm(CRailwayScene s, int num, int fid, string fname, double x, double y, string firmType, string fileName)
        {
            mScene    = s;
            mFirmType = firmType;
            mFirmName = fname;

            mNumStaff = num;
            mFirmID   = fid;
            //mSNo = sNo;
            //mUpdateTime = dt;

            mLongitude_Mid = x;
            mLatitude_Mid  = y;

            if (fname.StartsWith("11标"))
            {
                Console.WriteLine(fname + x + "\t" + y);
            }
            mLine          = mScene.mMiddleLines.getMeterbyPos(x, y, out mMileage_Mid, out mDis);
            mDKCode        = mLine.mDKCode;
            mGlobalMileage = mScene.mMiddleLines.getGlobalMeter(mLine.mDKCode, mMileage_Mid);
            //     mScene.mMiddleLines.get

            mLabelImage = fileName;
        }
Example #2
0
        public CRailwayFirm(CRailwayScene s, int num, int fid, string fname, double x, double y, string firmType, string presentation, string fileName)
        {
            mScene    = s;
            mFirmType = firmType;
            mFirmName = fname;

            mNumStaff = num;
            mFirmID   = fid;
            //mSNo = sNo;
            //mUpdateTime = dt;
            mPresentation  = presentation;
            mLongitude_Mid = x;
            mLatitude_Mid  = y;

            //if (fname.StartsWith("11标"))
            //    Console.WriteLine(fname + x + "\t" + y);
            mLine = CRailwayLineList.getMileagebyGPS(x, y, out mMileage_Mid, out mDis, out misInside);
            //mDKCode = mLine.mDKCode;
            double dis;

            mScene.mMainPath.getPathMileagebyGPS(x, y, out mMainMileage, out dis);

            mLabelImage = fileName;
            if (mDis < 8000)
            {
                mHotSpot = new CHotSpot(mLine.mDKCode, mMileage_Mid, mLongitude_Mid, mLatitude_Mid, 100, mMainMileage, mDis, "Firm", this);
            }
            else
            {
                mHotSpot = null;
            }
        }
Example #3
0
        /// <summary>
        /// 根据经纬度,获取里程,如果经纬度不在铁路线上,定位铁路线上最近的一个点,返回该段铁路、该点里程以及距离
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="dis"></param>
        /// <returns></returns>
        public CRailwayLine getMeterbyPos(double x, double y, out double mileage, out double dis)
        {
            dis = -1;
            //double mi;
            mileage = -1;
            double       mi;
            double       min = 100;
            CRailwayLine mrw = null;

            foreach (CRailwayLine rw in mLineList)
            {
                rw.getMeterbyPos(x, y, out mi, out dis);
                if (mrw == null)
                {
                    min     = dis;
                    mileage = mi;
                    mrw     = rw;
                }
                else if (dis < min)
                {
                    min     = dis;
                    mileage = mi;
                    mrw     = rw;
                }
            }
            dis = min;
            //mileage
            return(mrw);
        }
Example #4
0
 public PathNode(CRailwayLine rl, double fromM, double toM, bool re)
 {
     mRL         = rl;
     fromMileage = fromM;
     toMileage   = toM;
     isReverse   = re;
     mLength     = Math.Abs(fromM - toM);
 }
Example #5
0
        ///// <summary>
        ///// 获取最小len
        ///// </summary>
        //public double getMinLen(double len_start, double len_mid, double len_end)
        //{
        //    double len = Math.Min(Math.Min(len_start, len_mid), len_end);
        //    return len;

        //}

        ///// <summary>
        ///// 根据dk码以及里程,例如DIK12+23.4,获取经纬度高度、朝向坐标
        ///// </summary>
        ///// <param name="dk"></param>
        ///// <param name="meter"></param>
        ///// <param name="x"></param>
        ///// <param name="y"></param>
        ///// <param name="z"></param>
        ///// <param name="dir"></param>
        ///// <returns></returns>
        //public bool getGPSAndGlobalMileageByDKCode(string dk, double meter, out double x, out double y, out double z, out double dir, out double globalmeter)
        //{
        //    x = y = z = dir = 0;
        //    double dis;
        //    globalmeter = 0;
        //    foreach (CRailwayLine rw in mLineList)
        //    {
        //        if (rw.isInSide(dk, meter, out dis))
        //        {
        //            rw.getGPSbyMileage(meter, out x, out y, out z, out dir);
        //            globalmeter += dis;
        //            return true;

        //        }
        //        globalmeter += rw.mLength;
        //    }
        //    //Console.WriteLine(dk + " " + meter + "is not valid !");
        //    return false;
        //}



        /// <summary>
        /// 根据经纬度,获取里程,如果经纬度不在铁路线上,定位铁路线上最近的一个点,返回该段铁路、该点里程以及距离
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="dis"></param>
        /// <returns></returns>
        public static CRailwayLine getMileagebyGPS(double x, double y, out double mileage, out double dis, out bool isInside)
        {
            dis = -1;
            //double mi;
            mileage = -1;
            double       mi;
            double       min = 100;
            CRailwayLine mrw = null;

            isInside = false;
            //bool isInside2;
            foreach (CRailwayLine rw in mLineList)
            {
                rw.getDKMileagebyGPS(x, y, out mi, out dis);

                if (mrw == null)
                {
                    min     = dis;
                    mileage = mi;
                    mrw     = rw;
                    //isInside = isInside2;
                }
                else if (dis < min)
                {
                    min     = dis;
                    mileage = mi;
                    mrw     = rw;
                    //isInside = isInside2;
                }
                //if (isInside2 && dis < 10)
                //    break;
            }
            dis = min;
            //mileage
            return(mrw);
        }
Example #6
0
        /// <summary>
        /// 生成子路径
        /// </summary>
        /// <param name="g">寻径的floyd图</param>
        /// <param name="DKlist">路径上的dkcode列表,至少2个</param>
        /// <param name="milelist">路径上的里程列表,至少2个</param>
        /// <param name="stepm">细分里程间隔</param>
        private void CreateSubPathFromNodeList(MGraph g, List <string> DKlist, List <double> milelist, double stepm)
        {
            if (DKlist == null || DKlist.Count < 2)
            {
                return;
            }
            mFromDK      = DKlist.First();
            mToDK        = DKlist.Last();
            mFromMileage = milelist.First();
            mToMileage   = milelist.Last();
            mStepM       = stepm;
            mLength      = 0;
            List <PathNode> ls = new List <PathNode>();
            // 路径节点,0,2,4,6下标为链路编号,1,3,5,7等标注正序还是逆序,0-正序,1-逆序
            List <int>   idls = null;
            CRailwayLine tmpLine;

            //存放所有路径上的链路编号
            int[] rlls = new int[DKlist.Count];

            for (int i = 0; i < DKlist.Count; i++)
            {
                tmpLine = CRailwayLineList.getRailwayLineByDKCode(DKlist[i], milelist[i]);
                if (tmpLine == null)
                {
                    return;
                }
                rlls[i] = tmpLine.mIndex;
            }


            // 路径节点,0,2,4,6下标为路径编号,1,3,5,7等标注正序还是逆序,0-正序,1-逆序
            idls = ShortestPathFloyd.getNavPath(rlls, g);
            if (idls == null)
            {
                Console.WriteLine(DKlist[0] + "等路径不存在");
                return;
            }
            if (DKlist.Count == 2 && rlls[0] == rlls[1])  // 起点和终点在同一个链路中
            {
                CRailwayLine rl = CRailwayLineList.getRailwayLineByIndex(idls[0]);
                mLength = Math.Abs(milelist[0] - milelist.Last());
                //if (idls[1] == 0)
                ls.Add(new PathNode(rl, milelist[0], milelist.Last(), false));
                //else
                //    ls.Add(new PathNode(rl, milelist.Last(), milelist[0], true));
            }
            else if (idls.Count > 2)
            {
                mLength     = 0;
                mNodeLength = new double[idls.Count / 2];
                // path中的第一条链
                CRailwayLine rl = CRailwayLineList.getRailwayLineByIndex(idls[0]);
                if (idls[1] == 0)
                {
                    ls.Add(new PathNode(rl, milelist[0], rl.mEnd, false));
                    mLength += Math.Abs(milelist[0] - rl.mEnd);
                }
                else
                {
                    ls.Add(new PathNode(rl, milelist[0], rl.mStart, true));
                    mLength += Math.Abs(milelist[0] - rl.mStart);
                }
                mNodeLength[0] = mLength;
                if (idls.Count > 2)
                {
                    // path的中间链
                    for (int i = 1; i < idls.Count / 2 - 1; i++)
                    {
                        rl = CRailwayLineList.getRailwayLineByIndex(idls[2 * i]);
                        if (idls[2 * i + 1] == 0)
                        {
                            ls.Add(new PathNode(rl, rl.mStart, rl.mEnd, false));
                        }
                        else
                        {
                            ls.Add(new PathNode(rl, rl.mEnd, rl.mStart, true));
                        }
                        mLength       += Math.Abs(rl.mLength);
                        mNodeLength[i] = mLength;
                    }

                    // path的最后一条链
                    rl = CRailwayLineList.getRailwayLineByIndex(idls[idls.Count - 2]);
                    if (idls.Last() == 0)
                    {
                        ls.Add(new PathNode(rl, rl.mStart, milelist.Last(), false));
                        mLength += Math.Abs(rl.mStart - milelist.Last());
                    }
                    else
                    {
                        ls.Add(new PathNode(rl, rl.mEnd, milelist.Last(), true));
                        mLength += Math.Abs(rl.mEnd - milelist.Last());
                    }
                    mNodeLength[mNodeLength.Length - 1] = mLength;
                }
            }

            mPathNodeList = ls;

            hasPath = mPathNodeList.Count > 0 && mLength > 1;

            if (hasPath)
            {
                createSubLine();
            }
        }
Example #7
0
        /// <summary>
        /// TODO:计算一段可能跨链的铁路,用于生成火车漫游路径,由startDKM开始,长度为disFromStart的一段路
        /// </summary>
        /// <param name="startDKM">起始里程</param>
        /// <param name="disFromStart">起点里程偏移,为正时,小里程至大里程,为负数时,大里程至小里程</param>
        /// <param name="stepm">每两个采样点的间隔距离</param>
        /// <param name="x">采样点经度</param>
        /// <param name="y">采样点纬度</param>
        /// <param name="z">采样点高度</param>
        /// <param name="dir">采样点方位角(朝向)</param>
        /// <returns>采样点个数</returns>
        public int getSubLine(string startDKM, double disFromStart, double stepm, out double[] x, out double[] y, out double[] z, out double[] dir)
        {
            x = y = z = dir = null;

            string startDKCode, endDKCode, endDKM;
            double startMileage, endMileage;

            //拆分code
            parseDKCode(startDKM, out startDKCode, out startMileage, -1);

            //获取起点所在的链
            int          startNumber = 0;
            double       startDis;
            CRailwayLine startChain = null;

            for (int count = 0; count < mLineList.Count; count++)
            {
                if (mLineList[count].isInSide(startDKCode, startMileage, out startDis))
                {
                    startChain  = mLineList[count];
                    startNumber = count;
                }
            }

            if (startChain == null)
            {
                return(0);
            }

            double desMileage = startMileage + disFromStart;

            if ((!startChain.mIsReverse && desMileage <= startChain.mEnd && desMileage >= startChain.mStart) || (startChain.mIsReverse && desMileage <= startChain.mStart && desMileage >= startChain.mEnd))
            {
                int pointNumber = startChain.getSubLine(startMileage, desMileage, stepm, out x, out y, out z, out dir);

                return(pointNumber);
            }
            else
            {
                int pointNum = 0;
                if (disFromStart >= 0)  //小里程至大里程
                {
                    double remain = disFromStart - Math.Abs(startChain.mEnd - startMileage);

                    double chainsLength = 0;

                    for (int i = startNumber + 1; i < mLineList.Count; i++)
                    {
                        chainsLength += mLineList[i].mLength;

                        if (chainsLength >= remain)
                        {
                            if (mLineList[i].mIsReverse)
                            {
                                endMileage = mLineList[i].mEnd + (chainsLength - remain);
                            }
                            else
                            {
                                endMileage = mLineList[i].mEnd - (chainsLength - remain);
                            }

                            endDKCode = mLineList[i].mDKCode;

                            endDKM = CombiDKCode(endDKCode, endMileage);

                            pointNum = getSubLineByDKCode(startDKM, endDKM, stepm, out x, out y, out z, out dir);

                            break;
                        }
                    }
                }
                else  //大里程至小里程
                {
                    double remain = -disFromStart - Math.Abs(startMileage - startChain.mStart);

                    double chainsLength = 0;

                    for (int i = startNumber - 1; i >= 0; i--)
                    {
                        chainsLength += mLineList[i].mLength;

                        if (chainsLength >= remain)
                        {
                            if (mLineList[i].mIsReverse)
                            {
                                endMileage = mLineList[i].mStart - (chainsLength - remain);
                            }
                            else
                            {
                                endMileage = mLineList[i].mStart + (chainsLength - remain);
                            }

                            endDKCode = mLineList[i].mDKCode;

                            endDKM = CombiDKCode(endDKCode, endMileage);

                            pointNum = getSubLineByDKCode(startDKM, endDKM, stepm, out x, out y, out z, out dir);

                            break;
                        }
                    }
                }

                return(pointNum);
            }
        }
Example #8
0
        public int getSubLineByDKCode(string startDKCode, double startMileage, string endDKCode, double endMileage, double stepm, out double[] x, out double[] y, out double[] z, out double[] dir)
        {
            x = y = z = dir = null;

            //获取两点所在的链
            int          startNumber = 0, endNumber = 0;
            double       startDis, endDis;
            CRailwayLine startChain = null, endChain = null;

            for (int count = 0; count < mLineList.Count; count++)
            {
                if (mLineList[count].isInSide(startDKCode, startMileage, out startDis))
                {
                    startChain  = mLineList[count];
                    startNumber = count;
                }

                if (mLineList[count].isInSide(endDKCode, endMileage, out endDis))
                {
                    endChain  = mLineList[count];
                    endNumber = count;
                }
            }

            if (startChain == null || endChain == null)
            {
                return(0);
            }

            //保证startChain小于等于endChain
            if (startNumber > endNumber)
            {
                int          temp        = startNumber;
                double       tempMileage = startMileage;
                CRailwayLine tempChain   = startChain;

                startNumber  = endNumber;
                startMileage = endMileage;
                startChain   = endChain;

                endNumber  = temp;
                endMileage = tempMileage;
                endChain   = tempChain;
            }

            int[]      ccount = new int[endNumber - startNumber + 1];
            double[][] xx     = new double[endNumber - startNumber + 1][];
            double[][] yy     = new double[endNumber - startNumber + 1][];
            double[][] zz     = new double[endNumber - startNumber + 1][];
            double[][] dd     = new double[endNumber - startNumber + 1][]; //double[][] XX :交错数组 instead of 二维数组

            if (startNumber == endNumber)                                  //start和end是同一条链
            {
                int pointNumber = startChain.getSubLine(startMileage, endMileage, stepm, out x, out y, out z, out dir);
                return(pointNumber);
            }
            else //两点不在同一条链
            {
                //首链
                ccount[0] = startChain.getSubLine(startMileage, startChain.mEnd, stepm, out xx[0], out yy[0], out zz[0], out dd[0]);

                //中间链
                int account = ccount[0];
                if (Math.Abs(endNumber - startNumber) > 1)
                {
                    int i = 1;
                    for (int ii = startNumber + 1; ii < endNumber; ii++)
                    {
                        ccount[i] = mLineList[ii].getSubLine(mLineList[ii].mStart, mLineList[ii].mEnd, stepm, out xx[i], out yy[i], out zz[i], out dd[i]);

                        account += ccount[i];
                        i++;
                    }
                }

                //末链
                ccount[endNumber - startNumber] = endChain.getSubLine(endChain.mStart, endMileage, stepm, out xx[endNumber - startNumber], out yy[endNumber - startNumber], out zz[endNumber - startNumber], out dd[endNumber - startNumber]);

                account += ccount[endNumber - startNumber];

                //声明输出数组
                x   = new double[account];
                y   = new double[account];
                z   = new double[account];
                dir = new double[account];

                //首链
                for (int num = 0; num < ccount[0]; num++)
                {
                    x[num]   = xx[0][num];
                    y[num]   = yy[0][num];
                    z[num]   = zz[0][num];
                    dir[num] = dd[0][num];
                }
                int account0 = ccount[0];

                //中间链
                if (Math.Abs(endNumber - startNumber) > 1)
                {
                    int i = 1;
                    for (int ii = startNumber + 1; ii < endNumber; ii++)
                    {
                        for (int num = 0; num < ccount[i]; num++)
                        {
                            x[account0 + num]   = xx[i][num];
                            y[account0 + num]   = yy[i][num];
                            z[account0 + num]   = zz[i][num];
                            dir[account0 + num] = dd[i][num];
                        }
                        account0 += ccount[i];
                        i++;
                    }
                }

                //末链
                for (int num = 0; num < ccount[endNumber - startNumber]; num++)
                {
                    x[account0 + num]   = xx[endNumber - startNumber][num];
                    y[account0 + num]   = yy[endNumber - startNumber][num];
                    z[account0 + num]   = zz[endNumber - startNumber][num];
                    dir[account0 + num] = dd[endNumber - startNumber][num];
                }

                return(account);
            }
        }