Skip to content
Snippets Groups Projects
5_Synthetic measures from agents' travels.gaml 21.71 KiB
/**
* Name: Deplacementdevelos
* Based on the internal empty template. 
* Author: nathancoisne
* Tags: 
*/


model Deplacementdevelos

/* 
 * This model generates pollution measures from the trips generated by 'travel agents'. Pollution data are extracted from a hourly pollution model from AtmoSud (date: 27/05/2021)
 * 
 */

global {
		
	file bound <- shape_file("../includes/Marseille/boundary_Marseille.shp");
		  	
	bool workers <- false; // une seule population en 'true' à la fois pour le stockage des mesures par type d'agent
    bool students <- false;
    bool leisures <- true;
    
    bool measure_NO2 <- true;
    bool measure_O3 <- true;
    bool measure_PM10 <- true;
    bool measure_PM25 <- true;
        
    geometry shape <- envelope(bound);
    
    // coordonees des rasters de pollution
    float min_x <- 889462.50000;
    float min_y <- 6236287.50000;
    float max_x <- 905062.50000;
    float max_y <- 6254412.50000;
    
    int compteur_ID <- 0;
   	
    init{ 
  		   	
		// mise en mémoire du cube de pollution NO2, O3, PM10, PM25 (24 rasters horaires)
		list<matrix<float>> NO2_rasters;
		list<matrix<float>> O3_rasters;
		list<matrix<float>> PM10_rasters;
		list<matrix<float>> PM25_rasters;
		
		if measure_NO2 {
			// raster heure 0 manquant pour la journée du 27
			matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
			NO2_rasters << pollution_raster_float;
			
			loop i from: 1 to: 23{
				
				string path_grid;
				if (i < 10){
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_NO2_202105270' + i + '_202105270' + i + '.tif';
				}
				else{
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_NO2_20210527' + i + '_20210527' + i + '.tif';
				}
				
				matrix my_data <- grid_file(path_grid) as_matrix({624, 725});
		        
		        matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
					
				loop j from: 0 to: 623{
					loop k from: 0 to: 724{
						
						pollution_raster_float[j, k] <- float (my_data[j, k] get("grid_value"));
						
					}
				}
				write ('raster NO2 ' + i + ' chargé');
				write('max: ' + max(pollution_raster_float));
				
				NO2_rasters << pollution_raster_float;
			}
		}
		
		if measure_O3 {
			
			matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
			O3_rasters << pollution_raster_float;
			
			loop i from: 1 to: 23{
				
				string path_grid;
				if (i < 10){
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_O3_202105270' + i + '_202105270' + i + '.tif';
				}
				else{
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_O3_20210527' + i + '_20210527' + i + '.tif';
				}
				
				matrix my_data <- grid_file(path_grid) as_matrix({624, 725});
		        
		        matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
					
				loop j from: 0 to: 623{
					loop k from: 0 to: 724{
						
						pollution_raster_float[j, k] <- float (my_data[j, k] get("grid_value"));
						
					}
				}
				write ('raster O3 ' + i + ' chargé');
				write('max: ' + max(pollution_raster_float));
				
				O3_rasters << pollution_raster_float;
			}
		}
		
		if measure_PM10 {
			
			matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
			PM10_rasters << pollution_raster_float;
			
			loop i from: 1 to: 23{
				
				string path_grid;
				if (i < 10){
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_PM10_202105270' + i + '_202105270' + i + '.tif';
				}
				else{
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_PM10_20210527' + i + '_20210527' + i + '.tif';
				}
				
				matrix my_data <- grid_file(path_grid) as_matrix({624, 725});
		        
		        matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
					
				loop j from: 0 to: 623{
					loop k from: 0 to: 724{
						
						pollution_raster_float[j, k] <- float (my_data[j, k] get("grid_value"));
						
					}
				}
				write ('raster PM10 ' + i + ' chargé');
				write('max: ' + max(pollution_raster_float));
				
				PM10_rasters << pollution_raster_float;
			}
		}
		
		if measure_PM25 {
			
			matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
			PM25_rasters << pollution_raster_float;
			
			loop i from: 1 to: 23{
				
				string path_grid;
				if (i < 10){
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_PM25_202105270' + i + '_202105270' + i + '.tif';
				}
				else{
					path_grid <- '../includes/Marseille/pollution_model/raster_dep13_PM25_20210527' + i + '_20210527' + i + '.tif';
				}
				
				matrix my_data <- grid_file(path_grid) as_matrix({624, 725});
		        
		        matrix<float> pollution_raster_float <- 0.0 as_matrix({624, 725});
					
				loop j from: 0 to: 623{
					loop k from: 0 to: 724{
						
						pollution_raster_float[j, k] <- float (my_data[j, k] get("grid_value"));
						
					}
				}
				write ('raster PM25 ' + i + ' chargé');
				write('max: ' + max(pollution_raster_float));
				
				PM25_rasters << pollution_raster_float;
			}
		}
		
		
		// generation des donnees de pollution pour chaque type d'agent
		
		if workers{
	    	write("generating workers measures");
	    		    	
	    	create measure from: shape_file("../results/Marseille/worker/aller_worker/positions_aller_worker.shp") with: [time_of_measure::(read("time")), name_of_agent::(read('agent'))]{
	    		
	    		int worker_number <- int((((name_of_agent split_with '[')[1]) split_with ']')[0]);
	    		write(worker_number);
				if (worker_number > 3000){do die;} // on calcule les mesures faites pour une majorité d'agent. le reste servira de test aux prédictions faites à partir de ces mesures

	    		ID <- compteur_ID;
		    	compteur_ID <- compteur_ID + 1;
		    			    					    
			    geometry CRS_2154 <- location CRS_transform("EPSG:2154");
			    
			    list<string> coord <- string(CRS_2154) split_with ",";
			    
			    latitude <- float(coord[1]);
			    longitude <- float((coord[0] split_with "{")[0]);
							
			    int cell_x <- int((longitude - min_x) / 25);
			    int cell_y <- int((max_y - latitude) / 25);
			    		    				    		
			    // obtention de la concentration de polluant : interpolation linéaire entre les deux rasters horaires qui 'encadrent' l'heure de mesure
			    
				   	
				int hour_before_measure <- time_of_measure.hour;
				int hour_after_measure <- hour_before_measure + 1;
					
				int min_measure <- time_of_measure.minute;
				int sec_measure <- time_of_measure.second;
					
				if measure_NO2 {	
				NO2_concentration <- NO2_rasters[hour_before_measure][cell_x,cell_y] + 
											  (NO2_rasters[hour_after_measure][cell_x,cell_y] - NO2_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_O3 {	
				O3_concentration <- O3_rasters[hour_before_measure][cell_x,cell_y] + 
											  (O3_rasters[hour_after_measure][cell_x,cell_y] - O3_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM10 {	
				PM10_concentration <- PM10_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM10_rasters[hour_after_measure][cell_x,cell_y] - PM10_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM25 {	
				PM25_concentration <- PM25_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM25_rasters[hour_after_measure][cell_x,cell_y] - PM25_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
				  
				}
				
				save [ID, name_of_agent, longitude, latitude, time_of_measure, NO2_concentration, O3_concentration, PM10_concentration, PM25_concentration] 
	    				to: "../results/Marseille/worker/workers_measures.csv" type:"csv" rewrite: false;
	    	}
	    	
	    	ask measure{do die;}
	    	
	    	create measure from: shape_file("../results/Marseille/worker/retour_worker/positions_retour_worker.shp") with: [time_of_measure::(read("time")), name_of_agent::(read('agent'))]{
	    		
	    		int worker_number <- int((((name_of_agent split_with '[')[1]) split_with ']')[0]);
	    		write(worker_number);
				if (worker_number > 3000){do die;} // on calcule les mesures faites pour une majorité d'agent. le reste servira de test aux prédictions faites à partir de ces mesures

	    		ID <- compteur_ID;
		    	compteur_ID <- compteur_ID + 1;
		    			    					    
			    geometry CRS_2154 <- location CRS_transform("EPSG:2154");
			    
			    list<string> coord <- string(CRS_2154) split_with ",";
			    
			    latitude <- float(coord[1]);
			    longitude <- float((coord[0] split_with "{")[0]);
							
			    int cell_x <- int((longitude - min_x) / 25);
			    int cell_y <- int((max_y - latitude) / 25);
			    		    				    		
			    // obtention de la concentration de polluant : interpolation linéaire entre les deux rasters horaires qui 'encadrent' l'heure de mesure
			    
				   	
				int hour_before_measure <- time_of_measure.hour;
				int hour_after_measure <- hour_before_measure + 1;
					
				int min_measure <- time_of_measure.minute;
				int sec_measure <- time_of_measure.second;
					
				if measure_NO2 {	
				NO2_concentration <- NO2_rasters[hour_before_measure][cell_x,cell_y] + 
											  (NO2_rasters[hour_after_measure][cell_x,cell_y] - NO2_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_O3 {	
				O3_concentration <- O3_rasters[hour_before_measure][cell_x,cell_y] + 
											  (O3_rasters[hour_after_measure][cell_x,cell_y] - O3_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM10 {	
				PM10_concentration <- PM10_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM10_rasters[hour_after_measure][cell_x,cell_y] - PM10_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM25 {	
				PM25_concentration <- PM25_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM25_rasters[hour_after_measure][cell_x,cell_y] - PM25_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				save [ID, name_of_agent, longitude, latitude, time_of_measure, NO2_concentration, O3_concentration, PM10_concentration, PM25_concentration] 
	    				to: "../results/Marseille/worker/workers_measures.csv" type:"csv" rewrite: false;
	    	}
	    	ask measure{do die;}
	    	
	    		
	    }	    	
	    
    	   		
    	if students{
	    	write("generating students measures");
	    		    	
	    	create measure from: shape_file("../results/Marseille/student/aller_student/positions_aller_student.shp") with: [time_of_measure::(read("time")), name_of_agent::(read('agent'))]{
	    		
	    		int student_number <- int((((name_of_agent split_with '[')[1]) split_with ']')[0]);
	    		write(student_number);
				if (student_number > 1800){do die;} // on calcule les mesures faites pour une majorité d'agent. le reste servira de test aux prédictions faites à partir de ces mesures
				
	    		ID <- compteur_ID;
		    	compteur_ID <- compteur_ID + 1;
		    			    					    
			    geometry CRS_2154 <- location CRS_transform("EPSG:2154");
			    
			    list<string> coord <- string(CRS_2154) split_with ",";
			    
			    latitude <- float(coord[1]);
			    longitude <- float((coord[0] split_with "{")[0]);
							
			    int cell_x <- int((longitude - min_x) / 25);
			    int cell_y <- int((max_y - latitude) / 25);
			    		    				    		
			    // obtention de la concentration de polluant : interpolation linéaire entre les deux rasters horaires qui 'encadrent' l'heure de mesure
			    
				   	
				int hour_before_measure <- time_of_measure.hour;
				int hour_after_measure <- hour_before_measure + 1;
					
				int min_measure <- time_of_measure.minute;
				int sec_measure <- time_of_measure.second;
					
				if measure_NO2 {	
				NO2_concentration <- NO2_rasters[hour_before_measure][cell_x,cell_y] + 
											  (NO2_rasters[hour_after_measure][cell_x,cell_y] - NO2_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_O3 {	
				O3_concentration <- O3_rasters[hour_before_measure][cell_x,cell_y] + 
											  (O3_rasters[hour_after_measure][cell_x,cell_y] - O3_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM10 {	
				PM10_concentration <- PM10_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM10_rasters[hour_after_measure][cell_x,cell_y] - PM10_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM25 {	
				PM25_concentration <- PM25_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM25_rasters[hour_after_measure][cell_x,cell_y] - PM25_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
				  
				}
				
				save [ID, name_of_agent, longitude, latitude, time_of_measure, NO2_concentration, O3_concentration, PM10_concentration, PM25_concentration] 
	    				to: "../results/Marseille/student/students_measures.csv" type:"csv" rewrite: false;
	    	}
	    	
	    	ask measure{do die;}
	    	
	    	create measure from: shape_file("../results/Marseille/student/retour_student/positions_retour_student.shp") with: [time_of_measure::(read("time")), name_of_agent::(read('agent'))]{
	    			    		
	    		int student_number <- int((((name_of_agent split_with '[')[1]) split_with ']')[0]);
	    		write(student_number);
				if (student_number > 1800){do die;} // on calcule les mesures faites pour une majorité d'agent. le reste servira de test aux prédictions faites à partir de ces mesures
	    		
	    		ID <- compteur_ID;
		    	compteur_ID <- compteur_ID + 1;
		    			    					    
			    geometry CRS_2154 <- location CRS_transform("EPSG:2154");
			    
			    list<string> coord <- string(CRS_2154) split_with ",";
			    
			    latitude <- float(coord[1]);
			    longitude <- float((coord[0] split_with "{")[0]);
							
			    int cell_x <- int((longitude - min_x) / 25);
			    int cell_y <- int((max_y - latitude) / 25);
			    		    				    		
			    // obtention de la concentration de polluant : interpolation linéaire entre les deux rasters horaires qui 'encadrent' l'heure de mesure
			    
				   	
				int hour_before_measure <- time_of_measure.hour;
				int hour_after_measure <- hour_before_measure + 1;
					
				int min_measure <- time_of_measure.minute;
				int sec_measure <- time_of_measure.second;
					
				if measure_NO2 {	
				NO2_concentration <- NO2_rasters[hour_before_measure][cell_x,cell_y] + 
											  (NO2_rasters[hour_after_measure][cell_x,cell_y] - NO2_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_O3 {	
				O3_concentration <- O3_rasters[hour_before_measure][cell_x,cell_y] + 
											  (O3_rasters[hour_after_measure][cell_x,cell_y] - O3_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM10 {	
				PM10_concentration <- PM10_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM10_rasters[hour_after_measure][cell_x,cell_y] - PM10_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM25 {	
				PM25_concentration <- PM25_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM25_rasters[hour_after_measure][cell_x,cell_y] - PM25_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				save [ID, name_of_agent, longitude, latitude, time_of_measure, NO2_concentration, O3_concentration, PM10_concentration, PM25_concentration] 
	    				to: "../results/Marseille/student/students_measures.csv" type:"csv" rewrite: false;
	    	}
	    	ask measure{do die;}
	    		
	    }
	    
	    if leisures{
	    	write("generating leisures measures");
	    		    	
	    	create measure from: shape_file("../results/Marseille/leisure/aller_leisure/positions_aller_leisure.shp") with: [time_of_measure::(read("time")), name_of_agent::(read('agent'))]{
	    		
	    		int leisure_number <- int((((name_of_agent split_with '[')[1]) split_with ']')[0]);
	    		write(leisure_number);
				if (leisure_number > 6200){do die;} // on calcule les mesures faites pour une majorité d'agent. le reste servira de test aux prédictions faites à partir de ces mesures

	    		ID <- compteur_ID;
		    	compteur_ID <- compteur_ID + 1;
		    			    					    
			    geometry CRS_2154 <- location CRS_transform("EPSG:2154");
			    
			    list<string> coord <- string(CRS_2154) split_with ",";
			    
			    latitude <- float(coord[1]);
			    longitude <- float((coord[0] split_with "{")[0]);
							
			    int cell_x <- int((longitude - min_x) / 25);
			    int cell_y <- int((max_y - latitude) / 25);
			    		    				    		
			    // obtention de la concentration de polluant : interpolation linéaire entre les deux rasters horaires qui 'encadrent' l'heure de mesure
			    
				   	
				int hour_before_measure <- time_of_measure.hour;
				int hour_after_measure <- hour_before_measure + 1;
					
				int min_measure <- time_of_measure.minute;
				int sec_measure <- time_of_measure.second;
					
				if measure_NO2 {	
				NO2_concentration <- NO2_rasters[hour_before_measure][cell_x,cell_y] + 
											  (NO2_rasters[hour_after_measure][cell_x,cell_y] - NO2_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_O3 {	
				O3_concentration <- O3_rasters[hour_before_measure][cell_x,cell_y] + 
											  (O3_rasters[hour_after_measure][cell_x,cell_y] - O3_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM10 {	
				PM10_concentration <- PM10_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM10_rasters[hour_after_measure][cell_x,cell_y] - PM10_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM25 {	
				PM25_concentration <- PM25_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM25_rasters[hour_after_measure][cell_x,cell_y] - PM25_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
				  
				}
				
				save [ID, name_of_agent, longitude, latitude, time_of_measure, NO2_concentration, O3_concentration, PM10_concentration, PM25_concentration] 
	    				to: "../results/Marseille/leisure/leisures_measures.csv" type:"csv" rewrite: false;
	    	}
	    	
	    	ask measure{do die;}
	    	
	    	create measure from: shape_file("../results/Marseille/leisure/retour_leisure/positions_retour_leisure.shp") with: [time_of_measure::(read("time")), name_of_agent::(read('agent'))]{
	    		
	    		int leisure_number <- int((((name_of_agent split_with '[')[1]) split_with ']')[0]);
	    		write(leisure_number);
				if (leisure_number > 6200){do die;} // on calcule les mesures faites pour une majorité d'agent. le reste servira de test aux prédictions faites à partir de ces mesures
	    		
	    		ID <- compteur_ID;
		    	compteur_ID <- compteur_ID + 1;
		    			    					    
			    geometry CRS_2154 <- location CRS_transform("EPSG:2154");
			    
			    list<string> coord <- string(CRS_2154) split_with ",";
			    
			    latitude <- float(coord[1]);
			    longitude <- float((coord[0] split_with "{")[0]);
							
			    int cell_x <- int((longitude - min_x) / 25);
			    int cell_y <- int((max_y - latitude) / 25);
			    		    				    		
			    // obtention de la concentration de polluant : interpolation linéaire entre les deux rasters horaires qui 'encadrent' l'heure de mesure
			    
				   	
				int hour_before_measure <- time_of_measure.hour;
				int hour_after_measure <- hour_before_measure + 1;
					
				int min_measure <- time_of_measure.minute;
				int sec_measure <- time_of_measure.second;
					
				if measure_NO2 {	
				NO2_concentration <- NO2_rasters[hour_before_measure][cell_x,cell_y] + 
											  (NO2_rasters[hour_after_measure][cell_x,cell_y] - NO2_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_O3 {	
				O3_concentration <- O3_rasters[hour_before_measure][cell_x,cell_y] + 
											  (O3_rasters[hour_after_measure][cell_x,cell_y] - O3_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM10 {	
				PM10_concentration <- PM10_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM10_rasters[hour_after_measure][cell_x,cell_y] - PM10_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				if measure_PM25 {	
				PM25_concentration <- PM25_rasters[hour_before_measure][cell_x,cell_y] + 
											  (PM25_rasters[hour_after_measure][cell_x,cell_y] - PM25_rasters[hour_before_measure][cell_x,cell_y]) * (min_measure * 60 + sec_measure) / 3600;
											  
				}
				
				save [ID, name_of_agent, longitude, latitude, time_of_measure, NO2_concentration, O3_concentration, PM10_concentration, PM25_concentration] 
	    				to: "../results/Marseille/leisure/leisures_measures.csv" type:"csv" rewrite: false;
	    	}
	    	ask measure{do die;}
	    		
	    }		    	
    }          
}

species measure {
	int ID;
	string name_of_agent;
	float longitude min: min_x max: max_x - 0.1;
	float latitude min: min_y max: max_y - 0.1;
	date time_of_measure;
	float NO2_concentration;
	float O3_concentration;
	float PM10_concentration;
	float PM25_concentration;
}

grid pollution_cell file: grid_file('../includes/Marseille/pollution_model/raster_dep13_NO2_2021052701_2021052701.tif'){
}

experiment bike_traffic type: gui {

}