Bảng Duong_Xe
Tên trường Kiểu dữ liệu Độ lớn Ghi chú
Ten_tuyen number 5 Tên của các tuyến xe buýt Chieu text 50 Hướng đi của tuyến xe buýt Diem_xe_buyt_di text 50 Điểm xe buýt đi
Diem_xe_buyt_den text 50 Điểm xe buýt sẽđến
Khoang_cach number 10 Khoảng cách hai điểm xe buýt gần nhau trên cùng tuyến
3.4 Thiết kế, đặc tả các chức năng
3.4.1 Xem bản đồ
• Xem bản đồ tổng thể
Cho phép bản đồ hiển thị dạng tổng thể trên toàn bộ cửa sổ chính của chương trình.
Khi người dùng chọn chức năng này, hệ thống sẽ truy cập cơ sở dữ
liệu và hiển thị toàn bộ bản đồ ra cho người dùng.
• Phóng to, thu nhỏ bản đồ
Là cách thức một người dùng phóng to hay thu nhỏ phần không gian hiển thị của bản đồ.
Khi chức năng phóng to được lựa chọn, người dùng kích trái chuột, giữ và di con trỏ chuột để tạo một hình chữ nhật bao quanh vùng cần phóng to rồi thả chuột.
Khi người dùng chọn chức năng thu nhỏ, chỉ cần nhấn chuột trái lên bản đồ tại vùng không gian đang hiển thị.
Hệ thống sẽ truy cập cơ sở dữ liệu lấy ra phần thông tin trong không gian mới và hiện ra cho người dùng.
• Di chuyển bản đồ
Là cách thức một người dùng di chuyển bản đồ lên trên, xuống dưới, sang trái, sang phải để xem vùng không gian khác trên bản đồ. Người dùng nhấn chuột lên bản đồ, giữ chuột, kéo bản đồ sang vùng không gian cần xem và thả chuột. Hệ thống sẽ truy cập cơ sở dữ liệu lấy ra phần thông tin trong không gian mới và hiện ra cho người dùng.
• Chọn một đối tượng bản đồ:
Cho phép người sử dụng chọn một đối tượng trên bản đồ.
• Chọn một vùng trên bản đồ:
Cho phép người sử dụng lựa chọn một vùng hoặc tất cả các đối tượng trong vùng đó theo lựa chọn của người sử dụng.
• Hiển thị các lớp bản đồ
Cho phép người dùng mở cửa sổ lớp bản đồ để bật hoặc tắt các lớp thông tin.
Hệ thống tự cập nhật ngay những thay đổi đối với thao tác người dùng và hiển thị tác dụng trên bản đồ.
• Xem ghi chú động trên bản đồ (MapTips)
Chức năng này chỉ áp dụng đối với lớp đường. Người dùng di chuột tới con đường cần biết tên và thông tin hiện ra dạng ghi chú động, nghĩa là khi di chuột ra vị trí khác thì ghi chú không còn hiển thị.
3.4.2 Truy vấn trên bản đồ
Truy vấn các đối tượng theo không gian:
• Kích chọn trực tiếp một đối tượng (điểm, đường) trên bản đồ, đối tượng được lựa chọn sẽđược tô sang màu khác trên bản đồ.
• Hiển thị thông tin của đối tượng (điểm: tên điểm; đường: tuyến xe buýt
đi qua) trên bản đồ.
3.4.3 Hệ thống tìm đường đi xe buýt trên bản đồ
• Hệ thống cho phép người sử dụng có thể tìm đường đi xe buýt ngắn nhất trên bản đồ.
• Cho phép người sử dụng nhập trực tiếp điểm đi và điểm đến hoặc kích chọn trực tiếp điểm đi và điểm đến trên bản đồ.
• Hệ thống sẽ đổi màu quãng đường đi ngắn nhất từ điểm đầu đến điểm cuối của tuyến xe buýt.
3.5 Sơ đồ luồng dữ liệu
Biểu đồ hoạt động của chương trình tìm tuyến đường đi có khoảng cách ngắn nhất từ điểm xe buýt bắt đầu đến điểm xe buýt đích cần đến trong mạng lưới xe buýt Hà Nội như sau (hình 3.1):
Hình 3.1 Biểu đồ hoạt động chức năng tìm đường đi ngắn nhất
[Có] [Có]
[Không]
[Không]
Hiển thị đường đi ngắn nhất trên
bản đồ
Thông báo “Không tồn tại đường đi giữa hai
điểm đó” Tìm kiếm ? (C/K) [Nhập trực tiếp] Lựa chọn tìm kiếm Nhập - Điểm xuất phát - Điểm đến Kích chọn - Điểm xuất phát - Điểm đến
Tìm đường đi giữa hai điểm có khoảng
cách ngắn nhất
Liệt kê các đường đi có cùng khoảng
cách ngắn nhất
3.6 Cài đặt và thử nghiệm chương trình
3.6.1 Cài đặt
Chương trình được phát triển bằng cách sử dụng công cụ MapXtreme v6.6 nhúng trong môi trường Visual C# . NET.
Chương trình chạy trên hệ điều hành Window XP. Máy tính tốc độ
1,73 GHz, bộ nhớ 512MB RAM.
3.6.2 Kỹ thuật áp dụng
Hiển thị bản đồ:
- Sử dụng phần mềm hỗ trợ MapXtreme v6.6 để hiển thị bản đồ mạng lưới tuyến xe buýt Hà Nội từ hai bảng cơ sở dữ liệu định dạng MapInfo. Hai bảng dữ liệu này tạo thành hai lớp bản đồ:
+ Tập tin Diem_chuyen.TAB: là lớp Diem_chuyen, hiển thị các hình tròn màu vàng, biểu diễn cho các điểm dừng xe buýt.
+ Tập tin Xe_buyt.TAB: lớp Xe_buyt, hiển thị các đường màu nâu nối các điểm, biểu diễn cho các tuyến xe buýt.
Cách chuyển đổi dữ liệu vào chương trình để xây dựng đồ thị
Từ dữ liệu cho trước theo định dạng MapInfo có thể xây dựng thành đồ
thị như sau:
- Các điểm dừng xe buýt (tương ứng với bảng dữ liệu Diem_chuyen) là tập các điểm của đồ thị. Các điểm này có tọa độ và có các thuộc tính như số thứ
tự và tên của từng điểm dừng xe buýt.
- Để xây dựng các cạnh đồ thị, tức là đường nối hai điểm xe buýt liền kề
thì có thể xây dựng một bảng cơ sở dữ liệu Access (bảng Duong_Xe) trong đó thuộc tính Khoang_cach biểu diễn độ dài khoảng cách hai điểm liền kề trong đồ
thị, tức là khoảng cách hai điểm xe buýt gần kề trong cùng tuyến xe buýt.
Đoạn mã xây dựng đồ thị như sau:
private void khoiTaoDoThi()
{
for(int i =0; i < danhSachDiem.Length;i++) for (int j = 0; j < danhSachDiem.Length; j++) {
if (DoThi[i, j] == null) {
DoThi[i,j]=new clsKhoangCach(danhSachDiem[i],danhSachDiem[j]); }
DoThi[i,j]=khoiTaoKhoangCach(danhSachDiem[i],danhSachDiem[j]); }
}
Trong đó, các biến được khai báo như sau:
clsBenXe[] danhSachDiem;
clsKhoangCach[,] DoThi;// chua khoang cach cac dinh Trong đó, lớp clsKhoangcach được định nghĩa như sau:
class clsKhoangCach
{
public static float MaxValue =float.MaxValue;
clsBenXe diemNguon;
clsBenXe diemDich;
public string tuyenXe;
public float doDai;
public clsKhoangCach(clsBenXe diemDau, clsBenXe diemCuoi) { diemNguon = diemDau; diemDich = diemCuoi; doDai = MaxValue; } }
Lớp clsBenxe được định nghĩa như sau:
class clsBenXe
{
public string ten;// Tên bến xe
public string tuyen;// các tuyến xe đi qua public bool isKiemTra;
public int thuTu; // thu tu cua diem trong danh sach
public int ID; // id cua ben xe trong csdl bang diem_chuyen public clsBenXe diemTruoc;
public clsBenXe() { ID = -1; ten = ""; tuyen = ""; isKiemTra = false; } }
Áp dụng thuật toán tìm đường đi vào đồ thị
Đây là đoạn mã lệnh áp dụng thuật toán tìm đường đi Dijkstra đã được trình bày trong chương 2:
private void giaiThuatDijkstra(clsBenXe diemDau) {
for (int i = 0; i < danhSachDiem.Length; i++) {
danhSachDiem[i].isKiemTra = false; danhSachDiem[i].diemTruoc = diemDau; }
diemDau.isKiemTra = true;// dua vao tap set //diemDau.diemTruoc = diemDau; int SoDiemChuaXet = danhSachDiem.Length - 1; while (SoDiemChuaXet > 0)
{
// tim diem ngan nhat chua xet toi diemDau clsBenXe diemMin = new clsBenXe();
for (int i = 0; i < danhSachDiem.Length; i++) {
if (!danhSachDiem[i].isKiemTra) {
if (diemMin.ten == "") diemMin = danhSachDiem[i]; if (DoThi[diemDau.thuTu,i].doDai < DoThi[diemDau.thuTu,diemMin.thuTu].doDai) { diemMin = danhSachDiem[i]; } } } diemMin.isKiemTra = true; SoDiemChuaXet--;
for (int i = 0; i < danhSachDiem.Length; i++) {
if((!danhSachDiem[i].isKiemTra)&&(DoThi[diemDau.thuTu,i].doDai > DoThi[diemDau.thuTu,diemMin.thuTu].doDai +
DoThi[diemMin.thuTu,i].doDai)) {
DoThi[diemDau.thuTu, i].doDai = DoThi[diemDau.thuTu, diemMin.thuTu].doDai + DoThi[diemMin.thuTu, i].doDai; danhSachDiem[i].diemTruoc = diemMin; DoThi[diemDau.thuTu, i].tuyenXe = DoThi[diemMin.thuTu, i].tuyenXe; } } } }
3.6.3 Các kết quả thử nghiệm
3.6.3.1 Kết quả bước đầu
Chương trình “Tìm kiếm đường đi ngắn nhất giữa hai điểm xe buýt trong mạng lưới tuyến xe buýt Hà Nội” chạy trên môi trường WinXP khá ổn định.
Giao diện chính của chương trình (hình 3.2)
Hình 3.2 Giao diện chính của chương trình sau khi khi khởi động
Các nút lệnh trên thanh công cụ (bảng 3.1)
Nút lệnh Chức năng Phóng to bản đồ Thu nhỏ bản đồ Di chuyển bản đồ Chọn một đối tượng bản đồ Chọn một vùng trên bản đồ Hiển thị các lớp trên bản đồ
Giao diện chức năng xem tổng thể bản đồ hệ thống tuyến xe buýt Hà Nội (hình 3.3)
Hình 3.3 Bản đồ mạng lưới tuyến xe buýt Hà Nội khi xem tổng thể
Giao diện chức năng hiển thị các lớp bản đồ (hình 3.4)
Giao diện chức năng hiển thị ghi chú động (hình 3.5)
Hình 3.5 Minh họa ghi chú động trên bản đồ
Giao diện chức năng tìm đường đi cho xe buýt theo yêu cầu người sử dụng Thao tác:
- Chọn một điểm xe buýt đi và một điểm xe buýt đến.
- Kích nút Tìm trên giao diện để đưa ra kết quả. Kết quả đường đi
được hiển thị trên bản đồ và được liệt kê chi tiết đường đi trong hộp thoại bên phải màn hình.
Chọn điểm đi và điểm đến (hình 3.6):
Kết quả sau khi tìm:
Hình 3.7 Minh họa kết quảđường đi tìm được
Trên hình 3.7 là ví dụ tuyến xe buýt đi từ bến xe Kim Mã đến bến xe Mỹ Đình. Tuyến xe có lộ trình ngắn nhất là tuyến 34 với tổng chiều dài là 5.854879 km. Kiểu tìm kiếm là “Đường đi ngắn nhất”.
3.6.3.2 Nhận xét về kết quả
Chương trình đã được cài đặt và hoạt động trên cơ sở dữ liệu của mạng lưới tuyến xe buýt Hà Nội. Chương trình cài đặt một thuật toán tìm đường đi ngắn nhất Dijkstra để tìm đường đi tuyến xe buýt.
Chương trình đã xác định được đúng tuyến đường đi của xe buýt giữa hai
điểm xe buýt sao cho khoảng cách ngắn nhất. Kết quả tuyến đường đi hiển thị
trực quan trên bản đồ và đưa ra tổng chiều dài đường đi ngắn nhất đó.
Người sử dụng có thể truy vấn trực tiếp trên bản đồ hoặc nhập điểm đi và
điểm đến.
Chương trình chỉ mới thực hiện tìm lộ trình xe buýt ngắn nhất đến điểm
đích, không quan tâm số lần chuyển xe nhiều hay ít. Điều kiện này dùng trong trường hợp người dùng chọn đường đi ngắn nhất, có thể chọn đi bộ một số đoạn
đường ngắn thay vì phải chuyển xe.
Còn điều kiện chuyển tuyến xe ít nhất cho phép tìm đường đi qua ít trạm dừng nhất, tức là người đi không phải đổi trạm nhiều, giảm thiểu chi phí và thời
gian đợi chuyển xe. Nhưng chương trình chưa thực hiện điều kiện này.
Trong thực tế, đường đi có khoảng cách ngắn nhất chưa chắc là tối ưu nhất để lựa chọn vì đường phố đông đúc thì có thể thời gian sẽ lâu hơn. Hoặc với đường đi ngắn nhất mà phải chuyển nhiều tuyến xe thì chắc chắn người dùng vẫn muốn chọn tuyến xe nào hạn chế được việc chuyển tuyến xe dù đoạn
đường có dài hơn.
Giao diện chương trình thân thiện, dễ sử dụng.
KẾT LUẬN
Ngày nay, GIS được xem là một trong những công nghệ mới nhất, có nhiều ứng dụng nhất trong việc giải quyết các bài toán thực tế trong hầu hết các lĩnh vực kinh tế -
xã hội của loài người. Bên cạnh đó, việc sử dụng GIS để phân tích không gian là một
trong những hướng đi tiềm năng trong việc ứng dụng GIS giải quyết các vấn đề thực
tế. Một trong số những ứng dụng trong phân tích không gian là lập phương án vận
chuyển, tức tìm kiếm phương án tối ưu cho bài toán thực tế.
Trong khuôn khổ luận văn này đã thu được một số kết quả chính sau đây:
• Trình bày tổng quan về hệ thông tin địa lý, các vấn đền cơ bản liên quan đến
mạng lưới cơ sở dữ liệu không gian, các mô hình của mạng lưới không gian.
• Tìm hiểu và phân tích, đánh giá một số thuật toán xử lý truy vấn phân tích
mạng lưới, cụ thể là các thuật toán tìm đường đi ngắn nhất trong đồ thị như thuật toán Dijkstra, thuật toán A*, thuật toán Floyd,…
• Tìm hiểu công cụ phần mềm hỗ trợ trong GIS như MapInfo, MapXtreme.
• Cài đặt và thử nghiệm một thuật toán Dijkstra trong hệ thống quản lý mạng
lưới tuyến xe buýt Hà Nội với thành công bước đầu là xác định được lộ trình
nhanh nhất đến điểm xe buýt đích mà không cần quan tâm đến số lần
chuyển xe. Một vấn đề còn tồn tại là chưa đánh giá được thời gian thực hiện chương trình đối với thuật toán Dijkstra.
Hướng nghiên cứu tiếp theo:
• Xây dựng một hệ thống chương trình quản lý tuyến xe buýt Hà Nội có giao
diện thuận tiện hơn, thực hiện nhiều chức năng hơn. Thực hiện việc tìm tuyến xe với kiểu tìm “chuyển xe ít nhất” và kết hợp với “khoảng cách ngắn
nhất” để giúp cho người sử dụng thuận tiện hơn trong việc định hướng đi
cho mình và chủ động hơn khi tham gia giao thông bằng phương tiện xe buýt.
• Thu thập thêm cơ sở dữ liệu về các lớp bản đồ thành phố Hà Nội để xây
dựng một bản đồ tuyến xe buýt Hà Nội chi tiết và sống động hơn.
• Tiếp tục cài đặt các thuật toán còn lại đã trình bày trong luận văn.
Mặc dù đã rất cố gắng, nỗ lực nhưng do thời gian và trình độ có những hạn chế nhất định nên luận văn sẽ không tránh khỏi những thiếu sót. Trong tương lai, em sẽ cố gắng hoàn thiện những hạn chế và phát triển những vấn đề đã nêu trên, để mang lại những kết quả khả quan hơn nữa. Rất mong nhận được sự đóng góp ý kiến của thầy cô và các bạn để luận văn ngày càng hoàn thiện hơn.
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Đặng Văn Đức (2001), “Hệ thống thông tin địa lý”, NXB Khoa học và kỹ
thuật, Hà Nội.
[2] Đinh Mạnh Tường (2003), “Cấu trúc dữ liệu và thuật toán”, NXB Khoa học và kỹ thuật, Hà Nội.
[3] Kenneth H.Rosen (2000), “Toán học rời rạc ứng dụng trong tin học”, tr.494-711, NXB Khoa học và kỹ thuật, Hà Nội.
[4] Robert Sedgewick (1995), “Cẩm nang thuật toán”, tập 2, tr.81-186, NXB Khoa học và kỹ thuật, Hà Nội.
Tiếng Anh
[5] Dimistris Papadias, Jun Zhang, Nikos Mamoulis, Yufie Tao (2003), “Query Processing in Spatial Network Databases”, Proceedings of the 29th VLDB Conference.
[6] Hanan Samet (2002), The Design and Analysis of Spatial Data Structures, Addison-Wesley Publishing Company, Inc., USA.
[7] Jagan Sankaranarayanan, Houman Alborzi and Hanan Samet (2005), “Efficient Query Processing on Spatial Networks”, GIS’05, November 4-5, Bremen, Germany.
[8] James R. Evans, Edward Minieka (1992), Optimization Algorithms for Networks and Graphs, Marcel Dekker, Inc., USA.
[9] Kevin Shaw, John Sample, Elias Ioup, Mahdi Abdelguerfi, Oliver Mansion (2005), Graph Processing for Spatial Network Queries.
[10] Philip Rigaux, Michel Scholl, Agnès Voisard (2002), Spatial Databases with application to GIS,Academic Press, USA.
[11] Russell, S. J Norving, (2003), Artificial Intelligence: A Modern Approach, pp. 97-104.
[12] Shashi Shekhar, Sanjay Chawla (2003), Spatial Database: A Tour, Pearson Education, Inc., Upper Saddle River, New Jersey, USA.
[13] Williams, T.A., and G. P. White, 1973, A Note on Yen’s Algorithms for Finding the Length of All Shortest Paths in N-Node Nonnegative Distance Networks, J. ACM, 20(3), pp. 389-390.
[14] Yen, J. Y., 1973, Finding the Lengths of All Shortest Paths in N-Node Nonnegative Distance Complete Networks Using 1/2N3 Addition and N3
Comparisons, J. ACM, 19(3), pp. 423-424. Trang Web [15] http://en.wikipedia.org/wiki/Geographic_information_system [16] http://testdrive.mapinfo.com/TechSupp/MIProd.nsf/ [17] http://www.basao.com.vn/ [18] http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/
[19] http://www.mapinfo.com/, MapXtreme2004 Developer Guide.
[20] http://www.nea.gov.vn/
[21] http://www.ncgia.ucsb.edu/giscc/units [22] http://www.vidagis.com/
PHỤ LỤC
ĐỊNH DẠNG DỮ LIỆU MAPINFO
Trong phần này mô tảđịnh dạng dữ liệu trong MapInfo với các nội dung sau: - Phần Header của file .MIF
- Phần Data của file .MIF
- Pen, Brush, Symbol và Font trong file .MIF - File .MID.
Dữ liệu MapInfo nằm trong hai file: - Dữ liệu đồ họa trong file .MIF.
- Dữ liệu nguyên bản nằm trong file .MID. Dữ liệu nguyên bản phân ranh giới với mỗi dòng một bản ghi.
File .MIF có hai phần:
- Phần đầu (Header): thông tin về cách tạo ra bảng trong MapInfo. - Phần dữ liệu (Data): định nghĩa đối tượng đồ họa.
Phần Header của file .MIF
Phần này mô tả phần đầu của file .MIF với các tùy chọn nằm trong dấu ngoặc vuông ([ ]). VERSION n Charset "characterSetName" [ DELIMITER "<c>" ] [ UNIQUE n,n.. ] [ INDEX n,n.. ] [ COORDSYS...] [ TRANSFORM...] COLUMNS n <name> <type> <name> <type> : DATA Version
Mệnh đề Version cho biết đang sử dụng phiên bản định dạng nào, chẳng hạn VERSION 1, VERSION 2, VERSION 300 hoặc VERSION 450. VERSION 300 được giới thiệu với MapInfo 3.0 cho phép các đối tượng polyline nhiều
phần (multiple-section polyline). VERSION 450 giới thiệu hạn định số nút mở
rộng: số lượng nút tối đa cho các vùng (region) và nhiều đường (polyline) là 1.048.572 nút cho mỗi vùng đa giác đơn (polygon region) hoặc polyline. Giới hạn giảm xuống 7 nút cho mỗi hai vùng bổ thêm vào. Nếu đối tượng hơn 32K