示例#1
0
void LocationData::Set_Files (void)
{
	int i, nfld, key;
	bool binary;

	Db_Field *fld;
	Db_Base *file;
	Db_Sort_Array *data;
	Data_Itr data_itr;
	Polygon_Itr poly_itr;

	//---- create the program data structure ----

	data_rec.push_back (input_file);
	data_rec.push_back (output_file);

	//---- convert each data file to binary ----

	for (data_itr = data_group.begin (); data_itr != data_group.end (); data_itr++) {
		file = data_itr->file;
		data = data_itr->data_db;

		data_rec.push_back ((Db_Base *) data);

		data->File_ID (file->File_ID ());
		data->File_Type (file->File_Type ());

		nfld = file->Num_Fields ();
		key = data_itr->join_field;
	
		binary = (file->Record_Format () == BINARY);

		fld = file->Field (key);

		data->Add_Field (fld->Name (), DB_INTEGER, 10);
		data->Add_Field ("AL_COUNT", DB_INTEGER, 10);

		for (i=0; i < nfld; i++) {
			if (i == key) continue;
			fld = file->Field (i);
			if (fld != 0) {
				data->Add_Field (fld->Name (), fld->Type (), fld->Size (), fld->Units (), binary);
			}
		}
	}

	//---- read the arcview boundary file ----

	for (poly_itr = polygons.begin (); poly_itr != polygons.end (); poly_itr++) {
		file = poly_itr->file;
		data = poly_itr->data_db;

		data_rec.push_back ((Db_Base *) data);

		data->File_ID (file->File_ID ());
		data->File_Type (file->File_Type ());

		nfld = file->Num_Fields ();
		binary = (file->Record_Format () == BINARY);

		data->Add_Field ("INDEX", DB_INTEGER, 10);

		for (i=0; i < nfld; i++) {
			fld = file->Field (i);
			if (fld != 0) {
				data->Add_Field (fld->Name (), fld->Type (), fld->Size (), fld->Units (), binary);
			}
		}
	}
	Write (1, "Compiling Conversion Script");

	if (Report_Flag (PRINT_SCRIPT)) {
		Header_Number (PRINT_SCRIPT);

		if (!Break_Check (10)) {
			Print (1);
			Page_Header ();
		}
	}
	program.Initialize (data_rec, random.Seed () + 1);

	if (!program.Compile (program_file, Report_Flag (PRINT_SCRIPT))) {
		Error ("Compiling Conversion Script");
	}
	if (Report_Flag (PRINT_STACK)) {
		Header_Number (PRINT_STACK);

		program.Print_Commands (false);
	}
	Header_Number (0);
} 
示例#2
0
bool Db_Base::Copy_Fields (Db_Base &input, bool nest_flag)
{
	Field_Ptr in_fld, out_fld;

	bool nested = input.Nested ();
	int lvalue;
	double dvalue;
	string svalue;
	Dtime tvalue;

	if (Dbase_Format () == DEFAULT_FORMAT) {
		Dbase_Format (DEFAULT_FORMAT);
	}
	int num = input.Num_Fields ();

	for (int i=0; i < num; i++) {
		in_fld = input.Field (i);

		if (in_fld != 0) {
			if (nest_flag && input.Nest_Flag ()) {
				if (input.Nested ()) {
					if (in_fld->Nest () != input.Nest ()) continue;
				} else {
					if (in_fld->Nest () == input.Nest ()) continue;
				}
			}
			out_fld = Field (in_fld->Name ());

			if (out_fld != 0) {
				switch (in_fld->Type ()) {
					case DB_INTEGER:
					case DB_UNSIGNED:
						input.Read_Field (in_fld, (void *) &lvalue, DB_INTEGER);
						if (!Write_Field (out_fld, (void *) &lvalue, DB_INTEGER)) return (false);
						break;
					case DB_DOUBLE:
					case DB_FIXED:
						input.Read_Field (in_fld, (void *) &dvalue, DB_DOUBLE);
						if (!Write_Field (out_fld, (void *) &dvalue, DB_DOUBLE)) return (false);
						break;
					case DB_STRING:
					case DB_CHAR:
						input.Read_Field (in_fld, (void *) &svalue, DB_STRING);
						if (!Write_Field (out_fld, (void *) &svalue, DB_STRING)) return (false);
						break;
					case DB_TIME:
						input.Read_Field (in_fld, (void *) &tvalue, DB_TIME);
						if (!Write_Field (out_fld, (void *) &tvalue, DB_TIME)) return (false);
						break;
				}
			}
		}
	}
	input.Nested (nested);
	return (true);
}
示例#3
0
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 ());

}
示例#4
0
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 ();
}