/// <summary> /// given an index, retrieve the max and min point of its boundary in this grid /// </summary> /// <param name="index"></param>specifies the index to be retrieved /// <param name="maxPoint"></param>output, the maxpoint of the boundary /// <param name="minPoint"></param>output, the minpoint of the boundary public void RetrieveBoundary(int index, out LatLong maxPoint, out LatLong minPoint) { int indexLon = index % GridNumLon; int indexLat = index / GridNumLon; double minLat = this.Min.Latitude + this.GridSize * indexLat; double minLon = this.Min.Longitude + this.GridSize * indexLon; double maxLat = this.Min.Latitude + this.GridSize * (indexLat + 1); double maxLon = this.Min.Longitude + this.GridSize * (indexLon + 1); maxPoint = new LatLong(maxLat, maxLon); minPoint = new LatLong(minLat, minLon); }
public static TotalAirQuality ReadAirQuality(string airQualityFilename, string aqiFilename, string aqiStationFilename) { Console.WriteLine("start to read the air quality file."); StreamReader srAQI = new StreamReader(aqiFilename); int month_first = 0, month_old = 0; int day_first = 0, day_old = 0; int district_first = 0; bool stop = false; int countDay = 0; List <string> timeValue = new List <string>(); Dictionary <Pair <int, Time>, int> aqis = new Dictionary <Pair <int, Time>, int>(); srAQI.ReadLine(); while (srAQI.Peek() > 0) { string[] items = srAQI.ReadLine().Split(new char[] { ',', '/', ':', ' ' }); int sid = Convert.ToInt32(items[0]); int month = Convert.ToInt32(items[1]); int day = Convert.ToInt32(items[2]); int year = Convert.ToInt32(items[3]); int hour = Convert.ToInt32(items[4]); if (hour == 12 && items[7] == "AM") { hour = 0; } else if (items[7] == "PM" && hour != 12) { hour = hour + 12; } Time time = new Time(year, month, day, hour); int aqi = Convert.ToInt32(items[8]); var pair = new Pair <int, Time>(sid, time); if (!aqis.ContainsKey(pair)) { aqis.Add(pair, aqi); } //if (!stop) //{ // if (month_first == 0) // { // month_first = month; // day_first = day; // district_first = sid; // } // if (month == month_first && day == day_first && sid != district_first) // { // stop = true; // } // if (day != day_old || month != month_old) // { timeValue.Add(Convert.ToInt32(items[3]).ToString("D2") + Convert.ToInt32(items[1]).ToString("D2") + Convert.ToInt32(items[2]).ToString("D2")); //} //month_old = month; //day_old = day; //} } srAQI.Close(); timeValue = timeValue.Distinct().ToList(); countDay = timeValue.Count(); FileInfo fRead = new FileInfo(airQualityFilename); var totalSize = fRead.Length; var fs = fRead.OpenRead(); StreamReader sr = new StreamReader(fs); long completeOld = 0; List <AirQuality>[] airQualities = new List <AirQuality> [countDay * Time.NUMSLOTPERDAY]; for (int i = 0; i < countDay * Time.NUMSLOTPERDAY; i++) { airQualities[i] = new List <AirQuality>(); } sr.ReadLine(); while (sr.Peek() > 0) { string[] items = sr.ReadLine().Split(new char[] { ',', '-', ':', ' ' }); int sid = Convert.ToInt32(items[0]); int year = Convert.ToInt32(items[1]); int month = Convert.ToInt32(items[2]); int day = Convert.ToInt32(items[3]); int hour = Convert.ToInt32(items[4]); double pm25 = items[7] == "NULL" ? -1 : Convert.ToDouble(items[7]); double pm10 = items[8] == "NULL" ? -1 : Convert.ToDouble(items[8]); double no2 = items[9] == "NULL" ? -1 : Convert.ToDouble(items[9]); double co = items[10] == "NULL" ? -1 : Convert.ToDouble(items[10]); double o3 = items[11] == "NULL" ? -1 : Convert.ToDouble(items[11]); double so2 = items[12] == "NULL" ? -1 : Convert.ToDouble(items[12]); var pair = new Pair <int, Time>(sid, new Time(year, month, day, hour)); int aqi = 0; try { aqi = aqis[pair]; } catch (Exception) { aqi = int.MaxValue; } AirQuality airQuality = new AirQuality(sid, new Time(year, month, day, hour), pm25, pm10, no2, co, o3, so2, aqi); int index = timeValue.IndexOf(items[1] + items[2] + items[3]); airQualities[index * Time.NUMSLOTPERDAY + hour].Add(airQuality); long complete = fs.Position * 10 / totalSize; if (complete != completeOld) { Console.WriteLine(complete * 10 + "% completed!"); } completeOld = complete; } sr.Close(); StreamReader srStation = new StreamReader(aqiStationFilename); Dictionary <int, LatLong> stations = new Dictionary <int, LatLong>(); srStation.ReadLine(); while (srStation.Peek() > 0) { string[] items = srStation.ReadLine().Split(new char[] { '\t' }); int sid = Convert.ToInt32(items[0]); LatLong latlong = new LatLong(Convert.ToDouble(items[2]), Convert.ToDouble(items[3])); stations.Add(sid, latlong); } srStation.Close(); TotalAirQuality totalAirQuality = new TotalAirQuality(airQualities, stations, timeValue); return(totalAirQuality); }
/// <summary> /// read the meterology data from the file. /// </summary> /// <param name="meterologyFilename"></param>specifies the path to the meterology data file. /// <param name="stationLocationFilename"></param>specifies the path to the station-location correspondence file. /// <returns></returns> public static TotalMeterology ReadMeterology(string meterologyFilename, string stationLocationFilename) { //decide the number of days StreamReader srPre = new StreamReader(meterologyFilename); int month_first = 0, month_old = 0; int day_first = 0, day_old = 0; int district_first = 0; int countDay = 0; List <string> timeValue = new List <string>(); srPre.ReadLine(); while (srPre.Peek() > 0) { string[] items = srPre.ReadLine().Split(new char[] { ',', '-', ' ' }); int month = Convert.ToInt32(items[2]); int day = Convert.ToInt32(items[3]); int district = Convert.ToInt32(items[0]); if (month_first == 0) { month_first = month; day_first = day; district_first = district; } if (month == month_first && day == day_first && district != district_first) { break; } if (day != day_old || month != month_old) { countDay++; timeValue.Add(items[1] + items[2] + items[3]); } month_old = month; day_old = day; } srPre.Close(); Console.WriteLine("start to read the meterology data."); FileInfo fRead = new FileInfo(meterologyFilename); var totalSize = fRead.Length; var fs = fRead.OpenRead(); StreamReader sr = new StreamReader(fs); long completeOld = 0; double rainFall, rainFallOld = 0.0; int temperature, temperatureOld = 0; int pressure, pressureOld = 0; int humidity, humidityOld = 0; double windSpeed, windSpeedOld = 0; int windDirection, windDirectionOld = 0; int weatherFlag, weatherFlagOld = 0; List <Meterology>[] meterologies = new List <Meterology> [countDay * Time.NUMSLOTPERDAY]; for (int i = 0; i < countDay * Time.NUMSLOTPERDAY; i++) { meterologies[i] = new List <Meterology>(); } sr.ReadLine(); //read the attributes line while (sr.Peek() > 0) { string[] items = sr.ReadLine().Split(new char[] { ',', ':', ' ' }); int districtID = Convert.ToInt32(items[0]); string[] time = items[1].Split(new char[] { '-' }); int month = Convert.ToInt32(time[1]); int day = Convert.ToInt32(time[2]); int year = Convert.ToInt32(time[0]); int hour = Convert.ToInt32(items[2]); int min = Convert.ToInt32(items[3]); //int timeSlot = (min < 30) ? (hour * 2) : (hour * 2 + 1); int timeSlot = hour; rainFall = items[5] != "NULL" ? Convert.ToDouble(items[5]) : rainFallOld; temperature = items[6] != "NULL" ? (int)Convert.ToDouble(items[6]) : temperatureOld; pressure = items[7] != "NULL" ? (int)Convert.ToDouble(items[7]) : pressureOld; humidity = items[8] != "NULL" ? (int)Convert.ToDouble(items[8]) : humidityOld; windSpeed = items[9] != "NULL" ? Convert.ToDouble(items[9]) : windSpeedOld; windDirection = items[10] != "-1" && items[10] != "NULL" ? Convert.ToInt32(items[10]) : windDirectionOld; weatherFlag = items[11] != "NULL" ? Convert.ToInt32(items[11]) : weatherFlagOld; rainFallOld = rainFall; temperatureOld = temperature; pressureOld = pressure; humidityOld = humidity; windSpeedOld = windSpeed; windDirectionOld = windDirection; weatherFlagOld = weatherFlag; Meterology meterology = new Meterology(districtID, new Time(year, month, day, timeSlot), rainFall, temperature, pressure, humidity, windSpeed, windDirection, weatherFlag); //decide the index of the time int index = timeValue.IndexOf(time[0] + time[1] + time[2]); meterologies[index * Time.NUMSLOTPERDAY + timeSlot].Add(meterology); long complete = fs.Position * 10 / totalSize; if (complete != completeOld) { Console.WriteLine(complete * 10 + "% completed!"); } completeOld = complete; } sr.Close(); Dictionary <LatLong, int> stationLocations = new Dictionary <LatLong, int>(); StreamReader srStation = new StreamReader(stationLocationFilename); srStation.ReadLine(); while (srStation.Peek() > 0) { string[] items = srStation.ReadLine().Split(new char[] { ',' }); LatLong latlong = new LatLong(Convert.ToDouble(items[2]), Convert.ToDouble(items[3])); if (!stationLocations.ContainsKey(latlong)) { stationLocations.Add(latlong, Convert.ToInt32(items[4])); } } srStation.Close(); TotalMeterology totalMeterology = new TotalMeterology(meterologies, stationLocations, timeValue); return(totalMeterology); }
/// <summary> /// read all files regarding to the mobility of the city in all time. /// </summary> /// <param name="roadNetwork"></param>the road network that use. /// <param name="roadMapFilename"></param>specifies the path to the map of mobility edge to the edge of road network. /// <param name="speedDirectory"></param>specifies the directory to all the speed information. /// <param name="pickDropPointsDirectory"></param>specifies the directory to the pickup and dropoff points. /// <returns></returns> public static ToTalMobility ReadMobility(RoadNetwork roadNetwork, string roadMapFilename, string speedFilename, string pickDropPointsFilename, string dayName) { Console.WriteLine("start to read the road map file."); StreamReader srMap = new StreamReader(roadMapFilename); Dictionary <int, List <int> > edgeRecords = new Dictionary <int, List <int> >(); while (srMap.Peek() > 0) { string[] items = srMap.ReadLine().Split(new char[] { '\t' }); if (Convert.ToInt32(items[1]) >= 0) { if (!edgeRecords.ContainsKey(Convert.ToInt32(items[1]))) { List <int> oriEdges = new List <int>(); oriEdges.Add(Convert.ToInt32(items[0])); edgeRecords.Add(Convert.ToInt32(items[1]), oriEdges); } else { edgeRecords[Convert.ToInt32(items[1])].Add(Convert.ToInt32(items[0])); } } } srMap.Close(); Console.WriteLine("start to read the speed file."); Time[] timeStamps = new Time[Time.NUMSLOTPERDAY]; List <PickDropPoint>[] points = new List <PickDropPoint> [Time.NUMSLOTPERDAY]; List <MobilityEdge>[] edges = new List <MobilityEdge> [Time.NUMSLOTPERDAY]; for (int i = 0; i < Time.NUMSLOTPERDAY; i++) { points[i] = new List <PickDropPoint>(); edges[i] = new List <MobilityEdge>(); } FileInfo fRead = new FileInfo(speedFilename); var totalSize = fRead.Length; var fs = fRead.OpenRead(); StreamReader srSpeed = new StreamReader(fs); long completeOld = 0; StreamWriter swSpeed = new StreamWriter(@"D:\Result\Temporary\SpeedDistribution\speed.txt"); int count = 0; while (srSpeed.Peek() > 0) { string[] items = srSpeed.ReadLine().Split(new char[] { ' ' }); int edgeID = Convert.ToInt32(items[0]); int timeSlot = Convert.ToInt32(items[1]) / 2; if (Convert.ToInt32(items[1]) == 1) { ; } double avgs = Convert.ToDouble(items[2]); int numVehicles = Convert.ToInt32(items[4]); if (numVehicles < 0) { numVehicles = 0; } double stds = Convert.ToDouble(items[3]); int year = Convert.ToInt32(dayName.Substring(0, 4)); int month = Convert.ToInt32(dayName.Substring(4, 2)); int day = Convert.ToInt32(dayName.Substring(6, 2)); swSpeed.WriteLine(avgs); timeStamps[timeSlot] = new Time(year, month, day, timeSlot); foreach (var ind in edgeRecords[edgeID]) { Edge oriEdge = roadNetwork.Edges[ind]; edges[timeSlot].Add(new MobilityEdge(oriEdge.EdgeID, oriEdge.StartID, oriEdge.EndID, oriEdge.Length, oriEdge.RoadClass, oriEdge.Direction, oriEdge.FormWay, oriEdge.Urban, oriEdge.MaxLanes, oriEdge.MaxSpeed, oriEdge.Level, oriEdge.AttributeNum, oriEdge.Points, avgs, numVehicles, stds)); } long complete = fs.Position * 10 / totalSize; if (complete != completeOld) { Console.WriteLine(complete * 10 + "% completed!"); } completeOld = complete; count++; } srSpeed.Close(); swSpeed.Close(); Console.WriteLine("start to read the pickdroppoint directory."); StreamReader srPoint = new StreamReader(pickDropPointsFilename); while (srPoint.Peek() > 0) { string[] items = srPoint.ReadLine().Split(new char[] { ' ', ':', '/' }); int hour = Convert.ToInt32(items[3]); int min = Convert.ToInt32(items[4]); //int timeSlot = (min <= 30) ? (hour * 2) : (hour * 2 + 1); int timeSlot = hour; LatLong location = new LatLong(Convert.ToDouble(items[6]), Convert.ToDouble(items[7])); points[timeSlot].Add(new PickDropPoint(location, Convert.ToInt32(items[8]))); } srPoint.Close(); //start to built the totalModality Mobility[] mobilities = new Mobility[Time.NUMSLOTPERDAY]; for (int i = 0; i < Time.NUMSLOTPERDAY; i++) { if (timeStamps[i] != null) { mobilities[i] = new Mobility(edges[i], points[i], timeStamps[i]); } } ToTalMobility totalModality = new ToTalMobility(roadNetwork.Nodes, mobilities); return(totalModality); }
public int Flag; //flag = 1 represents "pick up" and flag = 2 represents "drop off" public PickDropPoint(LatLong l, int f) { this.Location = new LatLong(l.Latitude, l.Longitude); this.Flag = f; }
public Node(int nodeID, LatLong ll) { this.NodeID = nodeID; this.LatLon = new LatLong(ll.Latitude, ll.Longitude); }
public void TotalMeterologyFeature(Grid grid, string meterologyFeatureDirectory, int mode) { int gridNum = grid.GridNumLat * grid.GridNumLon; int countDay = this.NumTimeSlots / Time.NUMSLOTPERDAY; List <LatLong> stations = new List <LatLong>(); foreach (var s in this.StationLocations) { stations.Add(s.Key); } List <double>[] meterologyFeatureOld = new List <double> [gridNum]; for (int i = 0; i < this.NumTimeSlots; i++) { List <Meterology> meterology = this.Meterologies[i]; List <double>[] meterologyFeature = new List <double> [gridNum]; for (int g = 0; g < gridNum; g++) { meterologyFeatureOld[g] = new List <double>(); } if (meterology.Count() > 0) { for (int j = 0; j < gridNum; j++) { LatLong maxPoint, minPoint; grid.RetrieveBoundary(j, out maxPoint, out minPoint); LatLong central = new LatLong((maxPoint.Latitude - minPoint.Latitude) / 2 + minPoint.Latitude, (maxPoint.Longitude - minPoint.Longitude) / 2 + minPoint.Longitude); LatLong nearest = Geo.FindKNN(central, stations, 1)[0]; int districtID = this.StationLocations[nearest]; meterologyFeature[j] = new List <double>(); int indexStation = grid.RetrieveIndex(nearest); if (mode == 0 || (mode == 1 && indexStation == j)) { int count = 0; //feature 1: average rainfall double avgRainFall = 0.0; //feature 2: average temperature int avgTemperature = 0; //feature 3: average pressure int avgPressure = 0; //feature 4: average humidity int avgHumidity = 0; //feature 5: average windspeed double avgWindSpeed = 0.0; //feautre 6: average wind direction int avgWindDirection = 0; //feature 7: the majority of weather flag Dictionary <int, int> weatherFlag = new Dictionary <int, int>(); foreach (var mtrl in meterology) { if (mtrl.DistrictID == districtID) //infer the meterology record that the region has { avgRainFall += mtrl.RainFall; avgTemperature += mtrl.Temperature; avgPressure += mtrl.Pressure; avgHumidity += mtrl.Humidity; avgWindSpeed += mtrl.WindSpeed; avgWindDirection += mtrl.WindDirection; if (!weatherFlag.ContainsKey(mtrl.WeatherFlag)) { weatherFlag.Add(mtrl.WeatherFlag, 1); } else { weatherFlag[mtrl.WeatherFlag]++; } count++; } } if (count > 0) { meterologyFeature[j].Add(avgRainFall / count); meterologyFeature[j].Add(((double)avgTemperature) / count); meterologyFeature[j].Add(((double)avgPressure) / count); meterologyFeature[j].Add(((double)avgHumidity) / count); meterologyFeature[j].Add(avgWindSpeed / count); meterologyFeature[j].Add(((double)avgWindDirection) / count); var flagSort = (from w in weatherFlag orderby w.Value descending select w.Key).ToList(); meterologyFeature[j].Add((double)flagSort[0]); } else { meterologyFeature[j].Add(Double.MaxValue); } } else { meterologyFeature[j].Add(Double.MaxValue); } } for (int j = 0; j < gridNum; j++) { meterologyFeatureOld[j] = new List <double>(); foreach (var mf in meterologyFeature[j]) { meterologyFeatureOld[j].Add(mf); } } } else { meterologyFeature = meterologyFeatureOld; } string directory = Path.Combine(meterologyFeatureDirectory, this.Days[i / Time.NUMSLOTPERDAY]); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } string filename = Path.Combine(directory, (i % Time.NUMSLOTPERDAY).ToString("D2")); IO.WriteFeature(meterologyFeature, filename); } }