4.3.1. Tạo Mapfile
Tạo Mapfile tích hợp dữ liệu để tạo ra bản đồ được xây dựng theo mẫu qui định của MapServer, trong mapfiile cần khai báo về các nguồn dữ liệu, các lớp dữ liệu, cách hiển thị các lớp dữ liệu.
Gồm có 5 layer:
- Layer Border_Region: định nghĩa layer vẽ đường viền của bản đồ.
- Layer Quận: Định nghĩa layer vẽ các quận, trong layer này định nghĩa các class như là class Quận Ba Đình, Quận Cầu Giấy, Quận Thanh Xuân… để mô tả chi tiết vẽ các quận phân biệt màu sắc, tên quận cho dễ nhận biết.
- Layer Giao Thông: Layer này vẽ các đường giao thông và tên đường phố. - Layer Song_Region_region : layer vẽ các sông lớn và hồ theo region.
- Layer poi: Định nghĩa các điểm cần thêm vào trên bản đồ như vị trí của các nhà hàng, khách sạn trường học.
4.3.2. Xây dựng các chức năng
Sử dụng MapScript của UMN MapServer để xây dựng các ứng dụng, MapScript cung cấp các đối tượng tương tác với bản đồ (MapObject), Lớp (LayerObject), chú thích
(LegendObject), Bản thân các đối tượng này đã được cài đặt các thuộc tính và các hàm cơ bản.
4.3.2.1. Công cụ phóng to, thu nhỏ, pan- Input: - Input:
+ Bản đồ hiện tại
+ Tỷ lệ phóng to thu nhỏ cho trước
+ Một điểm do người dùng kích chuột trên bản đồ hoặc một vùng chữ nhật do người dùng vẽ trên bản đồ.
+ Kiểm tra các radio box của các công cụ pan, zoomin, zoomout được check - Output: Bản đồ được phóng to, thu nhỏ hoặc pan
- Giải thuật: Người dùng kích chuột lên một điểm, xác định tọa độ của điểm đó, dùng hàm ZoomPoint của MapObject với hệ số phóng to, thu nhỏ cho trước.
4.3.2.2. Công cụ hiển thị, tắt các lớp- Input: - Input:
+ Danh sách các lớp được hiển thị hoặc tắt dự vào các checkbox cho mỗi lớp - Ouput : Các lớp được hiển thị hoặc tắt
Giải thuật: Lấy tên của lớp đó qua tên của checkbox, dùng hàm getLayerbyname để tạo một đối tượng layer tương ứng với lớp đó, tùy vào checkbox được check hay không thì dùng hàm set(‘status’,MS_ON||MS_OFF) với đối tượng layer đó.
4.3.2.3. Công cụ hiển thị thông tin của đối tượng
- Input: Đối tượng cần xem thông tin sẽ được người dùng click chuột vào tại một điểm, xác định tọa độ điểm đó, chuyển tọa độ điểm đó từ tọa độ màn hình về tọa độ bản đồ.
- Output: Đối tượng tồn tại trong cơ sở dữ liệu thì sẽ được hiển thị trên bản đồ, và các thông tin thuộc tính của đối tượng đó.
- Giải thuật: Truy vấn trong cơ sở dữ liệu tìm đối tượng có tọa độ theo kinh độ, vĩ độ tương ứng mà người dùng vừa bấm vào, lấy ra các thông tin của đối tượng đó và hiển thị trên bản đồ.
- Input: Tên của đối tượng cần tìm kiếm trên bản đồ, submit tìm kiếm.
- Output: Nếu đối tượng được tìm thấy thì sẽ trả về bản đồ zoom tới đối tượng cần tìm kiếm.
- Giải thuật: Tìm kiếm theo tên đối tượng trong cơ sở dữ liệu, nếu đối tượng tồn tại trong cơ sở dữ liệu, thì lấy ra tọa độ theo kinh độ và vĩ độ của đối tượng đó, chuyển tọa độ đó về tọa độ màn hình dùng hàm map2img, dùng hàm zoomPoint để thiết lập các thông số cho ảnh bản đồ hiển thị kết quả tìm kiếm.
4.3.3. Xây dựng các hàm xử lý
Sử dụng PHP/ MapScript truy cập vào các hàm API của MapServer để vẽ bản đồ. Xây dựng một ứng dụng MapServer hiển thị bản đồ với các chức năng pan, zoom, bật tắt các layer thành phần bản đồ. Hiển thị các địa điểm nhà hàng, khách sạn trên bản đồ, kết nối với cơ sở dữ liệu MySql lấy ra thông tin thuộc tính của các đối tượng đó trên bản đồ.
- Hàm img2map(): chuyển từ tọa độ màn hình về tọa độ ảnh function img2map($width,$height,$point,$ext) {
$minx = $ext->minx; $miny = $ext->miny; $maxx = $ext->maxx; $maxy = $ext->maxy;
if ($point->x && $point->y){ $x = $point->x; $y = $point->y; $dpp_x = ($maxx-$minx)/$width; $dpp_y = ($maxy-$miny)/$height; $x = $minx + $dpp_x*$x; $y = $maxy - $dpp_y*$y; } $pt[0] = $x;
$pt[1] = $y; return $pt; }
- Hàm map2img() : Chuyển từ tọa độ bản đồ về tọa độ màn hình
function map2img($width,$height,$point,$ext) { if ($point->x && $point->y){
$ppd_x = $width/($ext->maxx - $ext->minx); $ppd_y = $height/($ext->maxy - $ext->miny); $p[0] = $ppd_x * ($point->x - $ext->minx);
$p[1] = $height - $ppd_y * ($point->y - $ext->miny); settype($p[0],"integer");
settype($p[1],"integer"); }return $p;}
- Hàm GetStoreTable() lấy ra thông tin thuộc tính của một nhà hàng trên bản đồ trong bảng store.
function GetStoreTable() {
@mysql_connect("localhost", "root", "password") or die("Could not connect to MySQL server!");
@mysql_select_db("restaurant") or die("Could not select database"); $query = "SELECT * FROM store";
$result = mysql_query($query); $i = 0;
while ( $row = mysql_fetch_array($result,MYSQL_NUM) ) { $qresult[$i] = $row;
$i++; }
return $qresult; }
- Hàm AddPoint(): Thêm các điểm trên bản đồ là vị trí của các nhà hàng, khách sạn theo kinh độ và vĩ độ của nhà hàng đó, được lưu trong cơ sở dữ liệu.
function AddPoints ( $map, $qresult ) {
$this_layer = $map->getLayerByName('poi'); $i = 0; foreach($qresult as $row) { $poi[$i] = ms_newPointObj(); $ln[$i] = ms_newLineObj(); $shp[$i] = ms_newShapeObj(MS_SHAPE_POINT); $poi[$i]->setXY($row[3],$row[2]); $ln[$i]->add($poi[$i]); $shp[$i]->add($ln[$i]); $shp[$i]->set(index, $row[0]);
$this_layer->addFeature( $shp[$i] );$i++; }return;
}
4.4. Cài đặt chương trình và thử nghiệm4.4.1. Cài đặt 4.4.1. Cài đặt
Chương trình cài đặt chạy trên hệ điều hành ubuntu linux. Để chạy chương trình ta phải cài đặt các phần mềm.
- Hệ quản trị cơ sở dữ liệu Mysql - PHP5
- Phpmyadmin - Cgi-MapServer
Các file dữ liệu bản đồ dạng shp, shx, dbf, và file mapfile nằm trong thư mục /home/bdhanoi.
Các file php, js và các file ảnh nằm trong thư mục /var/www/.
4.4.2. Một số giao diện chương trình
Giao diện chính:
Hình 22: Giao diện chính chương trình
Hình 23: Chức năng zoom
Bật, tắt các layer:
Thông tin đối tượng trên bản đồ:
Hình 25: Xem thông tin của đối tượng trên bản đồ Tìm kiếm:
Hình 26: Chức năng tìm kiếm
Chương trình được cài đặt chạy thử nghiệm trên máy Pentium(R) 4, CPU 3.0 GHz, 512MB Ram kết quả như sau
STT Tính năng Đánh giá
1 Hiển thị bản đồ Hiển thị tốt, hiển thị chậm trong lần đầu tiên, các lần sau nhanh hơn.
2 Phóng to, thu nhỏ bản đồ
Bản đồ được phóng to, thu nhỏ theo zoomsize có thể thay đổi
3 Dịch chuyển bản đồ
Việc dịch chuyển với người dùng sẽ khó khăn trong việc xác định chính xác vị trí cần dịch chuyển
4 Tắt bật các layer Tắt bật các layer tốt
5 Tìm vị trí của nhà hàng
Chức năng được thực hiện tốt, nhà hàng được tìm thấy sẽ được dịch chuyển tới giữa khung ảnh cho người dùng.
1. Các kết quả đạt được
Sau khi thực hiện đề tài, em đã đạt được một số kết quả như sau:
- Nghiên cứu về bản đồ, các cơ sở toán học của bản đồ, chiếu hình bản đồ - Hệ thống thôn tin địa lý – GIS, tổ chức cơ sở dữ liệu trong GIS
- Nghiên cứu công nghệ mã nguồn mở MapServer, PHP/MapScript, ứng dụng xây dựng WebGIS
- Nắm vững được các kiến thức về các ngôn ngữ PHP, Javascript, HTML… - Xây dựng một WebGIS dựa trên MapServer, với các chức năng cơ bản - Cài đặt và chạy tốt trên localhost
2. Hướng phát triển của đề tài
Do hạn chế về thời gian và thiếu dữ liệu nên ứng dụng còn thiếu nhiều tính năng cần phát triển như:
- Sử dụng các công nghệ mới như web 2.0 và javascript nhằm cải thiện tốc độ, và các công cụ zoom, pan tiện lợi hơn bằng lăn chuột và kéo thả chuột.
- Phát triển thêm các chức năng hỗ trợ người dùng như tìm đường đi ngắn nhất, và cập nhật thêm dữ liệu không gian
- MapServer hỗ trợ rất nhiều các ngôn ngữ kịch bản như C#, Perl, PHP, nghiên cứu và phát triển dựa trên các ngôn ngữ này.
Tài liệu tham khảo
[1] Phạm Hữu Đức - Đại học Kiến Trúc Hà Nội. Giáo trình Cơ sở dữ liệu & Hệ thống thông tin địa lý – GIS.
[2] Võ Quang Minh, Nguyễn Hồng Điệp , Trần Ngọc Trinh, Trần Văn Hùng – Đại học Cần Thơ. Giáo trình hệ thống thông tin địa lý (GIS SYSTEM).
[3] Bill Kropla. Beginning MapServer Open Source GIS Development 2005 [4] Trang web: http://mapserver.org/documentation.html