예제 #1
0
void Link_Bearings (Link_Data &link_rec, int &bearing_in, int &bearing_out)
{
	int xa, ya, xb, yb;
	double dx, dy;

	Node_Data *node_ptr;

	node_ptr = &dat->node_array [link_rec.Anode ()];

	xa = node_ptr->X ();
	ya = node_ptr->Y ();

	node_ptr = &dat->node_array [link_rec.Bnode ()];

	xb = node_ptr->X ();
	yb = node_ptr->Y ();

	dx = dy = 0;

	if (link_rec.Shape () >= 0 && 
		(dat->Bearing_Offset () + MAX (link_rec.Aoffset (), link_rec.Boffset ())) < link_rec.Length ()) {

		int i, num, offset, len1, len2, xy_len, x1, y1;

		XYZ *point;
		Shape_Data *shape_ptr;

		shape_ptr = &dat->shape_array [link_rec.Shape ()];
		num = (int) shape_ptr->size ();

		//---- from the A node ---

		offset = dat->Bearing_Offset () + link_rec.Aoffset ();

		len1 = xy_len = 0;
		x1 = xa;
		y1 = ya;

		for (i=0; i < num; i++) {
			point = &((*shape_ptr) [i]);

			dx = point->x - x1;
			dy = point->y - y1;

			xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5);
			len2 = len1 + xy_len;

			if (len2 > offset) break;

			len1 = len2;
			x1 = point->x;
			y1 = point->y;
		}
		if (i == num) {
			dx = xb - x1;
			dy = yb - y1;

			xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5);
			len2 = len1 + xy_len;
		}
		offset -= len1;
		if (xy_len == 0) xy_len = 1;

		dx = x1 + (dx * offset / xy_len) - xa;
		dy = y1 + (dy * offset / xy_len) - ya;

		bearing_in = dat->compass.Direction (dx, dy);
		
		//---- from the B node ----

		offset = dat->Bearing_Offset () + link_rec.Boffset ();

		len1 = xy_len = 0;
		x1 = xb;
		y1 = yb;

		for (i=num-1; i >= 0; i--) {
			point = &((*shape_ptr) [i]);

			dx = point->x - x1;
			dy = point->y - y1;

			xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5);
			len2 = len1 + xy_len;

			if (len2 > offset) break;

			len1 = len2;
			x1 = point->x;
			y1 = point->y;
		}
		if (i < 0) {
			dx = xa - x1;
			dy = ya - y1;

			xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5);
			len2 = len1 + xy_len;
		}
		offset -= len1;
		if (xy_len == 0) xy_len = 1;

		dx = x1 + (dx * offset / xy_len) - xb;
		dy = y1 + (dy * offset / xy_len) - yb;

		bearing_out = dat->compass.Direction (-dx, -dy);

	} else {
		dx = xb - xa;
		dy = yb - ya;

		bearing_in = bearing_out = dat->compass.Direction (dx, dy);
	}
}
예제 #2
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);
}
예제 #3
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);
}