コード例 #1
0
ファイル: Parking_Process.cpp プロジェクト: kravitz/transims4
bool ArcNet::Parking_Processing (Db_File *fh)
{
	int link, dir;
	double offset;

	XYZ_Point *pt_ptr;
	Offset_Data offset_rec;
	Link_Data *link_ptr;
	Parking_Data *parking_ptr;

	Parking_File *file = (Parking_File *) fh;

	if (First_Record ()) {
		arcview_parking.Num_Points (1);

		if (!parking_offset.Max_Records (file->Num_Records ())) {
			Error ("Insufficient Memory for Parking Points");
		}
	}

	if (Network_Service::Parking_Processing (file)) {
		arcview_parking.Copy_Fields (file);

		parking_ptr = parking_data.New_Record ();

		if (select_time) {
			if (!time_range.Span_Range (parking_ptr->Start (), parking_ptr->End ())) return (false);
		}
		link = parking_ptr->Link ();
		dir = parking_ptr->Dir ();
		offset = UnRound (parking_ptr->Offset ());		

		link_ptr = link_data.Get (link);

		Link_Shape (link_ptr, dir, &points, offset, 0.0, parking_side);

		pt_ptr = points [1];

		arcview_parking.points.Set (1, pt_ptr);

		if (!arcview_parking.Write_Record ()) {
			Error ("Writing ArcView Parking File");
		}

		//---- save the parking offset data ----

		offset_rec.ID (parking_ptr->ID ());
		offset_rec.Link (link);
		offset_rec.Dir (dir);
		offset_rec.Offset (offset);
		offset_rec.X (pt_ptr->x);
		offset_rec.Y (pt_ptr->y);
		offset_rec.Z (pt_ptr->z);

		if (!parking_offset.Add (&offset_rec)) {
			Error ("Saving Parking Offsets");
		}
	}
	return (false);
}
コード例 #2
0
bool ArcPlan::Get_Location_Data (Location_File &file, Location_Data &location_rec)
{
	int link, dir, index;
	double offset, setback, side;

	Point_Map_Stat map_stat;
	Link_Data *link_ptr;

	if (Data_Service::Get_Location_Data (file, location_rec)) {
		link = location_rec.Link ();
		dir = location_rec.Dir ();
		offset = UnRound (location_rec.Offset ());

		setback = UnRound (location_rec.Setback ());
		side = location_side;

		if (setback > side) side = setback;

		link_ptr = &link_array [link];

		if (lanes_flag) {
			bool dir_flag;
			int center, num_lanes;
			Dir_Data *dir_ptr;

			if (dir == 0) {
				index = link_ptr->AB_Dir ();
				dir_flag = (link_ptr->BA_Dir () >= 0);
			} else {
				index = link_ptr->BA_Dir ();
				dir_flag = (link_ptr->AB_Dir () >= 0);
			}
			if (index >= 0) {
				dir_ptr = &dir_array [index];
				num_lanes = dir_ptr->Lanes () + dir_ptr->Left () + dir_ptr->Right ();
			} else {
				num_lanes = 0;
			}
			if (center_flag && !dir_flag) {
				center = num_lanes + 1;
			} else {
				center = 1;
			}
			side += (2 * num_lanes - center) * lane_width / 2.0;
		}
		Link_Shape (link_ptr, dir, points, offset, 0.0, side);

		//---- save the location point data ----

		map_stat = location_pt.insert (Point_Map_Data (location_rec.Location (), points [0]));

		if (!map_stat.second) {
			Warning ("Duplicate Location Record = ") << location_rec.Location ();
		}
		return (true);
	}
	return (false);
}
コード例 #3
0
bool ArcNet::Location_Processing (Db_File *fh)
{
	int link, dir;
	double offset;

	XYZ_Point *pt_ptr;
	Offset_Data offset_rec;
	Link_Data *link_ptr;
	Location_Data *location_ptr;

	Location_File *file = (Location_File *) fh;

	if (First_Record ()) {
		arcview_location.Num_Points (1);

		if (!location_offset.Max_Records (file->Num_Records ())) {
			Error ("Insufficient Memory for Location Points");
		}
	}

	if (Network_Service::Location_Processing (file)) {
		arcview_location.Copy_Fields (file);

		location_ptr = location_data.New_Record ();

		link = location_ptr->Link ();
		dir = location_ptr->Dir ();
		offset = UnRound (location_ptr->Offset ());		

		link_ptr = link_data.Get (link);

		Link_Shape (link_ptr, dir, &points, offset, 0.0, location_side);

		pt_ptr = points [1];

		arcview_location.points.Set (1, pt_ptr);

		if (!arcview_location.Write_Record ()) {
			Error ("Writing ArcView Activity Location File");
		}

		//---- save the location offset data ----

		offset_rec.ID (location_ptr->ID ());
		offset_rec.Link (link);
		offset_rec.Dir (dir);
		offset_rec.Offset (offset);
		offset_rec.X (pt_ptr->x);
		offset_rec.Y (pt_ptr->y);
		offset_rec.Z (pt_ptr->z);

		if (!location_offset.Add (&offset_rec)) {
			Error ("Saving Activity Location Offsets");
		}
	}
	return (false);
}
コード例 #4
0
bool ArcPlan::Get_Parking_Data (Parking_File &file, Parking_Data &parking_rec)
{
	int link, dir, index;
	double offset, side;

	Point_Map_Stat map_stat;
	Link_Data *link_ptr;

	if (Data_Service::Get_Parking_Data (file, parking_rec)) {
		if (!file.Nested ()) {
			link = parking_rec.Link ();
			dir = parking_rec.Dir ();
			offset = UnRound (parking_rec.Offset ());
			side = parking_side;

			link_ptr = &link_array [link];

			if (lanes_flag) {
				bool dir_flag;
				int center, num_lanes;
				Dir_Data *dir_ptr;

				if (dir == 0) {
					index = link_ptr->AB_Dir ();
					dir_flag = (link_ptr->BA_Dir () >= 0);
				} else {
					index = link_ptr->BA_Dir ();
					dir_flag = (link_ptr->AB_Dir () >= 0);
				}
				if (index >= 0) {
					dir_ptr = &dir_array [index];
					num_lanes = dir_ptr->Lanes () + dir_ptr->Left () + dir_ptr->Right ();
				} else {
					num_lanes = 0;
				}
				if (center_flag && !dir_flag) {
					center = num_lanes + 1;
				} else {
					center = 1;
				}
				side += (2 * num_lanes - center) * lane_width / 2.0;
			}
			Link_Shape (link_ptr, dir, points, offset, 0.0, side);

			//---- save the parking point data ----

			map_stat = parking_pt.insert (Point_Map_Data (parking_rec.Parking (), points [0]));

			if (!map_stat.second && file.Version () > 40) {
				Warning ("Duplicate Parking Record = ") << parking_rec.Parking ();
			}
		}
		return (true);
	}
	return (false);
}
コード例 #5
0
ファイル: Stop_Process.cpp プロジェクト: kravitz/transims4
bool SideFriction::Stop_Processing (Db_File *fh)
{
	int link, dir;
	double offset;

	XYZ_Point *pt_ptr;
	Offset_Data offset_rec;
	Link_Data *link_ptr;
	Stop_Data *stop_ptr;

	Stop_File *file = (Stop_File *) fh;

	if (First_Record () && subarea_flag) {
		if (!stop_offset.Max_Records (file->Num_Records ())) {
			Error ("Insufficient Memory for Transit Stop Points");
		}
	}

	if (Network_Service::Stop_Processing (file)) {
		if (subarea_flag) {
			stop_ptr = stop_data.New_Record ();

			link = stop_ptr->Link ();
			dir = stop_ptr->Dir ();
			offset = UnRound (stop_ptr->Offset ());		

			link_ptr = link_data.Get (link);

			Link_Shape (link_ptr, dir, &points, offset, 0.0, 2.0);

			pt_ptr = points [1];

			//---- save the stop offset data ----

			offset_rec.ID (stop_ptr->ID ());
			offset_rec.Link (link);
			offset_rec.Dir (dir);
			offset_rec.Offset (offset);
			offset_rec.X (pt_ptr->x);
			offset_rec.Y (pt_ptr->y);
			offset_rec.Z (pt_ptr->z);

			if (!stop_offset.Add (&offset_rec)) {
				Error ("Saving Transit Stop Offsets");
			}
		}
		return (true);
	}
	return (false);
}
コード例 #6
0
ファイル: Write_Route.cpp プロジェクト: kravitz/transims4
void ArcPlan::Write_Route (Offset_Data *org_ptr, Offset_Data *des_ptr)
{
	int i, j, route, num_legs, stop, link_dir, dir;
	int start_link_dir, end_link_dir;
	double offset, length, link_len, side;
	bool offset_flag, board, alight;

	Link_Data *link_ptr;
	Line_Data *line_ptr;
	Driver_Data *driver_ptr;
	Offset_Data *stop_ptr;

	offset_flag = (route_offset != 0.0);
	side = 0.0;

	//---- get the route data ----

	route = plan_file.Route ();

	line_ptr = line_data.Get (route);

	if (line_ptr == NULL) {
		Warning ("Transit Route %d was Not Found", route);
		return;
	}
	board = alight = false;

	//---- create the route shape ----

	if (driver_flag) {

		//---- get the start and end link offsets ----

		start_link_dir = org_ptr->Link_Dir ();
		end_link_dir = des_ptr->Link_Dir ();
	
		//---- get the route links ----

		driver_ptr = driver_data [line_ptr->Driver ()];

		num_legs = driver_ptr->Links ();

		//---- create transit legs ----

		for (i=1; i <= num_legs; i++) {

			dir = driver_ptr->Dir (i);
			link_dir = driver_ptr->Link_Dir (i);

			link_ptr = link_data.Get (driver_ptr->Link (i));

			link_len = UnRound (link_ptr->Length ());

			length = link_len - 2 * route_offset;

			if (dir == 0) {
				offset = route_offset;
			} else {
				offset = link_len - route_offset;
			}

			if (!board) {
				if (start_link_dir != link_dir) continue;

				offset = org_ptr->Offset ();

				if (dir == 0) {
					length = link_len - offset - route_offset;
				} else {
					length = offset - route_offset;
				}
			}

			if (end_link_dir == link_dir) {
				alight = true;

				if (dir == 0) {
					length = des_ptr->Offset () - offset;
				} else {
					length = offset - des_ptr->Offset ();
				}
			}

			if (offset_flag) {
				if (link_ptr->AB_Dir () > 0 && link_ptr->BA_Dir () > 0) {
					side = route_offset;
				} else {
					side = 0.0;
				}
			}

			Link_Shape (link_ptr, dir, &points, offset, length, side);

			//---- draw the link segment ----

			if (side == 0.0 && !board) {
				j = 2;
			} else {
				j = 1;
			}
			for (; j <= points.Num_Points (); j++) {
				if (!arcview_plan.points.Add (points [j])) goto point_error;
			}
			board = true;
			if (alight == true) break;
		}

	} else {

		for (i=1; i <= line_ptr->Stops (); i++) {
			stop = line_ptr->Stop (i);

			if (!board) {
				if (org_ptr->ID () != stop) continue;
				board = true;
				stop_ptr = org_ptr;
			} else {
				stop_ptr = stop_offset.Get (stop);
				if (stop_ptr == NULL) goto stop_error;
			}
			link_ptr = link_data.Get (stop_ptr->Link ());

			offset = stop_ptr->Offset ();

			if (offset_flag) {
				if (link_ptr->AB_Dir () > 0 && link_ptr->BA_Dir () > 0) {
					side = route_offset;
				} else {
					side = 0.0;
				}
			}
			Link_Shape (link_ptr, stop_ptr->Dir (), &points, offset, 0.0, side);

			if (!arcview_plan.points.Add (points [1])) goto point_error;

			if (des_ptr->ID () == stop) {
				alight = true;
				break;
			}
		}
	}
	if (board == false || alight == false) {
		Warning ("Stops %d to %d were Not Found on Route %d", org_ptr->ID (), des_ptr->ID (), route);
	}
	return;

point_error:
	Error ("Insufficient Memory for %d Points", arcview_plan.points.Num_Points ());

stop_error:
	Warning ("Route %d Stop %d was Not Found in the Stop File", line_ptr->Route (), stop);

}
コード例 #7
0
ファイル: Get_Problem_Data.cpp プロジェクト: qingswu/Transim
bool ArcPlan::Get_Problem_Data (Problem_File &file, Problem_Data &problem_rec, int partition)
{
	Location_Data *loc_ptr;
	Trip_Index trip_index;

	if (Data_Service::Get_Problem_Data (file, problem_rec, partition)) {
		if (select_problems && !problem_range.In_Range (problem_rec.Problem ())) return (false);
		if (select_households && !hhold_range.In_Range (problem_rec.Household ())) return (false);
		if (problem_rec.Mode () < MAX_MODE && !select_mode [problem_rec.Mode ()]) return (false);
		if (select_purposes && !purpose_range.In_Range (problem_rec.Purpose ())) return (false);
		if (select_start_times && !start_range.In_Range (problem_rec.Start ())) return (false);
		if (select_end_times && !end_range.In_Range (problem_rec.End ())) return (false);
		if (select_origins && !org_range.In_Range (file.Origin ())) return (false);
		if (select_destinations && !des_range.In_Range (file.Destination ())) return (false);

		if (select_org_zones) {
			loc_ptr = &location_array [problem_rec.Origin ()];
			if (!org_zone_range.In_Range (loc_ptr->Zone ())) return (false);
		}
		if (select_des_zones) {
			loc_ptr = &location_array [problem_rec.Destination ()];
			if (!des_zone_range.In_Range (loc_ptr->Zone ())) return (false);
		}
		if (select_travelers && !traveler_range.In_Range (problem_rec.Type ())) return (false);

		//---- check the selection records ----

		if (System_File_Flag (SELECTION)) {
			Select_Map_Itr sel_itr;

			sel_itr = select_map.Best (problem_rec.Household (), problem_rec.Person (), problem_rec.Tour (), problem_rec.Trip ());
			if (sel_itr == select_map.end ()) return (false);
		}

		//---- draw the problem record ----

		if (problem_out) {
			XYZ_Point point;

			arcview_problem.clear ();
			arcview_problem.Copy_Fields (file);

			if (problem_method == 3) {
				if (file.Link () > 0 && problem_rec.Dir_Index () >= 0) {
					int lane, center;
					double side;

					Dir_Data *dir_ptr = &dir_array [problem_rec.Dir_Index ()];
					Link_Data *link_ptr = &link_array [dir_ptr->Link ()];

					lane = problem_rec.Lane () + 1;

					if (center_flag) {
						if (link_ptr->BA_Dir () < 0) {
							center = dir_ptr->Left () + dir_ptr->Lanes () + dir_ptr->Right () + 1;
						} else if (link_ptr->AB_Dir () < 0) {
							center = dir_ptr->Left () + dir_ptr->Lanes () + dir_ptr->Right () + 1;
						} else {
							center = 1;
						}
					} else {
						center = 1;
					}
					side = (2 * lane - center) * lane_width / 2.0;

					Link_Shape (link_ptr, dir_ptr->Dir (), points, UnRound (problem_rec.Offset ()), 0.0, side);

					arcview_problem.assign (1, points [0]);
				} else {
					loc_ptr = &location_array [problem_rec.Origin ()];
					point.x = UnRound (loc_ptr->X ());
					point.y = UnRound (loc_ptr->Y ());

					arcview_problem.push_back (point);
				}
			} else if (problem_method < 2) {
				loc_ptr = &location_array [problem_rec.Origin ()];
				point.x = UnRound (loc_ptr->X ());
				point.y = UnRound (loc_ptr->Y ());

				arcview_problem.push_back (point);
			}
			if (problem_method != 1) {
				loc_ptr = &location_array [problem_rec.Destination ()];
				point.x = UnRound (loc_ptr->X ());
				point.y = UnRound (loc_ptr->Y ());

				arcview_problem.push_back (point);
			}
			if (!arcview_problem.Write_Record ()) {
				Error (String ("Writing %s") % arcview_problem.File_Type ());
			}
			num_problem++;
		}

		//---- save the problem index ----

		if (plan_flag) {
			trip_index.Set (problem_rec.Household (), problem_rec.Person (), problem_rec.Tour (), problem_rec.Trip ());

			problem_map.insert (Trip_Map_Data (trip_index, problem_rec.Problem ()));
		}
	}
	return (false);
}
コード例 #8
0
ファイル: Draw_Route.cpp プロジェクト: kravitz/transims5
void ArcNet::Draw_Route (void)
{
	int i, j, num_legs, stop, stops, link_dir, dir_index, dir, overlap, runs;
	int route_field, stops_field, mode_field, type_field, name_field, notes_field;
	double offset, length, stop_off, link_len, side, side_offset;
	bool offset_flag;

	Db_Base *file;
	
	file = System_File_Base (TRANSIT_ROUTE);

	route_field = file->Required_Field (ROUTE_FIELD_NAMES);
	stops_field = file->Required_Field ("STOPS", "NSTOPS", "NUM_STOPS");
	mode_field = file->Required_Field (MODE_FIELD_NAMES);
	type_field = file->Optional_Field ("TYPE", "VEHTYPE", "VEH_TYPE");
	name_field = file->Optional_Field ("NAME", "ROUTE_NAME", "RTNAME", "DESCRIPTION");
	notes_field = file->Optional_Field ("NOTES");

	Link_Data *link_ptr;
	Dir_Data *dir_ptr;
	Link_Itr link_itr;
	Line_Itr line_itr;
	XYZ_Point point;
	Int_Map_Itr map_itr;
	Points_Itr pt_itr;
	Point_Map_Itr stop_pt_itr;
	Line_Stop_Itr stop_itr;
	Line_Run_Itr run_itr;
	Stop_Data *stop_ptr;

	Show_Message ("Draw Transit Route -- Record");
	Set_Progress ();

	offset_flag = (route_offset != 0.0);
	side = 0.0;
	stop = 1;

	//---- set the overlap count ----

	if (!overlap_flag) {
		for (link_itr = link_array.begin (); link_itr != link_array.end (); link_itr++) {
			link_itr->Aoffset (0);
			link_itr->Boffset (0);
		}
	}

	//---- process each transit route ----

	for (line_itr = line_array.begin (); line_itr != line_array.end (); line_itr++) {
		Show_Progress ();

		stops = (int) line_itr->size ();

		arcview_route.Put_Field (route_field, line_itr->Route ());
		arcview_route.Put_Field (mode_field, line_itr->Mode ());
		arcview_route.Put_Field (type_field, line_itr->Type ());
		arcview_route.Put_Field (stops_field, stops);
		arcview_route.Put_Field (name_field, line_itr->Name ());
		arcview_route.Put_Field (notes_field, line_itr->Notes ());

		stop_itr = line_itr->begin ();

		arcview_route.Put_Field ("NUM_RUNS", (int) stop_itr->size ());

		//---- save the number of runs in each period ----

		if (schedule_flag) {
			for (i=1; i <= sched_breaks.Num_Ranges (); i++) {
				runs = 0;

				for (run_itr = stop_itr->begin (); run_itr != stop_itr->end (); run_itr++) {
					if (sched_breaks.In_Index (Resolve (run_itr->Schedule ())) == i) {
						runs++;
					}
				}
				arcview_route.Put_Field (run_field + i, runs);
			}
		}

		//---- create the route shape ----

		arcview_route.clear ();

		if (driver_flag) {

			num_legs = (int) line_itr->driver_array.size ();

			arcview_route.Put_Field ("NUM_LINKS", num_legs);

			//---- find the end index ----

			stop_itr = --(line_itr->end ());

			stop_ptr = &stop_array [stop_itr->Stop ()];

			map_itr = dir_map.find (stop_ptr->Link_Dir ());
			dir_index = map_itr->second;

			for (i=num_legs - 1; i >= 0; i--) {
				if (dir_index == line_itr->driver_array [i]) break;
			}
			if (i < 0) goto path_error;

			num_legs = i;

			//---- find the start index ----

			stop_itr = line_itr->begin ();

			stop_ptr = &stop_array [stop_itr->Stop ()];

			map_itr = dir_map.find (stop_ptr->Link_Dir ());
			dir_index = map_itr->second;

			for (i=0; i <= num_legs; i++) {
				if (dir_index == line_itr->driver_array [i]) break;
			}
			if (i > num_legs) goto path_error;

			//---- create transit legs ----

			for (j=1; i <= num_legs; i++) {
				dir_index = line_itr->driver_array [i];

				dir_ptr = &dir_array [dir_index];

				dir = dir_ptr->Dir ();
				link_dir = dir_ptr->Link_Dir ();

				link_ptr = &link_array [dir_ptr->Link ()];
				
				link_len = UnRound (link_ptr->Length ());
				side_offset = route_offset;

				if (offset_flag) {
					if (!overlap_flag) {
						if (dir == 0) {
							overlap = link_ptr->Aoffset () + 1;
							link_ptr->Aoffset (overlap);
						} else {
							overlap = link_ptr->Boffset () + 1;
							link_ptr->Boffset (overlap);
						}
						side = side_offset *= overlap;
					} else if (link_ptr->AB_Dir () >= 0 && link_ptr->BA_Dir () >= 0) {
						side = side_offset;
					} else {
						side = 0.0;
					}
				}
				if (side_offset > link_len / 3.0) {
					side_offset = link_len / 3.0;
				}
				offset = side_offset;

				//---- check for stops ----

				while (stop_ptr->Link_Dir () == link_dir) {

					stop_off = UnRound (stop_ptr->Offset ());
					length = stop_off - offset;

					Link_Shape (link_ptr, dir, points, offset, length, side);

					offset = stop_off;

					if (j != 1) {

						//---- draw the link to the stop ----

						pt_itr = points.begin ();

						if (side == 0.0 && pt_itr != points.end ()) {
							pt_itr++;
						}
						for (; pt_itr != points.end (); pt_itr++) {
							arcview_route.push_back (*pt_itr);
						}
						pt_itr = --points.end ();
					} else {
						pt_itr = points.begin ();
					}
					stop_pt_itr = stop_pt.find (stop_ptr->Stop ());

					if (stop_pt_itr != stop_pt.end ()) {
						arcview_route.push_back (stop_pt_itr->second);
					}

					//---- find the next stop -----

					if (++j > stops) break;

					arcview_route.push_back (*pt_itr);

					stop_itr++;

					stop = stop_itr->Stop ();

					stop_ptr = &stop_array [stop];
				}

				//---- complete the link ----

				if (i < num_legs) {
					length = link_len - offset - side_offset;

					Link_Shape (link_ptr, dir, points, offset, length, side);

					pt_itr = points.begin ();

					if (!offset_flag) {
						pt_itr++;
					}
					for (; pt_itr != points.end (); pt_itr++) {
						arcview_route.push_back (*pt_itr);
					}
				}
			}

		} else {

			for (stop_itr = line_itr->begin (); stop_itr != line_itr->end (); stop_itr++) {
				stop_ptr = &stop_array [stop_itr->Stop ()];

				stop_pt_itr = stop_pt.find (stop_ptr->Stop ());
				if (stop_pt_itr == stop_pt.end ()) goto stop_error;

				arcview_route.push_back (stop_pt_itr->second);
			}
		}

		if (!arcview_route.Write_Record ()) {
			Error (String ("Writing %s") % arcview_route.File_Type ());
		}
	}
	End_Progress ();

	arcview_route.Close ();
	return;

stop_error:
	Error (String ("Route %d Stop %d was Not Found in the Stop File") % line_itr->Route () % stop);
	
path_error:
	Error (String ("Route %d Stop %d was Not Found on Driver Path") % line_itr->Route () % stop_ptr->Stop ());

}
コード例 #9
0
ファイル: Read_Problem.cpp プロジェクト: kravitz/transims4
void ArcPlan::Read_Problem (void)
{
	int problem, traveler, hhold, person, link, dir;
	double offset;

	Link_Data *link_ptr;

	Show_Message ("Reading %s -- Record", problem_file.File_Type ());
	Set_Progress (10000);

	//---- read each problem record ----

	while (problem_file.Read ()) {
		Show_Progress ();

		//---- check the problem type ----

		problem = problem_file.Problem ();
		if (problem < 1 || problem >= max_problem || !problem_type [problem]) continue;

		//---- check the household list ----

		if (hhlist_flag) {
			hhold = problem_file.Household ();

			if (hhold_list.Get (&hhold) == NULL) continue;
		}

		//---- output the problem details ----

		link = problem_file.Link ();

		if (problem_out && link != 0) {
			arcview_problem.Copy_Fields (&problem_file);

			dir = problem_file.Dir ();

			if (problem_file.LinkDir_Type () == LINK_SIGN) {
				if (link < 0) {
					link = -link;
					dir = 1;
				}
			}
			link_ptr = link_data.Get (link);

			if (link_ptr == NULL) {
				Write (1, "Warning: Problem Link %d was Not Found", link);
				continue;
			}

			//---- get the link direction ----

			if (problem_file.LinkDir_Type () == LINK_NODE) {

				if (dir == link_ptr->Anode ()) {
					dir = 1;
				} else if (dir == link_ptr->Bnode ()) {
					dir = 0;
				} else {
					Write (1, "Warning: Problem Node %d not on Link %d", dir, link);
					continue;
				}
			}
			offset = problem_file.Offset ();

			if (dir == 1) {
				offset = UnRound (link_ptr->Length ()) - offset;
			}

			Link_Shape (link_ptr, dir, &points, offset, 0.0, 0.0);

			arcview_problem.points.Set (1, points [1]);

			//Link_Shape (link_ptr, dir, &points, offset, 6.5, 0.0);
			//
			//Vehicle_Shape (*(points [1]), *(points [points.Num_Points ()]), 2.0, &arcview_problem.points);

			if (!arcview_problem.Write_Record ()) {
				Error ("Writing ArcView Problem File");
			}
			num_problem++;
		}

		hhold = problem_file.Household ();
		person = problem_file.Person ();

		traveler = hhold * Traveler_Scale () + person;

		if (problem_list.Get_Index (traveler) == 0) {
			problem_list.Add (traveler);
		}
	}
	End_Progress ();

	problem_file.Close ();
	arcview_problem.Close ();

	Print (2, "Number of Problem Records Read = %d", Progress_Count ());
	Print (1, "Number of Problem Travelers Saved = %d", problem_list.Num_Records ());
}
コード例 #10
0
ファイル: Write_Link_Path.cpp プロジェクト: kravitz/transims4
void ArcPlan::Write_Link_Path (Offset_Data *org_ptr, Offset_Data *des_ptr, bool veh_flag)
{
	int i, j, dir, num_links, *link, lnk;
	double offset, length, side, end_offset;
	bool offset_flag;

	Link_Data *link_ptr;

	offset_flag = (link_offset != 0.0);
	side = 0.0;

	//---- get the link list ----

	offset = org_ptr->Offset ();
	link = plan_file.Path (&num_links);

	for (i=1; i <= num_links; i++, link++) {
		if (*link < 0) {
			lnk = -(*link);
			dir = 1;
		} else {
			lnk = *link;
			dir = 0;
		}
		link_ptr = link_data.Get (lnk);

		if (link_ptr == NULL) {
			Warning ("Traveler %d Link %d was Not Found", plan_file.Traveler (), lnk);
			return;
		}
		length = UnRound (link_ptr->Length ());

		//---- process the origin offset ----

		if (i == 1) {
			if (org_ptr->Link () != lnk) {
				Warning ("Traveler %d Link %d does not match Origin Link %d", 
					plan_file.Traveler (), lnk, org_ptr->Link ());
				return;
			}
			if (i == num_links) {
				if (des_ptr->Link () != lnk) goto des_error;

				end_offset = des_ptr->Offset ();

				if (dir == 0) {
					length = end_offset - offset;
					if (length == 0.0) length = 0.1;
				} else {
					length = offset - end_offset;
				}
			} else if (dir == 0) {
				length = length - offset - link_offset;
			} else {
				length = offset - link_offset;
			}

		} else if (i == num_links) {

			//---- process the destination offset ----

			if (des_ptr->Link () != lnk) goto des_error;

			end_offset = des_ptr->Offset ();

			if (dir == 0) {
				offset = link_offset;
				length = end_offset - offset;
			} else {
				offset = length - link_offset;
				length = length - end_offset - link_offset;
			}

		} else {

			if (dir == 0) {
				offset = link_offset;
			} else {
				offset = length - link_offset;
			}
			length -= 2 * link_offset;
		}

		//---- collect the points ----

		if (offset_flag) {
			if (link_ptr->AB_Dir () > 0 && link_ptr->BA_Dir () > 0) {
				side = link_offset;
			} else {
				side = 0.0;
			}
		}
		Link_Shape (link_ptr, dir, &points, offset, length, side);

		//---- draw the link segment ----

		if (side == 0.0 && i > 1) {
			j = 2;
		} else {
			j = 1;
		}
		for (; j <= points.Num_Points (); j++) {
			if (!arcview_plan.points.Add (points [j])) goto point_error;
		}
	}
	return;

point_error:
	Error ("Insufficient Memory for %d Points", arcview_plan.points.Num_Points ());

des_error:
	Warning ("Traveler %d Link %d does not match Destination Link %d", 
		plan_file.Traveler (), lnk, des_ptr->Link ());
}
コード例 #11
0
ファイル: Write_Bandwidth.cpp プロジェクト: kravitz/transims5
void ArcPlan::Write_Bandwidth (void)
{
	int dir_index, dir, link_field, dir_field, volume_field;
	double width, offset, length;

	XYZ_Point point;
	Int_Itr volume;
	Dir_Data *dir_ptr;
	Link_Data *link_ptr;

	link_field = arcview_width.Field_Number ("LINK");
	dir_field = arcview_width.Field_Number ("DIR");
	volume_field = arcview_width.Field_Number ("VOLUME");

	Show_Message (String ("Writing %s -- Record") % arcview_width.File_Type ());
	Set_Progress ();

	//---- process each link direction ----
	
	for (dir_index = 0, volume = width_data.begin (); volume != width_data.end (); volume++, dir_index++) {
		Show_Progress ();

		if (*volume == 0 || *volume < min_value) continue;

		//---- write the data fields ----

		dir_ptr = &dir_array [dir_index];
		link_ptr = &link_array [dir_ptr->Link ()];

		arcview_width.Put_Field (link_field, link_ptr->Link ());
		arcview_width.Put_Field (dir_field, dir_ptr->Dir ());
		arcview_width.Put_Field (volume_field, *volume);

		dir = dir_ptr->Dir ();

		width = *volume / width_factor;

		if (width < min_width) {
			width = min_width;
		} else if (width > max_width) {
			width = max_width;
		}
		width = -width;

		//---- retrieve the link information ----

		//length = UnRound (link_ptr->Length ());

		//if (dir == 0) {
		//	offset = 0.0;
		//} else {
		//	offset = length;
		//}
		offset = length = -1;

		//---- get the centerline points ----

		arcview_width.clear ();

		Link_Shape (link_ptr, dir, points, offset, length, 0.0);

		point = points [0];

		arcview_width.assign (points.begin (), points.end ());

		//---- get the outside points of the band ----

		//offset = length - offset;
		dir = 1 - dir;

		Link_Shape (link_ptr, dir, points, offset, length, width);

		if (max_angle > 0 && min_length > 0) {
			Smooth_Shape (points, max_angle, min_length);
		}

		arcview_width.insert (arcview_width.end (), points.begin (), points.end ());

		//---- close the polygon ----

		arcview_width.push_back (point);

		//---- write the shape record ----

		if (!arcview_width.Write_Record ()) {
			Error (String ("Writing %s") % arcview_width.File_Type ());
		}
		num_width++;
	}
	End_Progress ();

	arcview_width.Close ();
}
コード例 #12
0
ファイル: Read_Link_Data.cpp プロジェクト: kravitz/transims4
void ArcDelay::Read_Link_Data (void)
{
	int i, center, link, lane, num_lanes, num_rec;
	double length, side, start, width;
	bool offset_flag;

	XYZ_Point point, *ptr;
	Link_Data *link_ptr;
	Node_Data *node_ptr;
	Dir_Data *dir_ptr;

	offset_flag = (link_offset != 0.0);

	Show_Message ("Reading %s -- Record", arcview_link_data.File_Type ());
	Set_Progress (1000);
	num_rec = 0;

	//---- process each link ----

	while (link_data_file.Read ()) {
		Show_Progress ();

		//---- get the link ----

		link = link_data_file.Link ();

		link_ptr = link_data.Get (link);

		if (link_ptr == NULL) continue;

		//---- check the subarea polygon ----

		if (subarea_flag) {
			node_ptr = node_data.Get (link_ptr->Anode ());

			if (!In_Polygon (UnRound (node_ptr->X ()), UnRound (node_ptr->Y ()), &select_subarea.points)) {
				node_ptr = node_data.Get (link_ptr->Bnode ());

				if (!In_Polygon (UnRound (node_ptr->X ()), UnRound (node_ptr->Y ()), &select_subarea.points)) {
					continue;
				}
			}
		}

		//---- copy the data fields ----

		arcview_link_data.Copy_Fields (&link_data_file);

		arcview_link_data.parts.Reset ();
		arcview_link_data.points.Reset ();

		//---- bandwidth processing ----

		if (width_flag) {
			arcview_link_data.Get_Field (width_field, &width);
			if (width == 0.0) continue;

			if (width > 0) {
				width = width / width_factor;
			} else {
				width = -width / width_factor;
			}
			if (width < min_width) {
				width = min_width;
			} else if (width > max_width) {
				width = max_width;
			}
			width = -width;

			length = UnRound (link_ptr->Length ());

			//---- get the centerline points ----

			Link_Shape (link_ptr, 0, &points, 0.0, length, 0.0);

			ptr = points.First ();
			point = *ptr;
					
			if (!arcview_link_data.parts.Add (0)) goto mem_error;

			for (; ptr; ptr = points.Next ()) {
				if (!arcview_link_data.points.Add (ptr)) goto point_error;
			}

			//---- get the outside points of the band ----

			Link_Shape (link_ptr, 1, &points, length, length, width);

			if (max_angle > 0 && min_length > 0) {
				Smooth_Shape (&points, max_angle, min_length);
			}

			for (ptr = points.First (); ptr; ptr = points.Next ()) {
				if (!arcview_link_data.points.Add (ptr)) goto point_error;
			}

			//---- close the polygon ----

			if (!arcview_link_data.points.Add (&point)) goto point_error;

		} else {

			//---- draw lanes ----

			if (lanes_flag) {
				if (link_ptr->AB_Dir () > 0) {
					dir_ptr = dir_data [link_ptr->AB_Dir ()];
					if (dir_ptr == NULL) continue;

					length = UnRound (link_ptr->Length ());
					start = UnRound (link_ptr->Aoffset ());
					length -= start + UnRound (link_ptr->Boffset ());

					lane = dir_ptr->Left ();
					num_lanes = dir_ptr->Thru () + lane;

					//---- find the center point ----

					if (center_flag && link_ptr->BA_Dir () == 0) {
						center = num_lanes + dir_ptr->Right () + 1;
					} else {
						center = 1;
					}

					for (++lane; lane <= num_lanes; lane++) {
						side = (2 * lane - center) * lane_width / 2.0;

						Link_Shape (link_ptr, 0, &points, start, length, side);

						if (!arcview_link_data.parts.Add (arcview_link_data.points.Num_Points ())) goto mem_error;

						for (i=1; i <= points.Num_Points (); i++) {
							if (!arcview_link_data.points.Add (points [i])) goto mem_error;
						}
					}
				}
				if (link_ptr->BA_Dir () > 0) {
					dir_ptr = dir_data [link_ptr->BA_Dir ()];
					if (dir_ptr == NULL) continue;

					length = UnRound (link_ptr->Length ());
					start = length - UnRound (link_ptr->Boffset ());
					length = start - UnRound (link_ptr->Aoffset ());

					lane = dir_ptr->Left ();
					num_lanes = dir_ptr->Thru () + lane;

					//---- find the center point ----

					if (center_flag && link_ptr->AB_Dir () == 0) {
						center = num_lanes + dir_ptr->Right () + 1;
					} else {
						center = 1;
					}

					for (++lane; lane <= num_lanes; lane++) {
						side = (2 * lane - center) * lane_width / 2.0;

						Link_Shape (link_ptr, 1, &points, start, length, side);

						if (!arcview_link_data.parts.Add (arcview_link_data.points.Num_Points ())) goto mem_error;

						for (i=1; i <= points.Num_Points (); i++) {
							if (!arcview_link_data.points.Add (points [i])) goto mem_error;
						}
					}
				}

			} else {

				if (offset_flag) {

					//---- draw link in AB direction ----

					if (link_ptr->AB_Dir () > 0) {
						if (center_flag && link_ptr->BA_Dir () == 0) {
							side = 0.0;
						} else {
							side = link_offset;
						}
						Link_Shape (link_ptr, 0, &points, 0.0, -1.0, side);

						if (!arcview_link_data.parts.Add (0)) goto mem_error;

						for (i=1; i <= points.Num_Points (); i++) {
							if (!arcview_link_data.points.Add (points [i])) goto mem_error;
						}
					}

					//---- draw link in BA direciton ----

					if (link_ptr->BA_Dir () > 0) {
						if (center_flag && link_ptr->AB_Dir () == 0) {
							side = 0.0;
						} else {
							side = link_offset;
						}
						Link_Shape (link_ptr, 1, &points, -1.0, -1.0, side);

						if (!arcview_link_data.parts.Add (arcview_link_data.points.Num_Points ())) goto mem_error;

						for (i=1; i <= points.Num_Points (); i++) {
							if (!arcview_link_data.points.Add (points [i])) goto mem_error;
						}
					}

				} else {
					
					//---- draw centerline -----

					if (!arcview_link_data.parts.Add (0)) goto mem_error;

					Link_Shape (link_ptr, 0, &arcview_link_data.points);
				}
			}
		}

		//---- save the link record ----

		if (!arcview_link_data.Write_Record ()) {
			Error ("Writing %s", arcview_link_data.File_Type ());
		}
		num_rec++;
	}
	End_Progress ();
	arcview_link_data.Close ();

	Print (2, "Number of Arcview Link Data Records = %d", num_rec);
	return;

point_error:
	Error ("Insufficient Memory for %d Points", arcview_link_data.points.Num_Points ());

mem_error:
	Error ("Insufficient Memory for Link Shape Points");
}
コード例 #13
0
ファイル: Write_Driver.cpp プロジェクト: kravitz/transims4
void ArcNet::Write_Driver (void)
{
	int i, j, dir, overlap;
	int route_field, links_field, type_field, subtype_field, notes_field;
	double offset, length, side, side_offset;
	bool offset_flag, first;

	Link_Data *link_ptr;
	Driver_Data *driver_ptr;
	Db_Base *file;
	
	file = Network_Db_Base (TRANSIT_DRIVER);

	route_field = file->Required_Field ("ROUTE");
	links_field = file->Required_Field ("LINKS", "NLINKS", "NUM_LINKS");
	type_field = file->Optional_Field ("TYPE", "VEHTYPE", "VEH_TYPE");
	subtype_field = file->Optional_Field ("SUBTYPE", "SUB_TYPE");
	notes_field = file->Optional_Field ("NOTES");

	Show_Message ("Writing Transit Driver -- Record");
	Set_Progress (1000);

	offset_flag = (route_offset != 0.0);

	//---- set the overlap count ----

	if (!overlap_flag) {
		for (link_ptr = link_data.First (); link_ptr; link_ptr = link_data.Next ()) {
			link_ptr->Aoffset (0);
			link_ptr->Boffset (0);
		}
	}

	//---- process each transit route ----

	for (driver_ptr = driver_data.First (); driver_ptr; driver_ptr = driver_data.Next ()) {
		Show_Progress ();

		arcview_route.Put_Field (route_field, driver_ptr->Route ());
		arcview_route.Put_Field (type_field, driver_ptr->Type ());
		arcview_route.Put_Field (subtype_field, driver_ptr->Sub_Type ());
		arcview_route.Put_Field (links_field, driver_ptr->Links ());
		//arcview_route.Put_Field (notes_field, (char *) driver_ptr->Notes ());

		arcview_route.points.Reset ();
		first = true;

		for (i=1; i <= driver_ptr->Links (); i++) {

			link_ptr = link_data.Get (driver_ptr->Link (i));
			dir = driver_ptr->Dir (i);

			offset = length = UnRound (link_ptr->Length ());
			side_offset = route_offset;

			if (side_offset > length / 3.0) {
				side_offset = length / 3.0;
			}
			if (offset_flag) {
				if (!overlap_flag) {
					if (dir == 0) {
						overlap = link_ptr->Aoffset () + 1;
						link_ptr->Aoffset (overlap);
					} else {
						overlap = link_ptr->Boffset () + 1;
						link_ptr->Boffset (overlap);
					}
					side = side_offset = route_offset * overlap;

					if (side_offset > length / 3.0) {
						side_offset = length / 3.0;
					}
					offset -= side_offset;
					length -= 2.0 * side_offset;
				} else {
					offset -= side_offset;
					length -= 2.0 * side_offset;

					if (link_ptr->AB_Dir () > 0 && link_ptr->BA_Dir () > 0) {
						side = side_offset;
					} else {
						side = 0.0;
					}
				}
				j = 1;
			} else if (first) {
				j = 1;
				first = false;
			} else {
				j = 2;
			}
			if (dir == 0) {
				Link_Shape (link_ptr, 0, &points, side_offset, length, side);
			} else {
				Link_Shape (link_ptr, 1, &points, offset, length, side);
			}
			for (; j <= points.Num_Points (); j++) {
				if (!arcview_route.points.Add (points [j])) {
					Error ("Insufficient Memory for Transit Driver Shape Points");
				}
			}
		}

		if (!arcview_route.Write_Record ()) {
			Error ("Writing ArcView Transit Driver File");
		}
	}
	End_Progress ();

	arcview_route.Close ();
}
コード例 #14
0
ファイル: Draw_Link.cpp プロジェクト: qingswu/Transim
void ArcPerf::Draw_Link (Arcview_File &file, Link_Data *link_ptr, int dir)
{
	int lane, center, num_lanes, index;
	double length, side, start, width, offset;
	bool dir_flag, two_way;

	XYZ_Point point;
	Dir_Data *dir_ptr;

	if (link_ptr->Length () == 0) return;

	file.clear ();
	file.parts.clear ();

	two_way = (dir == 2);
	if (two_way) dir = 0;

	//---- bandwidth processing ----

	if (bandwidth_flag) {
		width = file.Get_Double (width_field);
		if (width < 0) width = -width;
		if (width < min_value || width == 0) return;

		width = width / width_factor;

		if (width < min_width) {
			width = min_width;
		} else if (width > max_width) {
			width = max_width;
		}
		width = -width;
		offset = length = -1;

		//---- get the centerline points ----

		side = (two_way) ? (-width / 2.0) : 0.0;

		Link_Shape (link_ptr, dir, points, offset, length, side);

		point = points [0];
				
		file.parts.push_back ((int) file.size ());
		file.assign (points.begin (), points.end ());

		//---- get the outside points of the band ----

		side = (two_way) ? (width / 2.0) : width;

		Link_Shape (link_ptr, 1 - dir, points, offset, length, side);

		if (max_angle > 0 && min_length > 0) {
			Smooth_Shape (points, max_angle, min_length);
		}

		file.insert (file.end (), points.begin (), points.end ());

		//---- close the polygon ----

		file.push_back (point);

	} else {

		//---- draw lanes ----

		if (lanes_flag) {
repeat1:				
			length = UnRound (link_ptr->Length () - link_ptr->Aoffset () - link_ptr->Boffset ());
			width = lane_width / 2.0;

			if (dir) {
				index = link_ptr->BA_Dir ();
				start = UnRound (link_ptr->Boffset ());
				dir_flag = (link_ptr->AB_Dir () >= 0);
			} else {
				index = link_ptr->AB_Dir ();
				start = UnRound (link_ptr->Aoffset ());
				dir_flag = (link_ptr->BA_Dir () >= 0);
			}

			if (index >= 0) {
				dir_ptr = &dir_array [index];
				num_lanes = dir_ptr->Lanes () + dir_ptr->Left ();

				if (center_flag && !dir_flag) {
					center = num_lanes + dir_ptr->Right () + 1;
				} else {
					center = 1;
				}
				for (lane = dir_ptr->Left (); lane < num_lanes; lane++) {
					side = (2 + 2 * lane - center) * width;

					Link_Shape (link_ptr, dir, points, start, length, side);

					file.parts.push_back ((int) file.size ());

					if (arrow_flag) Add_Arrow (points);

					file.insert (file.end (), points.begin (), points.end ());
				}
			}
			if (two_way && dir == 0) {
				dir = 1;
				goto repeat1;
			}

		} else {

			if (link_offset != 0.0) {
repeat2:
				//---- draw each direction ----

				side = link_offset;

				if (dir) {
					index = link_ptr->BA_Dir ();
					if (center_flag && link_ptr->AB_Dir () < 0) side = 0.0;
					start = -1.0;
				} else {
					index = link_ptr->AB_Dir ();
					if (center_flag && link_ptr->BA_Dir () < 0) side = 0.0;
					start = 0.0;
				}
				if (index >= 0) {
					Link_Shape (link_ptr, dir, points, start, -1.0, side);

					file.parts.push_back ((int) file.size ());

					if (arrow_flag) Add_Arrow (points);

					file.insert (file.end (), points.begin (), points.end ());
				}
				if (two_way && dir == 0) {
					dir = 1;
					goto repeat2;
				}

			} else {
					
				//---- draw centerline -----

				file.parts.push_back ((int) file.size ());

				if (direction_flag) dir = 0;

				Link_Shape (link_ptr, dir, file);

				if (arrow_flag) Add_Arrow (file);
			}
		}
	}

	//---- write the shape record ----

	if (file.size () == 0) return;

	if (!file.Write_Record ()) {
		Error (String ("Writing %s") % file.File_Type ());
	}
}
コード例 #15
0
ファイル: Read_Locations.cpp プロジェクト: kravitz/transims5
bool Data_Service::Get_Location_Data (Location_File &file, Location_Data &location_rec)
{
	int link, dir, offset;
	double setback;
	Link_Data *link_ptr;

	//---- read and save the data ----

	location_rec.Location (file.Location ());

	if (location_rec.Location () == 0) return (false);

	//---- check/convert the link number and direction  ----
	
	link = file.Link ();
	dir = file.Dir ();
	offset = Round (file.Offset ());

	link_ptr = Set_Link_Direction (file, link, dir, offset);

	location_rec.Link (link);
	location_rec.Dir (dir);
	location_rec.Offset (offset);

	setback = file.Setback ();
	location_rec.Setback (setback);

	if (Location_XY_Flag ()) {
		Points points;

		Link_Shape (link_ptr, dir, points, UnRound (offset), 0.0, setback);

		if (points.size () > 0) {
			location_rec.X (points [0].x);
			location_rec.Y (points [0].y);
		} else {
			Node_Data *node_ptr = &node_array [link_ptr->Anode ()];
		
			location_rec.X (node_ptr->X ());
			location_rec.Y (node_ptr->Y ());
		}
	}
	location_rec.Zone (file.Zone ());

	if (location_rec.Zone () > 0 && System_Data_Flag (ZONE)) {
		Int_Map_Itr map_itr = zone_map.find (location_rec.Zone ());
		if (map_itr == zone_map.end ()) {
			Warning (String ("Location %d Zone %d was Not Found") % location_rec.Location () % location_rec.Zone ());
			return (false);
		}
		location_rec.Zone (map_itr->second);
	} else if (location_rec.Zone () == 0) {
		location_rec.Zone (-1);

		//---- delete extra activity location used for transit stops ----

		if (file.Version () <= 40) return (false);
	}
	location_rec.Notes (file.Notes ());

	return (true);
}
コード例 #16
0
ファイル: New_Links.cpp プロジェクト: kravitz/transims5
void ExportNet::New_Links (void)
{
	int i, node, link, new_link, count, length, index, park_len, speed, time, dir;
	double offset, len, factor;

	Int_Map_Itr map_itr;
	Link_Data link_data, link_rec;
	Split_Itr split_itr, split2_itr;
	Link_Split_Itr link_itr;
	Points points;
	Dir_Data dir_ab, dir_ba, dir_rec;
	Shape_Data shape_rec;
	Points_Itr pt_itr;
	XYZ xyz;
	
	park_len = Round (Internal_Units (20, METERS)); 
	speed = Round (Internal_Units (5, MPS));
	time = Round (Internal_Units (20/5, SECONDS));

	map_itr = --link_map.end ();
	link = map_itr->first;
	new_link = ((link + 1) / 100 + 1) * 100;
	count = 0;

	//---- split links ----

	Set_Progress ();

	for (link=0, link_itr = link_splits.begin (); link_itr != link_splits.end (); link_itr++, link++) {
		if (link_itr->size () == 0) continue;
		Show_Progress ();

		link_data = link_array [link];

		if (link_data.AB_Dir () >= 0) {
			dir_ab = dir_array [link_data.AB_Dir ()];
		}
		if (link_data.BA_Dir () >= 0) {
			dir_ba = dir_array [link_data.BA_Dir ()];
		}
		offset = 0.0;

		for (split_itr = split2_itr = link_itr->begin (); split_itr != link_itr->end (); split2_itr = split_itr++) {
			link_rec = link_data;
			link_rec.Name (link_data.Name ());

			index = (int) link_array.size ();
			link_rec.Divided (3);

			split_itr->link = index;
			link_rec.Link (new_link++);

			if ((split_itr + 1) != link_itr->end ()) {
				link_rec.Bnode (split_itr->node);
				length = split_itr->offset;
				link_rec.Boffset (0);
			} else {
				length = link_rec.Length ();
			}
			if (split_itr != split2_itr) {
				link_rec.Anode (split2_itr->node);
				length -= split2_itr->offset;
				link_rec.Aoffset (0);
				offset = UnRound (split2_itr->offset);
			}
			len = UnRound (length);
			link_rec.Length (length);
			factor = (double) length / link_data.Length ();

			//---- split the link shape ----

			if (link_data.Shape () >= 0) {
				Link_Shape (&link_data, 0, points, offset, len);

				if (points.size () > 2) {
					shape_rec.Clear ();
					shape_rec.Link (link_rec.Link ());

					for (pt_itr = points.begin () + 1; pt_itr != points.end (); pt_itr++) {
						xyz.x = Round (pt_itr->x);
						xyz.y = Round (pt_itr->y);
						xyz.z = Round (pt_itr->z);

						shape_rec.push_back (xyz);
					}
					link_rec.Shape ((int) shape_array.size ());
					shape_map.insert (Int_Map_Data (shape_rec.Link (), link_rec.Shape ()));
					shape_array.push_back (shape_rec);
				} else {
					link_rec.Shape (-1);
				}
			}

			//---- process each direction ----

			if (link_data.AB_Dir () >= 0) {
				dir_rec = dir_ab;
				dir_rec.Link (index);
				dir_rec.First_Connect_From (-1);
				dir_rec.First_Connect_To (-1);

				if ((split_itr + 1) != link_itr->end ()) {
					dir_rec.First_Pocket (-1);
				}
				dir_rec.Time0 ((int) (dir_rec.Time0 () * factor + 0.5));

				dir = (int) dir_array.size ();
				link_rec.AB_Dir (dir);

				dir_map.insert (Int_Map_Data (dir_rec.Link_Dir (), dir));
				dir_array.push_back (dir_rec);
			} else {
				link_rec.AB_Dir (-1);
			}

			if (link_data.BA_Dir () >= 0) {
				dir_rec = dir_ba;
				dir_rec.Link (index);
				dir_rec.First_Connect_From (-1);
				dir_rec.First_Connect_To (-1);
			
				if (split_itr != split2_itr) {
					dir_rec.First_Pocket (-1);
				}
				dir_rec.Time0 ((int) (dir_rec.Time0 () * factor + 0.5));
				
				dir = (int) dir_array.size ();
				link_rec.BA_Dir (dir);

				dir_map.insert (Int_Map_Data (dir_rec.Link_Dir (), dir));
				dir_array.push_back (dir_rec);
			} else {
				link_rec.BA_Dir (-1);
			}

			//---- insert the link ----

			link_map.insert (Int_Map_Data (link_rec.Link (), index));
			link_array.push_back (link_rec);
			count++;
		}
	}

	//---- add parking connection links ----

	Set_Progress ();

	for (link=0, link_itr = link_splits.begin (); link_itr != link_splits.end (); link_itr++, link++) {
		if (link_itr->size () == 0) continue;
		Show_Progress ();

		for (split_itr = split2_itr = link_itr->begin (); split_itr != link_itr->end (); split2_itr = split_itr++) {

			for (i=0; i < 2; i++) {
				index = (int) link_array.size ();

				if (i == 0) {
					node = split_itr->park_ab;
					if (node < 0) continue;
					split_itr->link_ab = index;
				} else {
					node = split_itr->park_ba;
					if (node < 0) continue;
					split_itr->link_ba = index;
				}
				link_rec.Clear ();
				link_rec.Divided (3);

				link_rec.Link (new_link++);
				link_rec.Anode (split_itr->node);
				link_rec.Bnode (node);
				link_rec.Length (park_len);
				link_rec.Use (ANY);
				link_rec.Type (LOCAL);
				link_rec.Name ("Parking");
				
				//---- insert directional data ----

				dir_rec.Clear ();
				dir_rec.Link (index);
				dir_rec.Dir (0);
				dir_rec.Lanes (1);
				dir_rec.Speed (speed);
				dir_rec.Capacity (300);
				dir_rec.Time0 (time);
				dir_rec.Sign (YIELD_SIGN);

				dir = (int) dir_array.size ();
				link_rec.AB_Dir (dir);

				dir_map.insert (Int_Map_Data (dir_rec.Link_Dir (), dir));
				dir_array.push_back (dir_rec);

				dir_rec.Dir (1);
				dir_rec.Sign (NO_CONTROL);
			
				dir = (int) dir_array.size ();
				link_rec.BA_Dir (dir);

				dir_map.insert (Int_Map_Data (dir_rec.Link_Dir (), dir));
				dir_array.push_back (dir_rec);

				//---- insert the link ----

				link_map.insert (Int_Map_Data (link_rec.Link (), index));
				link_array.push_back (link_rec);
				count++;
			}
		}
	}
	Print (2, "Number of New Link Records = ") << count;
}
コード例 #17
0
bool ArcNet::Get_Lane_Use_Data (Lane_Use_File &file, Lane_Use_Data &lane_use_rec)
{
	int dir, center, lane, lane1, lane2, index, type, pocket;
	double length, offset, start, end, side, width, setbacka, setbackb, off, len;
	bool dir_flag, left_flag;

	Link_Data *link_ptr;
	Dir_Data *dir_ptr;
	Pocket_Data *pocket_ptr;
	Points_Itr pt_itr;

	if (Data_Service::Get_Lane_Use_Data (file, lane_use_rec)) {
		if (arcview_lane_use.Is_Open ()) {
			if (time_flag) {
				if (lane_use_rec.Start () > time || time > lane_use_rec.End ()) return (false);
			}
			arcview_lane_use.Copy_Fields (file);
				
			arcview_lane_use.parts.clear ();
			arcview_lane_use.clear ();

			dir_ptr = &dir_array [lane_use_rec.Dir_Index ()];
			dir = dir_ptr->Dir ();

			link_ptr = &link_array [dir_ptr->Link ()];

			offset = UnRound (lane_use_rec.Offset ());
			length = UnRound (lane_use_rec.Length ());

			if (offset == 0.0 && length == 0.0) {
				offset = 0.0;
				length = UnRound (link_ptr->Length ());
			}
			start = offset;
			end = start + length;

			length = UnRound (link_ptr->Length ());

			if (dir == 0) {
				setbacka = UnRound (link_ptr->Aoffset ());
				setbackb = UnRound (link_ptr->Boffset ());
				dir_flag = (link_ptr->BA_Dir () >= 0);
			} else {
				setbacka = UnRound (link_ptr->Boffset ());
				setbackb = UnRound (link_ptr->Aoffset ());
				dir_flag = (link_ptr->AB_Dir () >= 0);
			}
			if (start < setbacka) start = setbacka;

			side = length - setbackb;
			if (end > side) end = side;

			length = end - start;
			offset = start;

			//---- draw the lanes ----

			if (lanes_flag) {
				if (center_flag) {
					if (!dir_flag) {
						center = dir_ptr->Lanes () + dir_ptr->Left () + dir_ptr->Right () + 1;
					} else {
						center = 1;
					}
				} else {
					center = 1;
				}

				//---- set the lane range ----

				lane1 = lane_use_rec.Low_Lane ();
				lane2 = lane_use_rec.High_Lane ();

				width = lane_width / 2.0;

				for (lane = lane1; lane <= lane2; lane++) {
					side = (2 + 2 * lane - center) * width;
					left_flag = (lane < dir_ptr->Left ());
					off = offset;
					len = length;

					if (left_flag || lane >= (dir_ptr->Left () + dir_ptr->Lanes ())) {
						for (index = dir_ptr->First_Pocket (); index >= 0; index = pocket_ptr->Next_Index ()) {
							pocket_ptr = &pocket_array [index];

							type = pocket_ptr->Type ();
							pocket = pocket_ptr->Lanes ();

							if (type == LEFT_TURN || type == LEFT_MERGE) {
								if (!left_flag) continue;
								if (lane < (dir_ptr->Left () - pocket)) continue;
							} else {
								if (left_flag) continue;
								if (lane >= dir_ptr->Left () + dir_ptr->Lanes () + pocket) continue;
							}
							off = UnRound (pocket_ptr->Offset ());
							len = UnRound (pocket_ptr->Length ());

							if (off > end || (off + len) < start) continue;

							len += off;
							if (off < start) off = start;
							if (len > end) len = end;
							len -= off;
							if (len < 0) len = 0;
							break;
						}
						if (index < 0) continue;
					}
					Link_Shape (link_ptr, dir, points, off, len, side);

					arcview_lane_use.parts.push_back ((int) arcview_lane_use.size ());

					for (pt_itr = points.begin (); pt_itr != points.end (); pt_itr++) {
						arcview_lane_use.push_back (*pt_itr);
					}
				}
			} else {
				arcview_lane_use.parts.push_back ((int) arcview_lane_use.size ());

				Link_Shape (link_ptr, dir, arcview_lane_use, offset, length, 0.0);
			}
			if (arcview_lane_use.size () > 0) {
				if (!arcview_lane_use.Write_Record ()) {
					Error (String ("Writing %s") % arcview_lane_use.File_Type ());
				}
			}
		}
	}
	return (false);
}
コード例 #18
0
ファイル: Write_Turn.cpp プロジェクト: kravitz/transims4
void ArcDelay::Write_Turn (void)
{
	int i, j, in_dir, vol, period, nperiods, end, time, green, yellow, red;
	double length, setback, delay;
	char buffer [FIELD_BUFFER], string [STRING_BUFFER];
	bool read_flag;

	Link_Data *link_ptr;
	Connect_Time *connect_ptr;
	Range_Data *range_ptr;
	Signal_Time *signal_ptr, signal_rec;
	Phasing_Data *phase_ptr;

	signal_rec.green = 0;
	signal_rec.yellow = 0;
	signal_rec.red = 0;

	//---- process each time period ----

	read_flag = false;
	nperiods = time_period.Num_Ranges ();

	for (period = 1; period <= nperiods; period++) {

		range_ptr = time_period [period];
		end = range_ptr->High () + 1;

		str_cpy (string, sizeof (string), time_period.Range_Format (period));

		for (i=j=0; string [i] != '\0'; i++) {
			if (string [i] == ':') continue;
			if (string [i] == '.' && string [i+1] == '.') {
				buffer [j++] = '_';
				i++;
			} else {
				buffer [j++] = string [i];
			}
		}
		buffer [j] = '\0';

		//---- create a new shape file ----

		str_fmt (string, sizeof (string), "%s_%s.shp", turnname, buffer);
		Print (1);

		if (!arcview_turn.Open (string)) {
			File_Error ("Opening ArcView Turn File", arcview_turn.Shape_Filename ());
		}
		arcview_turn.Write_Header ();	

		Show_Message ("Writing %s %s -- Record", arcview_turn.File_Type (), time_period.Format_Time (end));
		Set_Progress (1000);

		//---- gather phasing times for this time period ----

		if (event_flag) {
			signal_time.Reset ();

			while (read_flag || event_file.Read ()) {
				read_flag = false;
				time = time_period.Step (event_file.Time ());

				if (time < range_ptr->Low ()) continue;
				if (time > range_ptr->High ()) break;

				if (event_file.Event () != 0) continue;

				signal_rec.time = time;
				signal_rec.node = event_file.Node ();
				signal_rec.plan_phase = (event_file.Plan () << 8);
				signal_rec.plan_phase += (event_file.Phase () & 0xFF);

				str_cpy (buffer, sizeof (buffer), event_file.Status ());
				if (str_cmp (buffer, "Yellow") == 0) {
					signal_rec.type = 1;
				} else if (str_cmp (buffer, "Red") == 0) {
					signal_rec.type = 2;
				} else {
					signal_rec.type = 0;
				}
				signal_ptr = (Signal_Time *) signal_time.Get (&signal_rec);

				if (signal_ptr == NULL) {
					if (!signal_time.Add (&signal_rec)) {
						Error ("Adding Signal Timing Record");
					}
				} else {
					time = signal_rec.time - signal_ptr->time;

					if (signal_ptr->type == 1) {
						signal_ptr->yellow += time;
					} else if (signal_ptr->type == 2) {
						signal_ptr->red += time;
					} else {
						signal_ptr->green += time;
					}
					signal_ptr->type = signal_rec.type;
					signal_ptr->time = signal_rec.time;
				}
			}
			read_flag = true;
		}

		//---- process each connection ----

		for (connect_ptr = connect_time.First_Key (); connect_ptr; connect_ptr = connect_time.Next_Key ()) {
			Show_Progress ();

			if (connect_ptr->Periods () == 0) continue;

			link_ptr = link_data.Get (connect_ptr->In_Link ());

			in_dir = connect_ptr->In_Dir ();

			//---- save the link direction data ----

			if (delay_file->LinkDir_Type () == LINK_SIGN) {
				if (in_dir == 1) {
					delay_file->Link (-link_ptr->Link ());
				} else {
					delay_file->Link (link_ptr->Link ());
				}
			} else {
				delay_file->Link (link_ptr->Link ());	

				if (delay_file->LinkDir_Type () == LINK_NODE) {
					delay_file->Dir ((in_dir == 1) ? link_ptr->Bnode () : link_ptr->Anode ());
				} else {
					delay_file->Dir (in_dir);
				}
			}

			//---- get the connection delay ----

			vol = connect_ptr->Volume (period);
			delay = UnRound (connect_ptr->TTime (period));

			if (vol > 0) {
				delay /= vol;
			}
			delay_file->Out_Link (connect_ptr->Out_Link ());
			delay_file->Out_Dir (connect_ptr->Out_Dir ());
			delay_file->Out_Turn (vol);
			delay_file->Out_Time (delay);

			//---- save the connection shape ----

			delay_file->Nest (false);
			arcview_turn.Copy_Fields (delay_file);

			delay_file->Nest (true);
			arcview_turn.Copy_Fields (delay_file);

			if (event_flag) {
				green = yellow = red = 0;
				for (phase_ptr = phasing_data.First (); phase_ptr; phase_ptr = phasing_data.Next ()) {
					if (connect_ptr->In_Link_Dir () == phase_ptr->In_Link_Dir () &&
						connect_ptr->Out_Link_Dir () == phase_ptr->Out_Link_Dir ()) {

						signal_rec.node = phase_ptr->Node ();
						signal_rec.plan_phase = (phase_ptr->Timing () << 8);
						signal_rec.plan_phase += (phase_ptr->Phase () & 0xFF);

						signal_ptr = (Signal_Time *) signal_time.Get (&signal_rec);

						if (signal_ptr != NULL) {
							green += signal_ptr->green;
							yellow += signal_ptr->yellow;
							red += signal_ptr->red;
						}
					}
				}
				time = green + yellow + red;
				arcview_turn.Put_Field (green_field, green);
				arcview_turn.Put_Field (yellow_field, yellow);
				arcview_turn.Put_Field (red_field, red);
				if (time > 0) {
					time = (green * 100 + time / 2) / time;
				}
				arcview_turn.Put_Field (split_field, time);
			}

			//---- approach leg ----

			arcview_turn.points.Reset ();

			if (connect_ptr->In_Dir () == 0) {
				length = UnRound (link_ptr->Length ());
				setback = UnRound (link_ptr->Boffset ());

				Link_Shape (link_ptr, 0, &points, length - setback - 10.0, 10.0, lane_width);
			} else {
				setback = UnRound (link_ptr->Aoffset ());

				Link_Shape (link_ptr, 1, &points, setback + 10.0, 10.0, lane_width);
			}
			for (i=1; i <= points.Num_Points (); i++) {
				if (!arcview_turn.points.Add (points [i])) goto mem_error;
			}

			//---- departure leg ----

			link_ptr = link_data.Get (connect_ptr->Out_Link ());

			if (connect_ptr->Out_Dir () == 0) {
				setback = UnRound (link_ptr->Aoffset ());

				Link_Shape (link_ptr, 0, &points, setback, 10.0, lane_width);
			} else {
				length = UnRound (link_ptr->Length ());
				setback = UnRound (link_ptr->Boffset ());

				Link_Shape (link_ptr, 1, &points, length - setback, 10.0, lane_width);
			}
			for (i=1; i <= points.Num_Points (); i++) {
				if (!arcview_turn.points.Add (points [i])) goto mem_error;
			}

			//---- save the turn record ----

			if (!arcview_turn.Write_Record ()) {
				Error ("Writing %s", arcview_turn.File_Type ());
			}
		}
		End_Progress ();
		arcview_turn.Close ();
	}
	return;

mem_error:
	Error ("Insufficient Memory for Turn Shape Points");
	return;
}
コード例 #19
0
bool ArcNet::Lane_Use_Processing (Db_File *fh)
{
	int i, dir, center, lane, num_lanes;
	double length, offset, start, end, side;

	Link_Data *link_ptr;
	Dir_Data *dir_ptr;
	Lane_Use_Data *lane_use_ptr;

	Lane_Use_File *file = (Lane_Use_File *) fh;

	if (Network_Service::Lane_Use_Processing (file)) {
		arcview_lane_use.Copy_Fields (file);

		lane_use_ptr = lane_use_data.New_Record ();

		if (select_time) {
			if (!time_range.Span_Range (lane_use_ptr->Start (), lane_use_ptr->End ())) return (false);
		}

		link_ptr = link_data.Get (lane_use_ptr->Link ());
		dir = lane_use_ptr->Dir ();

		offset = UnRound (lane_use_ptr->Offset ());
		length = UnRound (lane_use_ptr->Length ());

		if (offset == 0.0 && length == 0.0) {
			offset = 0.0;
			length = UnRound (link_ptr->Length ());
		}
		start = offset;
		end = start + length;

		if (dir == 0) {
			side = UnRound (link_ptr->Aoffset ());
			if (start < side) start = side;

			side = UnRound (link_ptr->Length () - link_ptr->Boffset ());
			if (end > side) end = side;

			length = end - start;
			offset = start;
		} else {
			side = UnRound (link_ptr->Boffset ());
			if (start < side) start = side;

			side = UnRound (link_ptr->Length () - link_ptr->Aoffset ());
			if (end > side) end = side;

			length = end - start;

			offset = UnRound (link_ptr->Length ()) - start;
		}

		if (lanes_flag) {
			if (center_flag) {
				if (link_ptr->BA_Dir () == 0) {
					dir_ptr = dir_data [link_ptr->AB_Dir ()];
					center = dir_ptr->Left () + dir_ptr->Thru () + dir_ptr->Right () + 1;
				} else if (link_ptr->AB_Dir () == 0) {
					dir_ptr = dir_data [link_ptr->BA_Dir ()];
					center = dir_ptr->Left () + dir_ptr->Thru () + dir_ptr->Right () + 1;
				} else {
					center = 1;
				}
			} else {
				center = 1;
			}
			lane = lane_use_ptr->Lane ();

			if (lane == 0) {
				if (dir == 0) {
					dir_ptr = dir_data [link_ptr->AB_Dir ()];
				} else {
					dir_ptr = dir_data [link_ptr->BA_Dir ()];
				}
				lane = dir_ptr->Left ();
				num_lanes = lane + dir_ptr->Thru ();
			
				arcview_lane_use.parts.Reset ();
				arcview_lane_use.points.Reset ();

				for (++lane; lane <= num_lanes; lane++) {
					side = (2 * lane - center) * lane_width / 2.0;

					Link_Shape (link_ptr, dir, &points, offset, length, side);

					if (!arcview_lane_use.parts.Add (arcview_lane_use.points.Num_Points ())) goto mem_error;

					for (i=1; i <= points.Num_Points (); i++) {
						if (!arcview_lane_use.points.Add (points [i])) goto mem_error;
					}
				}
				if (!arcview_lane_use.Write_Record ()) goto write_error;
				return (false);

			} else {
				arcview_lane_use.Num_Parts (1);

				side = (2 * lane - center) * lane_width / 2.0;
			}
		} else {
			side = 0.0;
		}
		if (Link_Shape (link_ptr, dir, &arcview_lane_use.points, offset, length, side)) {

			if (!arcview_lane_use.Write_Record ()) goto write_error;
		}
	}
	return (false);

mem_error:
	Error ("Insufficient Memory for Lane Use Shape Points");
	return (false);

write_error:
	Error ("Writing ArcView Lane Use File");
	return (false);
}
コード例 #20
0
ファイル: User_Groups.cpp プロジェクト: kravitz/transims4
void Progression::User_Groups (void)
{
	int i, num, group, link, dir, node, to_node;
	int ttim, ttime, len, length, hrs, hours, volume;
	bool first;

	Link_Data *in_link_ptr, *out_link_ptr;
	TTime_Data *in_dir_ptr, *out_dir_ptr;
	Signal_Data *signal_ptr;
	Sign_Data *sign_ptr;
	Group_Link link_rec;
	Group_Data *group_ptr;
	Signal_Offset *offset_ptr;
	Green_Phase *green_ptr;
	Integer_List *list;

	Show_Message ("Building Link Groups -- Group");
	Set_Progress (1);

	for (group = link_equiv.First_Group (); group != 0 ; group = link_equiv.Next_Group ()) {
		Show_Progress ();

		list = link_equiv.Group_List (group);

		if (list == NULL) continue;

		group_ptr = new Group_Data (group);
		num = group_data.Num_Records () + 1;

		in_link_ptr = NULL;
		in_dir_ptr = NULL;
		node = ttime = length = hours = 0;
		first = true;

		for (link = list->First (); link != 0; link = list->Next ()) {
			if (link < 0) {
				link = -link;
				dir = 1;
			} else {
				dir = 0;
			}
			out_link_ptr = link_data.Get (link);

			if (out_link_ptr == NULL) goto link_error;

			if (dir == 0) {
				to_node = out_link_ptr->Bnode ();
				dir = out_link_ptr->AB_Dir ();
			} else {
				to_node = out_link_ptr->Anode ();
				dir = out_link_ptr->BA_Dir ();
			}
			out_dir_ptr = ttime_data [dir];

			if (out_dir_ptr == NULL) goto link_error;

			if (in_dir_ptr != NULL) {

				//---- get the travel time ----

				if (speed_flag) {
					ttim = (int) (UnRound (in_link_ptr->Length ()) / progression_speed + 0.5);
				} else {
					ttim = Resolve (in_dir_ptr->TTime (mid_period));
				}
				if (ttim < 1) ttim = 1;

				len = in_link_ptr->Length ();

				volume = in_dir_ptr->Volume (mid_period);
				if (volume == 0) volume = 1;

				hrs = volume * ttim;

				//---- get the node controls ----

				signal_ptr = signal_data.Get_LE (node, progression_time);

				if (signal_ptr == NULL || signal_ptr->Node () != node) {
					sign_ptr = sign_data.Get (in_dir_ptr->Link_Dir ());

					if (sign_ptr != NULL && sign_ptr->Sign () == STOP_SIGN) {
						Error ("Link %d on Link Group %d has a Stop Sign", in_link_ptr->Link (), group);
					}
					ttime += ttim;
					length += len;
					hours += hrs;

				} else if (signal_ptr->Type () == ACTUATED) {

					Error ("Link %d on Link Group %d has an Actuated Signal", in_link_ptr->Link (), group);

				} else {

					offset_ptr = signal_offset.Get (signal_data.Record_Index ());

					if (offset_ptr == NULL) {
						Error ("Signal at Node %d was Not Found", node);
					}
					if (!offset_ptr->Add_Group (num)) {
						Error ("Adding Group to Signal %d", node);
					}

					//---- get the green phase ----

					green_ptr = offset_ptr->Get_Phase (in_dir_ptr->Link_Dir (), out_dir_ptr->Link_Dir ());

					if (green_ptr == NULL) {
						Error ("A Green Phase between Links %d and %d was Not Found", in_dir_ptr->Link (), out_dir_ptr->Link ());
					}

					//---- add the link record ----

					if (first) {
						first = false;
						ttime = length = hours = 0;
					} else {
						ttime += ttim;
						length += len;
						hours += hrs;
					}
					link_rec.Node (node);
					link_rec.Green (green_ptr->Green_Time ());
					link_rec.Offset (green_ptr->Phase_Offset ());
					link_rec.Signal (signal_offset.Record_Index ());
					link_rec.TTime (ttime);
					link_rec.Length (length);
					link_rec.VHT (hours);

					if (!group_ptr->Add_Link (&link_rec)) {
						Error ("Adding Link to Group %d", group);
					}
					ttime = length = hours = 0;
				}

				//---- link shape points ----

				if (arcview_flag) {
					dir = in_dir_ptr->Dir ();

					Link_Shape (in_link_ptr, dir, &points, ((dir) ? -1.0 : 0.0), -1.0, link_offset);

					for (i=1; i <= points.Num_Points (); i++) {
						if (!group_ptr->points.Add (points [i])) {
							Error ("Insufficient Memory for Shape Points");
						}
					}
				}
			}
			in_link_ptr = out_link_ptr;
			in_dir_ptr = out_dir_ptr;
			node = to_node;
		}

		//---- draw the last link ----

		if (arcview_flag) {
			dir = in_dir_ptr->Dir ();

			Link_Shape (in_link_ptr, dir, &points, ((dir) ? -1.0 : 0.0), -1.0, link_offset);

			for (i=1; i <= points.Num_Points (); i++) {
				if (!group_ptr->points.Add (points [i])) {
					Error ("Insufficient Memory for Shape Points");
				}
			}
		}
		if (!group_data.Add (group_ptr)) {
			Error ("Adding Group Data");
		}
	}
	End_Progress ();
	return;

link_error:
	Error ("Link %d on Link Group %d was Not Found", link, group);
}
コード例 #21
0
ファイル: Read_Traveler.cpp プロジェクト: kravitz/transims4
void ArcTraveler::Read_Traveler (void)
{
	int id_field, veh_field, start_field, end_field, dist_field, ttime_field, speed_field;
	int i, traveler, last_traveler, last_spd, last_time, time, nsaved, link, dir, lane, start_time;
	double distance, ttime, offset, side, speed;
	bool select_flag;

	Link_Data *link_ptr;
	Point_Data points;
	Traveler_Data *data_ptr;

	Show_Message ("Reading %s -- Record", traveler_file.File_Type ());
	Set_Progress (10000);
	
	select_flag = (travelers.Num_Ranges () > 0);

	id_field = arcview_traveler.Field_Number ("TRAVELER");
	veh_field = arcview_traveler.Field_Number ("VEHICLE");
	start_field = arcview_traveler.Field_Number ("STARTTIME");
	end_field = arcview_traveler.Field_Number ("ENDTIME");
	dist_field = arcview_traveler.Field_Number ("DISTANCE");
	ttime_field = arcview_traveler.Field_Number ("TTIME");
	speed_field = arcview_traveler.Field_Number ("SPEED");

	if (!traveler_data.Max_Records (MIN (traveler_file.Estimate_Records (), 100000))) goto mem_error;

	//---- read and sort the traveler file ----

	while (traveler_file.Read ()) {
		Show_Progress ();

		//---- check the traveler id ----

		traveler = traveler_file.Traveler ();

		if (select_flag && !travelers.In_Range (traveler)) continue;

		//---- check the time ----

		time = times.Step (traveler_file.Time ());

		if (time_flag && !times.In_Range (time)) continue;

		//---- check the location ----

		link = traveler_file.Link ();
		dir = traveler_file.Dir ();
		offset = traveler_file.Offset ();
		lane = traveler_file.Lane ();

		if (link == 0 || lane == 0) continue;

		if (subarea_flag) {
			link_ptr = link_data.Get (link);
			if (link_ptr == NULL) continue;

			if (dir == 0) {
				distance = offset;
			} else {
				distance = UnRound (link_ptr->Length ()) - offset;
			}
			Link_Shape (link_ptr, dir, &points, distance, 0.0, 0.0);

			if (!In_Polygon (points [1]->x, points [1]->y, &select_subarea.points)) continue;
		}

		//---- save the data record ----

		data_ptr = traveler_data.New_Record (true);
		if (data_ptr == NULL) goto mem_error;

		data_ptr->Traveler (traveler);
		data_ptr->Time (time);
		data_ptr->Vehicle (traveler_file.Vehicle ());
		data_ptr->Link (link);
		data_ptr->Dir (dir);
		data_ptr->Offset (Round (offset));
		data_ptr->Lane (lane);
		data_ptr->Distance (Round (traveler_file.Distance ()));
		data_ptr->Speed (Round (traveler_file.Speed ()));

		if (!traveler_data.Add ()) goto mem_error;
	}
	End_Progress ();

	Print (2, "Number of Traveler Records Read = %d", Progress_Count ());

	traveler_file.Close ();

	//---- output the selected travelers ----

	Show_Message ("Writing %s -- Record", arcview_traveler.File_Type ());
	Set_Progress (10000);

	last_traveler = last_time = start_time = time = nsaved = 0;
	last_spd = 1;
	distance = ttime = 0.0;

	for (data_ptr = traveler_data.First_Key (); ; data_ptr = traveler_data.Next_Key ()) {
		Show_Progress ();

		if (data_ptr != NULL) {
			traveler = data_ptr->Traveler ();
			time = data_ptr->Time ();
		}
		if (traveler != last_traveler || (last_spd > 0 && (time - last_time) > 1) || data_ptr == NULL) {
			if (last_traveler > 0 && last_time > start_time) {
				ttime = last_time - start_time;
				speed = distance / ttime;

				if (speed > 0.01) {
					arcview_traveler.Put_Field (end_field, times.Format_Time (last_time));
					arcview_traveler.Put_Field (dist_field, distance);
					arcview_traveler.Put_Field (ttime_field, ttime);
					arcview_traveler.Put_Field (speed_field, distance / ttime);

					if (!arcview_traveler.Write_Record ()) {
						Error ("Writing ArcView Traveler File");
					}
					nsaved++;
				}
			}
			if (data_ptr == NULL) break;

			last_traveler = traveler;
			distance = 0;

			arcview_traveler.Put_Field (id_field, traveler);

			last_time = start_time = data_ptr->Time ();
			last_spd = data_ptr->Speed ();

			arcview_traveler.Put_Field (start_field, times.Format_Time (start_time));

			arcview_traveler.points.Reset ();
		}
		if (data_ptr->Vehicle () > 0) {
			arcview_traveler.Put_Field (veh_field, data_ptr->Vehicle ());
		}
		link = data_ptr->Link ();
		dir = data_ptr->Dir ();
		lane = data_ptr->Lane ();
		offset = UnRound (data_ptr->Offset ());
		distance += UnRound (data_ptr->Distance ());
		last_time = time;
		last_spd = data_ptr->Speed ();

		link_ptr = link_data.Get (link);

		side = (2 * lane - 1) * lane_width / 2.0;

		if (dir == 1) offset = UnRound (link_ptr->Length ()) - offset;

		Link_Shape (link_ptr, dir, &points, offset, 0.0, side);

		for (i=1; i <= points.Num_Points (); i++) {
			if (!arcview_traveler.points.Add (points [i])) goto mem_error;
		}
	}
	End_Progress ();

	arcview_traveler.Close ();

	Print (1, "Number of Traveler Records Saved = %d", nsaved);
	return;

mem_error:
	Error ("Insufficient Memory for Traveler Data");
	return;
}
コード例 #22
0
ファイル: Write_Links.cpp プロジェクト: qingswu/Transim
int Data_Service::Put_Link_Data (Link_File &file, Link_Data &data)
{
	if (file.Model_Format () == TPPLUS) {
		int a, b, count;
		double length;
		Dir_Data *dir_ptr;

		if (data.Length () == 0) return (0);

		count = 0;
		a = data.Anode ();
		b = data.Bnode ();
		length = UnRound (data.Length ());

		if (System_Data_Flag (NODE)) {
			a = node_array [a].Node ();
			b = node_array [b].Node ();
		}
		if (data.AB_Dir () >= 0) {
			file.Node_A (a);
			file.Node_B (b);
			file.Length (length);
			file.Type (data.Type ());

			dir_ptr = &dir_array [data.AB_Dir ()];

			file.Lanes_AB (dir_ptr->Lanes ());
			file.Speed_AB (UnRound (dir_ptr->Speed ()));
			file.Cap_AB (dir_ptr->Capacity ());

			if (file.Dbase_Format () == ARCVIEW) {
				Link_Shape (&data, 0, *((Arc_Link_File *) &file));
			}
			if (!file.Write_Record ()) {
				Error (String ("Writing %s") % file.File_Type ());
			}
			count++;
		}
		if (data.BA_Dir () >= 0) {
			file.Node_A (b);
			file.Node_B (a);
			file.Length (length);
			file.Type (data.Type ());

			dir_ptr = &dir_array [data.BA_Dir ()];

			file.Lanes_AB (dir_ptr->Lanes ());
			file.Speed_AB (UnRound (dir_ptr->Speed ()));
			file.Cap_AB (dir_ptr->Capacity ());

			if (file.Dbase_Format () == ARCVIEW) {
				Link_Shape (&data, 1, *((Arc_Link_File *) &file));
			}
			if (!file.Write_Record ()) {
				Error (String ("Writing %s") % file.File_Type ());
			}
			count++;
		}
		return (count);
	}
	Dir_Data *dir_ptr;

	if (data.Length () == 0) return (0);

	file.Link (data.Link ());
	file.Name (data.Name ());
	file.Node_A (node_array [data.Anode ()].Node ());
	file.Node_B (node_array [data.Bnode ()].Node ());
	file.Length (UnRound (data.Length ()));
	file.Setback_A (UnRound (data.Aoffset ()));
	file.Setback_B (UnRound (data.Boffset ()));
	file.Type (data.Type ());
	file.Divided (data.Divided ());
	file.Area_Type (data.Area_Type ());
	file.Use (data.Use ());
	file.Grade (UnRound (data.Grade ()));
	file.Notes (data.Notes ());

	if (data.AB_Dir () >= 0) {
		dir_ptr = &dir_array [data.AB_Dir ()];

		file.Lanes_AB (dir_ptr->Lanes ());
		file.Speed_AB (UnRound (dir_ptr->Speed ()));

		if (dir_ptr->Time0 () > 0) {
			file.Fspd_AB ((double) data.Length () / dir_ptr->Time0 ());
		} else {
			file.Fspd_AB (UnRound (dir_ptr->Speed ()));
		}
		if (file.Fspd_AB () > file.Speed_AB () && file.Speed_AB () > 0) {
			if ((file.Fspd_AB () - file.Speed_AB ()) > 0.5) {
				if (Metric_Flag ()) {
					Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_AB (), MPH) % 
						External_Units (file.Speed_AB (), MPH));
				} else {
					Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_AB (), MPH) % 
						External_Units (file.Speed_AB (), MPH));
				}
			}
			file.Fspd_AB (file.Speed_AB ());
		}
		file.Cap_AB (dir_ptr->Capacity ());
		file.Bearing_A (dir_ptr->In_Bearing ());
		file.Bearing_B (dir_ptr->Out_Bearing ());
	} else {
		file.Lanes_AB (0);
		file.Speed_AB (0);
		file.Fspd_AB (0);
		file.Cap_AB (0);
	}
	if (data.BA_Dir () >= 0) {
		dir_ptr = &dir_array [data.BA_Dir ()];

		file.Lanes_BA (dir_ptr->Lanes ());
		file.Speed_BA (UnRound (dir_ptr->Speed ()));

		if (dir_ptr->Time0 () > 0) {
			file.Fspd_BA ((double) data.Length () / dir_ptr->Time0 ());
		} else {
			file.Fspd_BA (UnRound (dir_ptr->Speed ()));
		}
		if (file.Fspd_BA () > file.Speed_BA () && file.Speed_BA () > 0) {
			if ((file.Fspd_BA () - file.Speed_BA ()) > 0.5) {
				if (Metric_Flag ()) {
					Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_BA (), MPH) % 
						External_Units (file.Speed_BA (), MPH));
				} else {
					Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_BA (), MPH) % 
						External_Units (file.Speed_BA (), MPH));
				}
			}
			file.Fspd_BA (file.Speed_BA ());
		}
		file.Cap_BA (dir_ptr->Capacity ());
		if (data.AB_Dir () < 0) {
			file.Bearing_B (compass.Flip (dir_ptr->In_Bearing ()));
			file.Bearing_A (compass.Flip (dir_ptr->Out_Bearing ()));
		}
	} else {
		file.Lanes_BA (0);
		file.Speed_BA (0);
		file.Fspd_BA (0);
		file.Cap_BA (0);
	}
	if (file.Dbase_Format () == ARCVIEW) {
		Link_Shape (&data, 0, *((Arc_Link_File *) &file));
	}
	if (!file.Write_Record ()) {
		Error (String ("Writing %s") % file.File_Type ());
	}
	return (1);
}
コード例 #23
0
ファイル: Route_Nodes.cpp プロジェクト: kravitz/transims4
void ArcNet::Route_Nodes (void)
{
	int i, n, node, node0, route, nroutes, overlap, dir, route_field;
	double offset, length, side, side_offset;
	bool offset_flag, first;

	AB_Data *ab_ptr;
	Dir_Data *dir_ptr;
	Node_Data *node_ptr;
	Link_Data *link_ptr;
	Route_Data *route_ptr;
	XYZ_Point point;

	offset_flag = (route_offset != 0.0);
	side = 0.0;

	//---- set the overlap count ----

	if (!overlap_flag) {
		for (link_ptr = link_data.First (); link_ptr; link_ptr = link_data.Next ()) {
			link_ptr->Aoffset (0);
			link_ptr->Boffset (0);
		}
	}

	//---- write the route file ----

	Show_Message ("Writing Transit Routes -- Record");
	Set_Progress (100);
	nroutes = 0;

	route_field = route_header_db.Required_Field ("ROUTE", "LINE");

	route_header_db.Rewind ();

	while (route_header_db.Read_Record ()) {
		Show_Progress ();

		arcview_route.points.Reset ();
		arcview_route.Copy_Fields (&route_header_db);

		route_header_db.Get_Field (route_field, &route);

		route_ptr = route_data.Get (route);
		if (route_ptr == NULL) continue;

		//---- create the path vector ---

		node0 = 0;
		first = true;

		for (n=1; n <= route_ptr->Nodes (); n++) {
			node = route_ptr->Node (n);

			if (node0 == 0) {
				node0 = node;
				continue;
			}
			ab_ptr = ab_key.Get (abs(node0), abs(node));

			if (ab_ptr == NULL) {
				Warning ("No Link between Nodes %d and %d on Route %d", node0, node, route);
				node0 = node;

				node_ptr = node_data.Get (abs (node0));

				if (node_ptr != NULL) {
					point.x = UnRound (node_ptr->X ());
					point.y = UnRound (node_ptr->Y ());
					point.z = UnRound (node_ptr->Z ());
					
					if (!arcview_route.points.Add (&point)) {
						Error ("Insufficient Memory for Route Node Shape Points");
					}
				}
				continue;
			}
			dir_ptr = dir_data [ab_ptr->dir];
			dir = dir_ptr->Dir ();

			node0 = node;

			link_ptr = link_data.Get (dir_ptr->Link ());

			offset = length = UnRound (link_ptr->Length ());
			side_offset = route_offset;

			if (side_offset > length / 3.0) {
				side_offset = length / 3.0;
			}

			if (offset_flag) {
				if (!overlap_flag) {
					if (dir == 0) {
						overlap = link_ptr->Aoffset () + 1;
						link_ptr->Aoffset (overlap);
					} else {
						overlap = link_ptr->Boffset () + 1;
						link_ptr->Boffset (overlap);
					}
					side = side_offset = route_offset * overlap;

					if (side_offset > length / 3.0) {
						side_offset = length / 3.0;
					}
					offset -= side_offset;
					length -= 2.0 * side_offset;

				} else {
					offset -= side_offset;
					length -= 2.0 * side_offset;

					if (link_ptr->AB_Dir () > 0 && link_ptr->BA_Dir () > 0) {
						side = side_offset;
					} else {
						side = 0.0;
					}
				}
				i = 1;
			} else if (first) {
				i = 1;
				first = false;
			} else {
				i = 2;
			}

			if (dir == 0) {
				Link_Shape (link_ptr, 0, &points, side_offset, length, side);
			} else {
				Link_Shape (link_ptr, 1, &points, offset, length, side);
			}
			for (; i <= points.Num_Points (); i++) {
				if (!arcview_route.points.Add (points [i])) {
					Error ("Insufficient Memory for Route Node Shape Points");
				}
			}
		}
		if (!arcview_route.Write_Record ()) {
			Error ("Writing ArcView Route Node File");
		}
		nroutes++;
	}
	End_Progress ();

	Print (2, "Number of Transit Routes = %d", nroutes);

	arcview_route.Close ();
}
コード例 #24
0
ファイル: Shape_Tools.cpp プロジェクト: kravitz/transims5
bool Turn_Shape (int dir_in, int dir_out, Points &points, double setback, bool curve_flag, double side_in, double side_out, double sub_off, double sub_len)
{
	int dir;
	double length, offset, max_len, off1, off2;

	Dir_Data *dir_ptr;
	Link_Data *link_ptr;
	Points pts;
	Points_Itr pt_itr;

	points.clear ();
	max_len = 2.0 * setback;

	//---- approach leg ----

	dir_ptr = &dat->dir_array [dir_in];
	dir = dir_ptr->Dir ();

	link_ptr = &dat->link_array [dir_ptr->Link ()];

	if (dir == 0) {
		off1 = dat->UnRound (link_ptr->Boffset ());
		off2 = dat->UnRound (link_ptr->Aoffset ());
	} else {
		off1 = dat->UnRound (link_ptr->Aoffset ());
		off2 = dat->UnRound (link_ptr->Boffset ());
	}
	max_len += off1;

	length = dat->UnRound (link_ptr->Length ()) - off1;
	offset = length - setback;
	if (offset < off2) offset = off2;
	length -= offset;
	if (length < 0.0) length = 0.0;

	Link_Shape (link_ptr, dir, pts, offset, length, side_in);

	for (pt_itr = pts.begin (); pt_itr != pts.end (); pt_itr++) {
		points.push_back (*pt_itr);
	}

	//---- departure leg ----

	dir_ptr = &dat->dir_array [dir_out];
	dir = dir_ptr->Dir ();

	link_ptr = &dat->link_array [dir_ptr->Link ()];

	length = dat->UnRound (link_ptr->Length () - link_ptr->Aoffset () - link_ptr->Boffset ());
	if (length < 0.0) length = 0.0;

	if (dir == 0) {
		off1 = dat->UnRound (link_ptr->Aoffset ());
	} else {
		off1 = dat->UnRound (link_ptr->Boffset ());
	}
	max_len += off1;

	offset = off1;
	if (length > setback) length = setback;

	Link_Shape (link_ptr, dir, pts, offset, length, side_out);

	//---- curve connection ----

	if (curve_flag) {
		Connection_Curve (points, pts);
	} else {
		for (pt_itr = pts.begin (); pt_itr != pts.end (); pt_itr++) {
			points.push_back (*pt_itr);
		}
	}

	//---- extract a subset of points ----

	if (sub_off < 0.0) sub_off = 0.0;
	if (sub_len < 0.0) sub_len = 0.0;

	if (sub_off != 0.0 || sub_len != 0.0) {
		return (Sub_Shape (points, sub_off, sub_len, max_len));
	} else {
		return (true);
	}
}