private void AnalyseFCDThread(object objGpsTime)
{
WriteLog(string.Format("线程:{0} 开始启动......", Thread.CurrentThread.GetHashCode()));
string[] gpsTime = objGpsTime as string[];
string beginGPSTime = gpsTime[0];
string endGPSTime = gpsTime[1];
OnlineFcdDs fcdDs = new OnlineFcdDs();
FCDCarStatusDs carStatusDs = new FCDCarStatusDs();
perTimer.Start();
//取过滤完成的FCD数据
fcdBll.GetOnlineFcdData(fcdDs, beginGPSTime, endGPSTime);
//进行地址匹配(经纬度匹配)。
//1、遍历FCD点进行最短距离计算
//2、进行方位角判断
double MinDistance = 0;
double DistanceAlongCurve = 0;
IPoint fromPoint = new PointClass();
Boolean bAsRatio = false;
Boolean bRight = false;
//与缓冲区有交集的并且方位角夹角小于特定值的线集合
Dictionary<IFeature, double> roadLine = new Dictionary<IFeature, double>();
foreach (DataRow dr in fcdDs.T_ONLINEFCD.Rows)
{
double tx, ty;
if (double.TryParse(dr["LONGITUDE"].ToString(), out tx) && double.TryParse(dr["LATITUDE"].ToString(), out ty))
{
IPoint fcdPoint = new PointClass();
fcdPoint.SpatialReference = ispRef;
fcdPoint.PutCoords(tx, ty);
//构造缓冲区
IGeometry bufferGeo = gisHp.GetBufferGeometry(fcdPoint as IGeometry, bufferDistance);
//求出与该缓冲区有交集的所有路段
List<IFeature> listLines = gisHp.GetIntersectGeometry(bufferGeo, pLines);
//判断方位角
double fcdAngle;
double.TryParse(dr["Rate"].ToString(), out fcdAngle);
if (listLines != null)
{
roadLine.Clear();
foreach (IFeature pFeature in listLines)
{
double lineAngle;
double.TryParse(pFeature.get_Value(pFeature.Fields.FindField("ANGLE")).ToString(), out lineAngle);
double difAngle = Math.Abs(lineAngle - fcdAngle);
//double difAngle = Math.Abs(tangLineAngle - fcdAngle);
if (difAngle >= 0) // <= 65)
{
roadLine.Add(pFeature, MinDistance);
}
}
if (roadLine.Count > 0)
{
//根据最短距离对线集合进行排序(升序)
var sortLines = from disValue in roadLine orderby disValue.Value select disValue;
IFeature edgeLine = null;
foreach (KeyValuePair<IFeature, double> pair in sortLines)
{
int edgeID;
double edgeLength;
decimal speed;
edgeLine = pair.Key as IFeature;
Int32.TryParse(edgeLine.get_Value(edgeLine.Fields.FindField("EDGEID")).ToString(), out edgeID);
double.TryParse(edgeLine.get_Value(edgeLine.Fields.FindField("LENGTH")).ToString(), out edgeLength);
if (edgeID > 0 && edgeLength > 0)
{
T_OnLineFCD_CarStatus
DataRow carStatusDr = carStatusDs.T_ONLINEFCD_CARSTATUS.NewRow();
carStatusDr["TERMINAL"] = dr["TERMINAL"];
decimal.TryParse(dr["SPEED"].ToString(), out speed);
carStatusDr["SPEED"] = decimal.Round(speed, 3);
carStatusDr["EDGE_ID"] = edgeID;
carStatusDr["EDGE_LENGTH"] = edgeLength;
carStatusDr["GPSTIME"] = dr["GPSTIME"];
carStatusDr["UPDATE_DATE"] = DateTime.Now.ToString("yyyyMMdd");
carStatusDr["UPDATE_TIME"] = DateTime.Now.ToString("HHmmss");
carStatusDr["FLAG"] = dr["FLAG"];
//carStatusDr["SATELLITER_COUNT"] = dr[""];
//其他列赋值
carStatusDs.T_ONLINEFCD_CARSTATUS.Rows.Add(carStatusDr);
}
break;
}
}
}
}
dr.Delete();
}
perTimer.Stop();
WriteLog(string.Format("{5}线程结束,时间间隔:{0}-{1},FCD总数:{2},匹配成功:{3}条,耗时:{4}",
beginGPSTime, endGPSTime,
fcdDs.T_ONLINEFCD.Rows.Count.ToString(), carStatusDs.T_ONLINEFCD_CARSTATUS.Rows.Count.ToString(),
perTimer.Duration, Thread.CurrentThread.GetHashCode()));
//停止当前线程
Thread.CurrentThread.Abort();
Console.ReadLine();
}