public int CountDistance(trackSegment tracksegment) { if (tracksegment == null) return 0; decimal dist_in_decimal; double cos_lat1, cos_lat2, dist_in_double, sin_delta_lat_half, sin_delta_lon_half; cos_lat1 = Math.Cos(Decimal.ToDouble(tracksegment.start.Lat)); cos_lat2 = Math.Cos(Decimal.ToDouble(tracksegment.end.Lat)); sin_delta_lat_half = Math.Sin(Decimal.ToDouble((tracksegment.end.Lat - tracksegment.start.Lat) / 2)); sin_delta_lon_half = Math.Sin(Decimal.ToDouble((tracksegment.end.Lon - tracksegment.start.Lon) / 2)); dist_in_double = 6372795 * 2 * Math.Asin(Math.Sqrt(sin_delta_lat_half * sin_delta_lat_half + cos_lat1 * cos_lat2 * sin_delta_lon_half * sin_delta_lon_half)); try { dist_in_decimal = (decimal)dist_in_double; return Decimal.ToInt32(Decimal.Round(dist_in_decimal, 0)); } catch (Exception ex) { return 0; } }
public decimal CountSpeed(trackSegment tracksegment) { TimeSpan timespan; decimal timespan_dec, speed; timespan = tracksegment.start.time - tracksegment.end.time; try { timespan_dec = (Decimal)timespan.TotalSeconds; timespan_dec = Decimal.Round(timespan_dec, 0); speed = tracksegment.distance / timespan_dec; if (speed <= 0) { return speed * (-1); } else return speed; } catch (Exception ex) { throw ex; } }
void FormTrack() { if (ptList == null) return; //minLat = ptList.ElementAt(0).lat; //minY //maxLat = ptList.ElementAt(0).lat; //maxY //minLon = ptList.ElementAt(0).lon; // minX //maxLon = ptList.ElementAt(0).lon; // maxX if((minLat==0)&&(minLon==0)&&(maxLat==0)&&(maxLon==0)) { //преобразуем градусы в радианы minLat = (Decimal)Degr2Rad(180); minLon = (Decimal)Degr2Rad(180); maxLat = (Decimal)Degr2Rad(0); maxLon = (Decimal)Degr2Rad(0); //вычисляем крайние точки трека for (int y = 0; y < ptList.Count; y++) { ptList.ElementAt(y).lat = (Decimal)Degr2Rad(ptList.ElementAt(y).lat); ptList.ElementAt(y).lon = (Decimal)Degr2Rad(ptList.ElementAt(y).lon); if (minLat >= ptList.ElementAt(y).lat) { minLat = ptList.ElementAt(y).lat; } if (maxLat <= ptList.ElementAt(y).lat) { maxLat = ptList.ElementAt(y).lat; } if (minLon >= ptList.ElementAt(y).lon) { minLon = ptList.ElementAt(y).lon; } if (maxLon <= ptList.ElementAt(y).lon) { maxLon = ptList.ElementAt(y).lon; } } } //a = (maxLat - minLat) / (base.Size.Height * 10); a = (maxLat - minLat) / (base.Size.Height); b = (maxLon - minLon) / base.Size.Width; //------------------------------------------------------------ track = new trackSegment[ptList.Count - 1]; for (int t = 0; t < ptList.Count - 1; t++) { track[t] = new trackSegment(); track[t].start = new mapPoint(); track[t].end = new mapPoint(); track[t].start.Lat = ptList.ElementAt(t).lat; track[t].start.Lon = ptList.ElementAt(t).lon; track[t].start.time = ptList.ElementAt(t).time; track[t].end.Lat = ptList.ElementAt(t + 1).lat; track[t].end.Lon = ptList.ElementAt(t + 1).lon; track[t].end.time = ptList.ElementAt(t + 1).time; ////--------test data-------------- //track[t].start.Lat = (Decimal)Degr2Rad((Decimal)77.1539); //track[t].start.Lon = (Decimal)Degr2Rad((Decimal)(-120.398)); //track[t].end.Lat = (Decimal)Degr2Rad((Decimal)77.1804); //track[t].end.Lon = (Decimal)Degr2Rad((Decimal)129.55); //// 2332669 ////------------------------------- track[t].distance = CountDistance(track[t]); //tracklenght = tracklenght + track[t].distance; try { track[t].speed = CountSpeed(track[t]); } catch (Exception ex) { track[t].speed = 0; } track[t].start.Y = Decimal.ToInt32(Decimal.Round((ptList.ElementAt(t).lat - minLat) / a, 0)); track[t].start.X = Decimal.ToInt32(Decimal.Round((ptList.ElementAt(t).lon - minLon) / b, 0)); track[t].end.Y = Decimal.ToInt32(Decimal.Round((ptList.ElementAt(t + 1).lat - minLat) / a, 0)); track[t].end.X = Decimal.ToInt32(Decimal.Round((ptList.ElementAt(t + 1).lon - minLon) / b, 0)); } }