//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; }
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; } }
/// <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); }
public PathNode(CRailwayLine rl, double fromM, double toM, bool re) { mRL = rl; fromMileage = fromM; toMileage = toM; isReverse = re; mLength = Math.Abs(fromM - toM); }
///// <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); }
/// <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(); } }
/// <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); } }
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); } }