private static DataRow GenerateFirstEcologRow(DataRow newRow, DataRow tripRow, DataRow correctedGpsRow, InsertDatum datum) { newRow.SetField(EcologDao.ColumnTripId, tripRow.Field <int>(TripsDao.ColumnTripId)); newRow.SetField(EcologDao.ColumnDriverId, tripRow.Field <int>(TripsDao.ColumnDriverId)); newRow.SetField(EcologDao.ColumnCarId, tripRow.Field <int>(TripsDao.ColumnCarId)); newRow.SetField(EcologDao.ColumnSensorId, tripRow.Field <int>(TripsDao.ColumnSensorId)); newRow.SetField(EcologDao.ColumnJst, correctedGpsRow.Field <DateTime>(CorrectedGpsDao.ColumnJst)); newRow.SetField(EcologDao.ColumnLatitude, correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLatitude)); newRow.SetField(EcologDao.ColumnLongitude, correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLongitude)); newRow.SetField(EcologDao.ColumnSpeed, 0); newRow.SetField(EcologDao.ColumnHeading, 0); newRow.SetField(EcologDao.ColumnDistanceDifference, 0); var meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLatitude), correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLongitude)); newRow.SetField(EcologDao.ColumnTerraubAltitude, meshAndAltitude.Item2); newRow.SetField(EcologDao.ColumnMeshId, meshAndAltitude.Item1); newRow.SetField(EcologDao.ColumnTerrainAltitudeDiffarencce, 0); // TODO 加速度を挿入する場合はここへ newRow.SetField(EcologDao.ColumnLongitudinalAcc, DBNull.Value); newRow.SetField(EcologDao.ColumnLateralAcc, DBNull.Value); newRow.SetField(EcologDao.ColumnVerticalAcc, DBNull.Value); newRow.SetField(EcologDao.ColumnEnergyByAirResistance, 0); newRow.SetField(EcologDao.ColumnEnergyByRollingResistance, 0); newRow.SetField(EcologDao.ColumnEnergyByClimbingResistance, 0); newRow.SetField(EcologDao.ColumnEnergyByAccResistance, 0); newRow.SetField(EcologDao.ColumnConvertLoss, 0); newRow.SetField(EcologDao.ColumnRegeneLoss, 0); newRow.SetField(EcologDao.ColumnRegeneEnergy, 0); newRow.SetField(EcologDao.ColumnLostEnergy, 0); newRow.SetField(EcologDao.ColumnEfficiency, 0); newRow.SetField(EcologDao.ColumnConsumedElectricEnergy, 0); newRow.SetField(EcologDao.ColumnLostEnergyByWellToWheel, DBNull.Value); newRow.SetField(EcologDao.ColumnConsumedFuel, DBNull.Value); newRow.SetField(EcologDao.ColumnConsumedFuelByWellToWheel, DBNull.Value); newRow.SetField(EcologDao.ColumnEnergyByEquipment, EquipmentEnergyCalculator.CalcEquipmentEnergy(correctedGpsRow.Field <DateTime>(CorrectedGpsDao.ColumnJst))); newRow.SetField(EcologDao.ColumnEnergyByCooling, DBNull.Value); newRow.SetField(EcologDao.ColumnEnergyByHeating, DBNull.Value); newRow.SetField(EcologDao.ColumnTripDirection, tripRow.Field <string>(TripsDao.ColumnTripDirection)); var linkAndTheta = LinkMatcher.GetInstance().MatchLink( correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLatitude), correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLongitude), 0f, tripRow.Field <string>(TripsDao.ColumnTripDirection), datum); newRow.SetField(EcologDao.ColumnLinkId, linkAndTheta.Item1); newRow.SetField(EcologDao.ColumnRoadTheta, linkAndTheta.Item2); return(newRow); }
private static DataRow GenerateEcologRow(DataRow newRow, DataRow beforeRow, DataRow tripRow, DataRow correctedGpsRow, InsertDatum datum) { newRow.SetField(EcologDao.ColumnTripId, tripRow.Field <int>(TripsDao.ColumnTripId)); newRow.SetField(EcologDao.ColumnDriverId, tripRow.Field <int>(TripsDao.ColumnDriverId)); newRow.SetField(EcologDao.ColumnCarId, tripRow.Field <int>(TripsDao.ColumnCarId)); newRow.SetField(EcologDao.ColumnSensorId, tripRow.Field <int>(TripsDao.ColumnSensorId)); newRow.SetField(EcologDao.ColumnJst, correctedGpsRow.Field <DateTime>(CorrectedGpsDao.ColumnJst)); newRow.SetField(EcologDao.ColumnLatitude, correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLatitude)); newRow.SetField(EcologDao.ColumnLongitude, correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLongitude)); double speed = correctedGpsRow.Field <Single>(CorrectedGpsDao.ColumnSpeed); double speedMeterPerSec = speed / 3.6; //Console.WriteLine("SPEED: " + speed); newRow.SetField(EcologDao.ColumnSpeed, speed); newRow.SetField(EcologDao.ColumnHeading, correctedGpsRow.Field <Single>(CorrectedGpsDao.ColumnHeading)); double distanceDiff = correctedGpsRow.Field <Single>(CorrectedGpsDao.ColumnDistanceDifference); //Console.WriteLine("DISTANCE_DIFF: " + distanceDiff); newRow.SetField(EcologDao.ColumnDistanceDifference, distanceDiff); var meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLatitude), correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLongitude)); newRow.SetField(EcologDao.ColumnTerraubAltitude, meshAndAltitude.Item2); newRow.SetField(EcologDao.ColumnMeshId, meshAndAltitude.Item1); double terrainAltitudeDiff = meshAndAltitude.Item2 - beforeRow.Field <Single>(EcologDao.ColumnTerraubAltitude); //Console.WriteLine("ALTITUDE_DIFF: " + terrainAltitudeDiff); newRow.SetField(EcologDao.ColumnTerrainAltitudeDiffarencce, terrainAltitudeDiff); // TODO 加速度を追加する場合はここへ newRow.SetField(EcologDao.ColumnLongitudinalAcc, DBNull.Value); newRow.SetField(EcologDao.ColumnLateralAcc, DBNull.Value); newRow.SetField(EcologDao.ColumnVerticalAcc, DBNull.Value); double airResistancePower = 0; if (speed > 1 && distanceDiff > 0) { airResistancePower = AirResistanceCalculator.CalcPower( Rho, datum.EstimatedCarModel.CdValue, datum.EstimatedCarModel.FrontalProjectedArea, (speed + WindSpeed) / 3.6, speedMeterPerSec); } //Console.WriteLine("AIR: " + airResistancePower); newRow.SetField( EcologDao.ColumnEnergyByAirResistance, airResistancePower); double rollingResistancePower = 0; if (speed > 1 && distanceDiff > 0) { rollingResistancePower = RollingResistanceCalculator.CalcPower( Myu, datum.EstimatedCarModel.Weight, Math.Atan(terrainAltitudeDiff / distanceDiff), speedMeterPerSec); } //Console.WriteLine("ROLLING: " + rollingResistancePower); newRow.SetField( EcologDao.ColumnEnergyByRollingResistance, rollingResistancePower); double climbingResistancePower = 0; if (speed > 1 && distanceDiff > 0) { climbingResistancePower = ClimbingResistanceCalculator.CalcPower( datum.EstimatedCarModel.Weight, Math.Atan(terrainAltitudeDiff / distanceDiff), speedMeterPerSec); } //Console.WriteLine("CLIMBING: " + climbingResistancePower); newRow.SetField( EcologDao.ColumnEnergyByClimbingResistance, climbingResistancePower); double accResistancePower = 0; if (speed > 1 && distanceDiff > 0) { accResistancePower = AccResistanceCalculator.CalcPower( beforeRow.Field <Single>(EcologDao.ColumnSpeed) / 3.6, beforeRow.Field <DateTime>(EcologDao.ColumnJst), speedMeterPerSec, correctedGpsRow.Field <DateTime>(CorrectedGpsDao.ColumnJst), datum.EstimatedCarModel.Weight); } //Console.WriteLine("ACC: " + accResistancePower); newRow.SetField( EcologDao.ColumnEnergyByAccResistance, accResistancePower); double drivingResistancePower = airResistancePower + rollingResistancePower + climbingResistancePower + accResistancePower; double torque = 0; if (drivingResistancePower > 0 && speed > 0) { torque = drivingResistancePower * 1000 * 3600 / speedMeterPerSec * datum.EstimatedCarModel.TireRadius / datum.EstimatedCarModel.ReductionRatio; } int efficiency = EfficiencyCalculator.GetInstance().GetEfficiency(datum.EstimatedCarModel, speedMeterPerSec, torque); //Console.WriteLine("EFFICIENCY: " + efficiency); newRow.SetField(EcologDao.ColumnEfficiency, efficiency); double convertLoss = ConvertLossCaluculator.CalcEnergy( drivingResistancePower, datum.EstimatedCarModel, speedMeterPerSec, efficiency); newRow.SetField(EcologDao.ColumnConvertLoss, convertLoss); //Console.WriteLine("CONVERTLOSS: " + convertLoss); double regeneEnergy = RegeneEnergyCalculator.CalcEnergy(drivingResistancePower, speedMeterPerSec, datum.EstimatedCarModel, efficiency); newRow.SetField(EcologDao.ColumnRegeneEnergy, regeneEnergy); double regeneLoss = RegeneLossCalculator.CalcEnergy(drivingResistancePower, regeneEnergy, datum.EstimatedCarModel, speedMeterPerSec, efficiency); newRow.SetField(EcologDao.ColumnRegeneLoss, regeneLoss); double lostEnergy = LostEnergyCalculator.CalcEnergy(convertLoss, regeneLoss, airResistancePower, rollingResistancePower); newRow.SetField(EcologDao.ColumnLostEnergy, lostEnergy); newRow.SetField(EcologDao.ColumnConsumedElectricEnergy, ConsumedEnergyCaluculator.CalcEnergy(drivingResistancePower, datum.EstimatedCarModel, speedMeterPerSec, efficiency)); newRow.SetField(EcologDao.ColumnLostEnergyByWellToWheel, DBNull.Value); newRow.SetField(EcologDao.ColumnConsumedFuel, DBNull.Value); newRow.SetField(EcologDao.ColumnConsumedFuelByWellToWheel, DBNull.Value); newRow.SetField(EcologDao.ColumnEnergyByEquipment, EquipmentEnergyCalculator.CalcEquipmentEnergy(correctedGpsRow.Field <DateTime>(CorrectedGpsDao.ColumnJst))); newRow.SetField(EcologDao.ColumnEnergyByCooling, DBNull.Value); newRow.SetField(EcologDao.ColumnEnergyByHeating, DBNull.Value); newRow.SetField(EcologDao.ColumnTripDirection, tripRow.Field <string>(TripsDao.ColumnTripDirection)); var linkAndTheta = LinkMatcher.GetInstance().MatchLink( correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLatitude), correctedGpsRow.Field <double>(CorrectedGpsDao.ColumnLongitude), correctedGpsRow.Field <Single>(CorrectedGpsDao.ColumnHeading), tripRow.Field <string>(TripsDao.ColumnTripDirection), datum); newRow.SetField(EcologDao.ColumnLinkId, linkAndTheta.Item1); newRow.SetField(EcologDao.ColumnRoadTheta, linkAndTheta.Item2); return(newRow); }
public static void InsertCorrectedGps(InsertDatum datum, InsertConfig.GpsCorrection correction) { var tripsTable = TripsDao.Get(datum); foreach (DataRow tripsRow in tripsTable.Rows) { DataTable gpsRawTable = AndroidGpsRawDao.Get(tripsRow.Field <DateTime>(TripsDao.ColumnStartTime), tripsRow.Field <DateTime>(TripsDao.ColumnEndTime), datum); if (gpsRawTable.Rows.Count == 0) { return; } DataTable correctedGpsTable = DataTableUtil.GetCorrectedGpsTable(); #region インデックスが 0 の場合 DataRow firstRow = correctedGpsTable.NewRow(); CopyRawDataToCorrectedRow(firstRow, gpsRawTable.Rows[0]); firstRow.SetField(CorrectedGpsDao.ColumnDistanceDifference, 0); //firstRow.SetField(CorrectedGpsDao.ColumnSpeed, 0); firstRow.SetField(CorrectedGpsDao.ColumnHeading, 0); var meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( gpsRawTable.Rows[0].Field <double>(CorrectedGpsDao.ColumnLatitude), gpsRawTable.Rows[0].Field <double>(CorrectedGpsDao.ColumnLongitude)); firstRow.SetField(CorrectedGpsDao.ColumnTerrainAltitude, meshAndAltitude.Item2); var linkAndTheta = LinkMatcher.GetInstance().MatchLink( firstRow.Field <double>(CorrectedGpsDao.ColumnLatitude), firstRow.Field <double>(CorrectedGpsDao.ColumnLongitude), 0f, tripsRow.Field <string>(TripsDao.ColumnTripDirection), datum); firstRow.SetField(CorrectedGpsDao.ColumnLinkId, linkAndTheta.Item1); firstRow.SetField(CorrectedGpsDao.ColumnRoadTheta, linkAndTheta.Item2); correctedGpsTable.Rows.Add(firstRow); #endregion for (int i = 1; i < gpsRawTable.Rows.Count - 1; i++) { DataRow row = correctedGpsTable.NewRow(); CopyRawDataToCorrectedRow(row, gpsRawTable.Rows[i]); // 距離の算出 row.SetField(CorrectedGpsDao.ColumnDistanceDifference, DistanceCalculator.CalcDistance( gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLongitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLongitude))); meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( gpsRawTable.Rows[i].Field <double>(CorrectedGpsDao.ColumnLatitude), gpsRawTable.Rows[i].Field <double>(CorrectedGpsDao.ColumnLongitude)); row.SetField(CorrectedGpsDao.ColumnTerrainAltitude, meshAndAltitude.Item2); // 速度の算出 //row.SetField(CorrectedGpsDao.ColumnSpeed, SpeedCalculator.CalcSpeed( // gpsRawTable.Rows[i - 1].Field<double>(AndroidGpsRawDao.ColumnLatitude), // gpsRawTable.Rows[i - 1].Field<double>(AndroidGpsRawDao.ColumnLongitude), // gpsRawTable.Rows[i - 1].Field<DateTime>(AndroidGpsRawDao.ColumnJst), // gpsRawTable.Rows[i + 1].Field<double>(AndroidGpsRawDao.ColumnLatitude), // gpsRawTable.Rows[i + 1].Field<double>(AndroidGpsRawDao.ColumnLongitude), // gpsRawTable.Rows[i + 1].Field<DateTime>(AndroidGpsRawDao.ColumnJst), // gpsRawTable.Rows[i].Field<double>(AndroidGpsRawDao.ColumnLatitude), // gpsRawTable.Rows[i].Field<double>(AndroidGpsRawDao.ColumnLongitude))); //速度が1km以上になったらHEADINGを更新する(停止時に1つ1つ計算するとHEADINDが暴れるため) if (row.Field <Single?>(CorrectedGpsDao.ColumnSpeed) > 1.0) { row.SetField(CorrectedGpsDao.ColumnHeading, HeadingCalculator.CalcHeading( gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLongitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLongitude))); } else { row.SetField(CorrectedGpsDao.ColumnHeading, correctedGpsTable.Rows[i - 1].Field <double>(CorrectedGpsDao.ColumnHeading)); } linkAndTheta = LinkMatcher.GetInstance().MatchLink( row.Field <double>(CorrectedGpsDao.ColumnLatitude), row.Field <double>(CorrectedGpsDao.ColumnLongitude), Convert.ToSingle(row.Field <double>(CorrectedGpsDao.ColumnHeading)) , tripsRow.Field <string>(TripsDao.ColumnTripDirection), datum ); row.SetField(CorrectedGpsDao.ColumnLinkId, linkAndTheta.Item1); row.SetField(CorrectedGpsDao.ColumnRoadTheta, linkAndTheta.Item2); correctedGpsTable.Rows.Add(row); } #region インデックスが最後の場合 DataRow lastRow = correctedGpsTable.NewRow(); CopyRawDataToCorrectedRow(lastRow, gpsRawTable.Rows[gpsRawTable.Rows.Count - 1]); lastRow.SetField(CorrectedGpsDao.ColumnDistanceDifference, 0); lastRow.SetField(CorrectedGpsDao.ColumnSpeed, 0); lastRow.SetField(CorrectedGpsDao.ColumnHeading, 0); meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( gpsRawTable.Rows[gpsRawTable.Rows.Count - 1].Field <double>(CorrectedGpsDao.ColumnLatitude), gpsRawTable.Rows[gpsRawTable.Rows.Count - 1].Field <double>(CorrectedGpsDao.ColumnLongitude)); lastRow.SetField(CorrectedGpsDao.ColumnTerrainAltitude, meshAndAltitude.Item2); linkAndTheta = LinkMatcher.GetInstance().MatchLink( firstRow.Field <double>(CorrectedGpsDao.ColumnLatitude), firstRow.Field <double>(CorrectedGpsDao.ColumnLongitude), 0f, tripsRow.Field <string>(TripsDao.ColumnTripDirection), datum); lastRow.SetField(CorrectedGpsDao.ColumnLinkId, linkAndTheta.Item1); lastRow.SetField(CorrectedGpsDao.ColumnRoadTheta, linkAndTheta.Item2); correctedGpsTable.Rows.Add(lastRow); #endregion // ファイルごとの挿入なので主キー違反があっても挿入されないだけ if (correction == InsertConfig.GpsCorrection.SpeedLPFMapMatching)//速度にローパスフィルタを適用 { DataTable correctedGpsSpeedLPFTable = LowPassFilter.speedLowPassFilter(correctedGpsTable, 0.05); CorrectedGpsSpeedLPF005MMDao.Insert(correctedGpsSpeedLPFTable); } else if (correction == InsertConfig.GpsCorrection.MapMatching) { CorrectedGPSMMDao.Insert(correctedGpsTable); } else { CorrectedGpsDao.Insert(correctedGpsTable); } } }
private static void MakeCorrectedGpsForDoppler(DataTable gpsRawTable, InsertConfig.GpsCorrection correction) { DataTable correctedGpsTable = DataTableUtil.GetCorrectedGpsDopplerTable(); #region インデックスが 0 の場合 DataRow firstRow = correctedGpsTable.NewRow(); CopyRawDataDopplerToCorrectedRow(firstRow, gpsRawTable.Rows[0]); firstRow.SetField(CorrectedGpsDao.ColumnDistanceDifference, 0); //firstRow.SetField(CorrectedGpsDao.ColumnSpeed, 0); firstRow.SetField(CorrectedGpsDao.ColumnHeading, 0); var meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( gpsRawTable.Rows[0].Field <double>(CorrectedGpsDao.ColumnLatitude), gpsRawTable.Rows[0].Field <double>(CorrectedGpsDao.ColumnLongitude)); firstRow.SetField(CorrectedGpsDao.ColumnTerrainAltitude, meshAndAltitude.Item2); var linkAndTheta = LinkMatcher.GetInstance().MatchLink( firstRow.Field <double>(CorrectedGpsDao.ColumnLatitude), firstRow.Field <double>(CorrectedGpsDao.ColumnLongitude), 0f); firstRow.SetField(CorrectedGpsDao.ColumnLinkId, linkAndTheta.Item1); firstRow.SetField(CorrectedGpsDao.ColumnRoadTheta, linkAndTheta.Item2); correctedGpsTable.Rows.Add(firstRow); #endregion #region インデックスがiの場合 for (int i = 1; i < gpsRawTable.Rows.Count - 1; i++) { DataRow row = correctedGpsTable.NewRow(); CopyRawDataDopplerToCorrectedRow(row, gpsRawTable.Rows[i]); // 距離の算出 row.SetField(CorrectedGpsDao.ColumnDistanceDifference, DistanceCalculator.CalcDistance( gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLongitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLongitude))); meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( gpsRawTable.Rows[i].Field <double>(CorrectedGpsDao.ColumnLatitude), gpsRawTable.Rows[i].Field <double>(CorrectedGpsDao.ColumnLongitude)); row.SetField(CorrectedGpsDao.ColumnTerrainAltitude, meshAndAltitude.Item2); // 速度の算出 //row.SetField(CorrectedGpsDao.ColumnSpeed, SpeedCalculator.CalcSpeed( // gpsRawTable.Rows[i - 1].Field<double>(AndroidGpsRawDao.ColumnLatitude), // gpsRawTable.Rows[i - 1].Field<double>(AndroidGpsRawDao.ColumnLongitude), // gpsRawTable.Rows[i - 1].Field<DateTime>(AndroidGpsRawDao.ColumnJst), // gpsRawTable.Rows[i + 1].Field<double>(AndroidGpsRawDao.ColumnLatitude), // gpsRawTable.Rows[i + 1].Field<double>(AndroidGpsRawDao.ColumnLongitude), // gpsRawTable.Rows[i + 1].Field<DateTime>(AndroidGpsRawDao.ColumnJst), // gpsRawTable.Rows[i].Field<double>(AndroidGpsRawDao.ColumnLatitude), // gpsRawTable.Rows[i].Field<double>(AndroidGpsRawDao.ColumnLongitude))); //速度が1km以上になったらHEADINGを更新する(停止時に1つ1つ計算するとHEADINDが暴れるため) if (row.Field <Single?>(CorrectedGpsDao.ColumnSpeed) > 1.0) { row.SetField(CorrectedGpsDao.ColumnHeading, HeadingCalculator.CalcHeading( gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i - 1].Field <double>(AndroidGpsRawDao.ColumnLongitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLatitude), gpsRawTable.Rows[i].Field <double>(AndroidGpsRawDao.ColumnLongitude))); } else { row.SetField(CorrectedGpsDao.ColumnHeading, correctedGpsTable.Rows[i - 1].Field <double>(CorrectedGpsDao.ColumnHeading)); } linkAndTheta = LinkMatcher.GetInstance().MatchLink( row.Field <double>(CorrectedGpsDao.ColumnLatitude), row.Field <double>(CorrectedGpsDao.ColumnLongitude), Convert.ToSingle(row.Field <double>(CorrectedGpsDao.ColumnHeading)) ); row.SetField(CorrectedGpsDao.ColumnLinkId, linkAndTheta.Item1); row.SetField(CorrectedGpsDao.ColumnRoadTheta, linkAndTheta.Item2); correctedGpsTable.Rows.Add(row); } #endregion #region インデックスが最後の場合 DataRow lastRow = correctedGpsTable.NewRow(); CopyRawDataDopplerToCorrectedRow(lastRow, gpsRawTable.Rows[gpsRawTable.Rows.Count - 1]); lastRow.SetField(CorrectedGpsDao.ColumnDistanceDifference, 0); lastRow.SetField(CorrectedGpsDao.ColumnSpeed, 0); lastRow.SetField(CorrectedGpsDao.ColumnHeading, 0); meshAndAltitude = AltitudeCalculator.GetInstance().CalcAltitude( gpsRawTable.Rows[gpsRawTable.Rows.Count - 1].Field <double>(CorrectedGpsDao.ColumnLatitude), gpsRawTable.Rows[gpsRawTable.Rows.Count - 1].Field <double>(CorrectedGpsDao.ColumnLongitude)); lastRow.SetField(CorrectedGpsDao.ColumnTerrainAltitude, meshAndAltitude.Item2); linkAndTheta = LinkMatcher.GetInstance().MatchLink( firstRow.Field <double>(CorrectedGpsDao.ColumnLatitude), firstRow.Field <double>(CorrectedGpsDao.ColumnLongitude), 0f); lastRow.SetField(CorrectedGpsDao.ColumnLinkId, linkAndTheta.Item1); lastRow.SetField(CorrectedGpsDao.ColumnRoadTheta, linkAndTheta.Item2); correctedGpsTable.Rows.Add(lastRow); #endregion // ファイルごとの挿入なので主キー違反があっても挿入されないだけ if (correction == InsertConfig.GpsCorrection.DopplerSpeed) { CorrectedGPSDopplerDao.Insert(correctedGpsTable); } else if (correction == InsertConfig.GpsCorrection.DopplerNotMM) { CorrectedGpsDopplerNotMMDao.Insert(correctedGpsTable); } }
public LinkExtractionTests() { _linkExtractor = new LinkExtractor(); _linkMatcher = new LinkMatcher(); }