private SearchParkingSegment getParkingSegment(float lat, float lon) { //Algo: //Select from segment //todo:fix the SQL logic SearchParkingSegment sps = null; String conStr = ConfigurationManager.ConnectionStrings["CityParkCS"].ConnectionString; using (SqlConnection con = new SqlConnection(conStr)) { using (SqlCommand cmd = new SqlCommand()) { String sql = String.Format(@"DECLARE @UserLat float = {0} DECLARE @UserLong float = {1} SELECT TOP 1 SQRT ( POWER((a.StartLatitude - @UserLat) * COS(@UserLat/180) * 40000 / 360, 2) + POWER((a.StartLongitude -@UserLong) * 40000 / 360, 2)) as distance,* FROM [CITYPARK].[dbo].[StreetSegmentLine] a order by distance", lat, lon); cmd.Connection = con; cmd.CommandText = sql; con.Open(); using (SqlDataReader sqlDataReader = cmd.ExecuteReader()) { if (sqlDataReader.HasRows) { while (sqlDataReader.Read()) { StreetSegmentLine ssl = new StreetSegmentLine(); ssl.StartLatitude = sqlDataReader["StartLatitude"].ToString(); ssl.StartLongitude = sqlDataReader["StartLongitude"].ToString(); ssl.EndLatitude = sqlDataReader["EndLatitude"].ToString(); ssl.EndLongitude = sqlDataReader["EndLongitude"].ToString(); ssl.SegmentUnique = sqlDataReader["SegmentUnique"].ToString(); sps = new SearchParkingSegment(-1, ssl.SegmentUnique); break; } } } } } return segmentSessionMap.getSearchParkingSegment(sps); }
public void add(StreetSegmentLine ssl) { SegmentLine.Add(ssl); }
public List<StreetSegment> getStreetParkingPrediction(String sessionId, float latitude, float longitude, int distance) { if (!authenticateUser(sessionId)) { throw Utils.RaiseException(Context.Request.Url.AbsoluteUri, "getStreetParkingPrediction", USER_NOT_AUTHENTICATE, "401", "getStreetParkingPrediction"); } float distanceKm = ((float)distance) / 1000f; Boolean demo = isDemoUser(sessionId); List<StreetSegment> segList = new List<StreetSegment>(); //Algo2: if (!PredictionAlgorithmEnabled && !demo)//if not demo user and the prediction algo should not work { return segList; } //get all segments and distance from current session and store on sessionData for cache usage Dictionary<String, DistancePredictionWrapper> segmentDistance = getAllSegmentsInRange(latitude, longitude, distanceKm); //Add user to SegementWaitingUsersList (only if not exist in waiting list) assignSessionToSegments(segmentDistance, sessionMap[sessionId]); String conStr = ConfigurationManager.ConnectionStrings["CityParkCS"].ConnectionString; using (SqlConnection con = new SqlConnection(conStr)) { using (SqlCommand cmd = new SqlCommand()) {//todo:This SQL should be as getAllSegmentsInRange(..) logic or use the existing return value from getAllSegmentsInRange(..) String sql = String.Format(@"DECLARE @UserLat float = {0} DECLARE @UserLong float = {1} SELECT * FROM [CITYPARK].[dbo].[StreetSegmentLine] a where SQRT ( POWER((a.StartLatitude - @UserLat) * COS(@UserLat/180) * 40000 / 360, 2) + POWER((a.StartLongitude -@UserLong) * 40000 / 360, 2)) < {2} AND SQRT ( POWER((a.endLatitude - @UserLat) * COS(@UserLat/180) * 40000 / 360, 2) + POWER((a.endLongitude -@UserLong) * 40000 / 360, 2)) < {2} order by SegmentUnique", latitude, longitude, distanceKm); cmd.Connection = con; cmd.CommandTimeout = 1200; cmd.CommandText = sql; con.Open(); using (SqlDataReader sqlDataReader = cmd.ExecuteReader()) { if (sqlDataReader.HasRows) { Random random = new Random(); while (sqlDataReader.Read()) { StreetSegmentLine ssl = new StreetSegmentLine(); ssl.StartLatitude = sqlDataReader["StartLatitude"].ToString(); ssl.StartLongitude = sqlDataReader["StartLongitude"].ToString(); ssl.EndLatitude = sqlDataReader["EndLatitude"].ToString(); ssl.EndLongitude = sqlDataReader["EndLongitude"].ToString(); ssl.SegmentUnique = sqlDataReader["SegmentUnique"].ToString(); StreetSegment sSeg = null; foreach (StreetSegment ss in segList) { if (ss.SegmentUnique.Equals(ssl.SegmentUnique)) { sSeg = ss; break; } } if (sSeg != null) { sSeg.add(ssl); } else { float probability = segmentDistance[ssl.SegmentUnique].calcProbability(); if (probability >= 0 || demo) { if (demo) { probability = random.Next(0, 100); } sSeg = new StreetSegment(ssl.SegmentUnique, probability); sSeg.add(ssl); segList.Add(sSeg); } } } } } } } return segList; }