예제 #1
0
bool Relocate::Get_Link_Data (Link_File &file, Link_Data &link_rec, Dir_Data &ab_rec, Dir_Data &ba_rec)
{
	if (!Data_Service::Get_Link_Data (file, link_rec, ab_rec, ba_rec)) return (false);

	if (target_flag) {
		link_rec.Divided (2);
		ab_rec.Sign (2);
		ba_rec.Sign (2);

		Int_Map_Itr map_itr = link_map.find (link_rec.Link ());

		if (map_itr != link_map.end ()) {
			Dir_Data *dir_ptr;
			Link_Data *link_ptr = &link_array [map_itr->second];

			if (link_ptr->Anode () == link_rec.Anode () && link_ptr->Bnode () == link_rec.Bnode ()) {
				link_ptr->Divided (1);
				if (shape_flag) {
					Int_Map_Itr map_itr = target_shape_map.find (link_rec.Link ());
					if (map_itr != target_shape_map.end ()) {
						link_ptr->Shape (map_itr->second);
					}
				}
				if (link_ptr->AB_Dir () >= 0) {
					dir_ptr = &dir_array [link_ptr->AB_Dir ()];
					dir_ptr->Sign (1);
				}
				if (link_ptr->BA_Dir () >= 0) {
					dir_ptr = &dir_array [link_ptr->BA_Dir ()];
					dir_ptr->Sign (1);
				}
				return (false);
			} else if (link_ptr->Anode () == link_rec.Anode () || link_ptr->Bnode () == link_rec.Bnode ()) {
				link_ptr->Divided (3);
				if (shape_flag) {
					Int_Map_Itr map_itr = target_shape_map.find (link_rec.Link ());
					if (map_itr != target_shape_map.end ()) {
						link_ptr->Shape (map_itr->second);
					}
				}
			}
			if (link_rec.AB_Dir () >= 0) {
				link_rec.AB_Dir ((int) dir_array.size ());

				target_dir_map.insert (Int_Map_Data (ab_rec.Link_Dir (), link_rec.AB_Dir ()));
				dir_array.push_back (ab_rec);
			}
			if (link_rec.BA_Dir () >= 0) {
				link_rec.BA_Dir ((int) dir_array.size ());

				target_dir_map.insert (Int_Map_Data (ba_rec.Link_Dir (), link_rec.BA_Dir ()));
				dir_array.push_back (ba_rec);
			}
			target_link_map.insert (Int_Map_Data (link_rec.Link (), (int) link_array.size ()));
			link_array.push_back (link_rec);
			return (false);
		}
	} else {
		link_rec.Divided (0);
		ab_rec.Sign (0);
		ba_rec.Sign (0);
	}
	return (true);
}
예제 #2
0
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);
}