Rosa là một trình ứng dụng nhỏ (applet) viết bằng Java, được cung cấp bởi DM Solution Group của Canada. Applet Rosa cho phép người sử dụng điều khiển cách xem bản đồ với các thao tác như kích chuột, kéo rê một hình chữ nhật, elip hoặc là công cụ để định nghĩa một vùng. Nó cũng có thể có một thanh công cụ tùy biến được với các chức năng khác nhau.
Rosa là phần mềm mã nguồn mở, điều này có nghĩa rằng bạn có thể sử dụng nó rộng rãi trong các ứng dụng của bạn. Có thể tải applet này về tại địa chỉ:
http://www2.dmsolutions.ca/webtools/rosa/index.html
Gói Rosa chứa mọi thứ mà bạn cần bao gồm một phiên bản được biên dịch của Applet trong class/rosa.jar (ngoài ra nó còn chứa các tệp hỗ trợ PNG thông qua thư viện sigxlegs là rosa_png.jar), mã nguồn được đặt trong thư mục con src, và tư liệu được đặt trong userdoc.
Chính là nhờ tăng cường bằng các chức năng của applet Rosa mà người ta có thể xây dựng các ứng dụng Web GIS trên cơ sở MapServer
CHƢƠNG 3.
XÂY DỰNG ỨNG DỤNG WEBGIS HỖ TRỢ TÍNH TOÁN VÀ LỰA CHỌN VỊ TRÍ XÂY LẮP THÀNH PHẦN HỆ THỐNG LƢỚI ĐIỆN 3.1. Giới thiệu bài toán
Trong thực tế, để đưa ra phương án xây dựng mới một hệ thống lưới điện, hoặc xây dựng bổ sung vào một hệ thống đã tồn tại, các nhà thiết kế phải thực hiện tìm hiểu, đo đạc và lựa chọn ra các vị trí. Dựa trên bản báo cáo đo đạc, các nhà thiết kế mới xây dựng phương án và đánh giá tính khả thi. Quy trình này tốn khá nhiều chi phí về kinh tế và thời gian, đặc biệt là ở các địa hình nguy hiểm sẽ gây khó khăn và nguy hiểm cho người thực thi. Hơn nữa, bài toán cân bằng giữa việc phát triển, cải thiện tính ổn định, an toàn hệ thống và giảm chi phí là một bài toán rất khó cho các nhà quản lý. Vì vậy GIS là một giải pháp tối ưu khi cung cấp các công cụ hỗ trợ trong việc lập kế hoạch, điều khiển nguồn năng lượng điện, và đánh giá các tác động từ môi trường, ngoại cảnh. GIS giúp các nhà quản lý đưa ra các quyết sớm và chính xác. Tuy nhiên, các phần mềm GIS hiện nay có chi phí đắt và thường chỉ được sử dụng bởi các chuyên gia. Vì vậy chúng tôi đề xuất xây dựng một ứng dụng WebGIS hỗ trợ cho công việc của các nhà thiết kế và đo đạc. Dựa trên những tìm hiểu về phép phân tích dữ liệu không gian đã trình bày trong chương một, chúng tôi thực hiện phát triển các phép toán áp dụng phù hợp cho ứng dụng WebGIS. Cụ thể các phép toán sau:
(1)Phép toán phóng to, thu nhỏ (2)Phép toán xác định vị trí (3)Phép toán hiển thị vị trí (4)Phép toán tính khoảng cách (5)Phép toán tính độ dốc địa hình
Từ các phép toán này, chúng tôi đã xây dựng “Ứng dụng WebGIS hỗ trợ tính toán và lựa chọn vị trí xây lắp thành phần hệ thống lưới điện” hiển thị bản đồ 2D và cho phép thực hiện các chức năng như sau:
Các chức năng chung sẵn có được thừa kế từ ứng dụng WebGIS của tài liệu [3]:
(1) Các chức năng cơ bản của GIS: phóng to, thu nhỏ, dịch chuyển bản đồ. (2) Chức năng truy vấn thông tin thuộc tính
Các chức năng sẽ xây dựng mới trong luận văn này là các chức năng hỗ trợ tính toán và lựa chọn vị trí xây lắp thành phần của hệ thống lưới điện:
(1) Thêm mới cột điện có vị trí thỏa mãn điều kiện mô tả trong phần 1.2. (2) Thêm mới trạm biến áp có vị trí thỏa mãn trong phần 1.2.
(3) Nối đường dây giữa hai cột điện thỏa mãn điều kiện mô tả trong phần 1.2 của chương 1.
(4) Xóa cột điện (5) Xóa trạm biến áp (6) Xóa đường dây
3.2. Phân tích và thiết kế cơ sở dữ liệu
Trong khuôn khổ luận văn này, do chỉ xây dựng một ứng dụng mang tính chất demo mà không gắn với một khu địa lý cụ thể nào nên dữ liệu ứng dụng đưa ra ở đây được giả sử là của một huyện ABC. Dữ liệu của hệ thống được tách riêng thành 2 loại là dữ liệu không gian và dữ liệu thuộc tính.
3.2.1. Cấu trúc các bảng lƣu dữ liệu không gian
Thừa kế kết quả của tài liệu [3], thực hiện nạp (import) dữ liệu không gian từ ESRI shapefile vào trong cơ sở dữ liệu PostgreSQL/PostGIS. Với mỗi đối tượng không gian khi nạp từ ESRI shapefile vào PostgreSQL đều gắn với một mã định danh GID. Giá trị này cho phép xác định đối tượng khi truy vấn trên bản đồ địa lý, tuy nhiên lại là giá trị được sinh khi tạo bản đồ nên khó kiểm soát. Vì vây chúng tôi đã sử dụng thêm một mã định danh ID để thực hiện liên kết giữa các bảng dữ liệu thuộc tính với nhau.
Theo phần mô tả bài toán thực tế trong mục 1.2.1 ở chương 1, mỗi thành phần trong hệ thống lưới điện sẽ đều bị ảnh hưởng bởi tính chất địa hình. Với mỗi loại địa hình sẽ chỉ có thể xây lắp một số thành phần theo yêu cầu nhất định. Vì vậy
chúng tôi có định nghĩa một số loại địa hình ở mục 1.2.1. Với mỗi loại địa hình này sẽ được chia thành từng vùng và mỗi vùng được xác định bởi điểm trái trên và điểm phải dưới của vùng đó. Ứng với bảng 3.1, mỗi vùng địa hình sẽ là một bản ghi (record) được xác định bởi khóa chính là GID (ID của vùng đó trên bản đồ). Bảng tbTerrain sẽ được sử dụng để xác định tính chất địa hình tại mỗi điểm trong lưới dữ liệu DEM.
Cấu trúc bảng phân lại vùng địa hình (tbTerrain)
# trƣờng Tên Null Not Khóa Kiểu dữ liệu Mô tả
1 GID x PK Int ID của đối tượng trên bản đồ
2 ID x PK Varchar[2]
5 ID_District x FK Varchar[2] ID của Quận mà phường này trực thuộc 6 TopLeft_X Geometry Hoành độ điểm trái trên của vùng 7 TopLeft_Y Geometry Tung độ điểm trái trên của vùng 8 BotRight_X Geometry Hoành độ điểm phải dưới của vùng 9 BotRight_Y Geometry Tung độ điểm phải dưới của vùng
10 the_geom Geometry
Dữ liệu không gian: xác vị trí đối tượng trên bản đồ
Bảng 3.1. Cấu trúc bảng địa hình (tbTerrain)
Bất kỳ một thành phần nào của hệ thống lưới điện cũng sẽ phải thuộc quản lý hành chính của một vùng địa lý nào đó. Trong ứng dụng demo này, chúng tôi giả định xây dựng hệ thống lưới điện của một huyện nên sẽ sử dụng bản đồ hành chính phường xã.
Cấu trúc bảng Hành chính phƣờng xã (tbCommune) # Tên
trƣờng
Not
Null Khóa Kiểu dữ liệu Mô tả
1 GID x PK Int ID của đối tượng trên bản đồ
2 ID x PK Varchar[2]
3 Name x Varchar[50] Tên phường
4 Description Varchar[200] Mô tả về phường
5 ID_District x FK Varchar[2] ID của Quận mà phường này trực thuộc
6 TopLeft_X Hoành độ điểm trái trên
7 TopLeft_Y Tung độ điểm trái trên
8 BotRight_X Hoành độ điểm phải dưới
9 BotRight_Y Tung độ điểm phải dưới
10 the_geom Geometry
Dữ liệu không gian: xác vị trí đối tượng trên bản đồ
Khi thực hiện xác định vị trí cần xây lắp cột điện hay trạm biến áp, ta phải thực hiện kiểm tra xem tại vị trí đó đã có công trình, nhà ở, ... nào chưa. Trong ứng dụng này ta demo với lớp bản đồ phân bổ nhà cửa. Ta cần xác định tại vị trí được chọn đã ngôi nhà nào đang và đã được xây dựng hay chưa. Với mỗi vùng có nhà ở sẽ được xác định bởi tọa độ điểm trái trên và tọa độ điểm phải dưới như Bảng 3.3 dưới đây.
Cấu trúc bảng dữ liệu độ cao (tbHouse)
# trƣờng Tên Null Not Khóa Kiểu dữ liệu Mô tả
1 GID x PK Int ID của đối tượng trên bản đồ
2 ID x PK Int
3 TopLeft_X Geometry Tọa độ X của điểm trái trên của lưới ô vuông 4 TopLeft_Y Geometry Tọa độ Y của điểm trái trên của lưới ô vuông 5 BotRight_X Geometry Tọa độ X của điểm dưới phải của lưới ô vuông 6 BotRight_Y Geometry Tọa độ Y của điểm dưới phải của lưới ô vuông 7 the_geom Geometry Dữ liệu không gian: xác vị trí đối tượng trên bản đồ
Bảng 3.3. Cấu trúc bảng phân bổ nhà ở (tbHouse)
Dưới đây sẽ là các bảng biểu diễn dữ liệu của các thành phần chính trong hệ thống lưới điện. Bảng 3.4, Bảng 3.5 và Bảng 3.6 lần lượt mô tả dữ liệu các Cột điện, Trạm biến áp và Đường dây tải điện.
Cấu trúc bảng Cột điện (tbpole)
# Tên trƣờng Null Not Khóa Kiểu dữ liệu Mô tả
1 GID X PK Int ID của đối tượng trên bản đồ
2 ID X PK Int
3 Name Varchar[20]
4 ID_TypeOfPole FK Varchar[5]
5 LAT_X Geometry Tọa độ X
6 LONG_Y Geometry Tọa độ Y
7 ActualHeight float Độ cao thực tế của cột điện 8 ActualCharge float phụ tải thực tế của cột điện (kV) 9 Date Timedate Thời gian cột điện được xây dựng: dd/mm/yyyy 10 Status Varchar[200] Tóm tắt tình trạng hiện tại của cột điện
11 ID_Pole1 Int
Là ID của cột điện được nối với cột này
12 ID_Pole2 Int
13 ID_Pole3 Int
14 ID_Pole4 Int
15 ID_Pole5 Int
16 ID_Station1 Int Là ID của trạm điện có nối dây tới cột điện này 17 ID_Commune FK Int ID của xã mà cột điện này nằm trên địa phận đó. 18 the_geom Geometry Dữ liệu không gian: xác vị trí đối tượng trên bản đồ
Cấu trúc bảng Trạm điện (tbPowerStation)
# Tên trƣờng Null Not Khóa Kiểu dữ liệu Mô tả
1 GID X PK Int ID của đối tượng trên bản đồ
2 ID X PK Int
3 Name Varchar[20]
4 ID_TypeOfStation FK Varchar[5]
5 LAT_X Geometry Tọa độ X
6 LONG_Y Geometry Tọa độ Y
7 ActualArea float Diện tích thực tế của trạm điện 8 ActualCharge
float
Khả năng chịu tải thực tế của trạm điện (kV)
9 Date Timedate Thời gian cột điện được xây dựng: dd/mm/yyyy 10 Status Varchar[20] Tóm tắt tình trạng hiện tại của cột điện
11 ID_Pole1 Int
Là ID của cột điện được nối với cột này 12 ID_Pole2 Int 13 ID_Pole3 Int 14 ID_Pole4 Int 15 ID_Pole5 Int 16 ID_Commune FK Int
ID của xã mà cột điện này nằm trên địa phận đó.
17 the_geom
Geometry
Dữ liệu không gian: xác vị trí đối tượng trên bản đồ
Cấu trúc bảng Đƣờng dây diện (tbPowerLine)
# Tên trƣờng Null Not Khóa Kiểu dữ liệu Mô tả
1 GID X PK Int ID của đối tượng trên bản đồ
2 ID X PK Varchar[5]
3 Name Varchar[20]
4 Type X Int
Là loại đường dây được chia theo cách kết nối:
Type = 1: Nối cột điện với cột điện Type = 2: Nối trạm điện với cột điện 5 ActualLength float Độ dài thực tế cho phép
6 ActualCharge float Khả năng chịu tải thực tế của dây (kV) 7 StartLocation
X
FK Int
Type = 1: trường này sẽ có ID là ID của 1 cột điện
Type = 2: trường này sẽ có ID là ID của 1 trạm điện
8 EndLocation X FK Int Luôn luôn là ID của 1 cột điện 9 ID_TypeOfLine X FK Varchar[5] ID Loại đường dây, dùng để liên kết với bảng tbTypeOfLine 10 Date Timedate Thời gian đường dây điện được lắp đặt: dd/mm/yyyy 11 Status
Varchar[200]
Tóm tắt tình trạng hiện tại của đường dây
12 the_geom
Geometry
Dữ liệu không gian: xác vị trí đối tượng trên bản đồ
Bảng 3.6. Cấu trúc bảng Đường dây diện (tbPowerLine)
3.2.2. Dữ liệu độ cao
Dữ liệu độ cao được lưu dưới dạng file DEM.asc, gồm 330 hàng và 300 cột. Chúng tôi đã xây dựng chương trình Import_DemToPGSQL để đọc tệp dữ liệu DEM.asc và đưa vào bảng dữ liệu tbDem. Với mỗi một lưới ô vuông sẽ gắn với một độ cao được lưu trong tệp DEM.asc. Do tính chất khoảng cách giữa các cột điện và trạm biến áp là không lớn nên chúng tôi đã chia lưới DEM cho huyện ABC là lưới DEM 10m x 10m. Với mỗi lưới ô vuông cũng sẽ được xác định bởi điểm trái trên và điểm phải dưới. Nếu điểm nào thuộc lưới ô vuông này thì sẽ có độ cao ứng với độ cao của lưới ô vuông này.
Cấu trúc bảng dữ liệu độ cao (tbDem)
# trƣờng Tên Null Not Khóa Kiểu dữ liệu Mô tả
1 ID x PK Int ID của đối tượng trên bản đồ
2 status
Int
Status = 0: Tại điểm đó đang để trống Status = 1: Tại điểm đó đang có 1 đối tượng khác
3 TopLeft_X Geometry
Tọa độ X của điểm trái trên của lưới ô vuông
4 TopLeft_Y Geometry
Tọa độ Y của điểm trái trên của lưới ô vuông
5 BotRight_X Geometry
Tọa độ X của điểm dưới phải của lưới ô vuông
6 BotRight_Y Geometry Tọa độ Y của điểm dưới phải của lưới ô vuông
7 Height float Độ cao của lưới ô vuông
8 ID_Terrain FK Int ID loại địa hình
Bảng 3.7: Cấu trúc bảng dữ liệu độ cao (tbDem)
Chương trình Import_DemToPGSQL này được thực hiện dựa trên ý tưởng sau: (1) Chia địa hình thành các lưới ô vuông 10 x 10.
Hình 3.1. Chuyển dữ liệu từ tệp DEM sang cấu trúc bảng (tbDEM)
(2) Coi mỗi ô vuông này như một điểm và quản lý điểm này dựa vào bộ tham số:
Tọa độ điểm trái trên (TopLeft_X, TopLeft_Y) Và tọa độ điểm phải dưới (BotRight_X, BotRight_Y) (3) Mỗi ô vuông sẽ có độ cao tương ứng Height.
Chi tiết thuật toán cho chương trình Import_DemToPGSQL như sau:
Thiết kế quan hệ giữa các bảng dữ liệu:
Hình 3.2. Mô hình quan hệ dữ liệu thuộc tính
3.3. Phân tích và thiết kế các chức năng của ứng dụng
Trong các phần trên, chúng tôi đã đặc tả yêu cầu của ứng dụng, thiết kế cơ sở dữ liệu và thực hiện tiền xử lý dữ liệu. Trong phần này sẽ thực hiện thiết kế các
1. Khởi tạo:
$topleft_x= tọa độ X điểm trái trên của quận ABC; $topleft_y= = tọa độ Y điểm trái trên của quận ABC; Bước nhẩy: $step=10; (Do chia lưới ô vuông là 10m x 10m) $x=0;
$y=$topleft_y;
2. Đọc từng giá trị theo từng dòng từ file DEM.asc cho tới hết file. 2.1. Đọc mỗi value trên cùng 1 hàng thì tăng biến $x = $x+10 2.2. Khi chuyển dòng mới thì giảm biến $y = $y-10.
2.3. Thêm vào bảng tbDem:
$sql="INSERT INTO tbdem(id, status, topleft_x, topleft_y, botright_x, botright_y, height, id_terrain) VALUES ($id, 0, $x, $y, $x+$step, $y-$step, $temp, 1)";
thuật toán và mô hình hóa các yêu cầu, các xử lý cho các chức năng của ứng dụng.
3.3.1. Mô hình hóa chức năng theo biểu đồ Use Case:
Do trong ứng dụng này chúng tôi có thừa kế các chức năng cơ bản của GIS mà đã được xây dựng trong tài liệu [3] nên ở đây sẽ chỉ phân tích và thiết kế các chức năng chính được xây dựng mới trong đề tài này. Các chức năng được mô hình hóa theo biểu đồ ca sử dụng (Use Case) như hình 3.3.
Hình 3.3: Biểu đồ ca sử dụng
Dựa trên điều kiện được xác định trong phần 1.2.1 chương 1, chi tiết thiết kế thuật toán tiền xử lý và xử lý của từng chức năng được mô tả như dưới đây.
3.3.2. Thiết kế các phép toán đƣợc dùng trong ứng dụng
(1) Xác định tọa độ của vị trí được chọn trên bản đồ
Khi thực hiện lựa chọn một điểm trên bản đồ, ta cần lấy được tọa độ điểm đó để có thể kiểm tra và tính toán. Phép toán này sẽ lấy về tọa độ của điểm được lựa chọn trên bản đồ. - Thuật toán: GetCoordinate() 1. Xác định tọa độ điểm ảnh: $nClickPixX = intval($HTTP_FORM_VARS[KEYMAP_x]); $nClickPixY = intval($HTTP_FORM_VARS[KEYMAP_y]); Và kích thước của ảnh: $dfWidthPix = doubleval($HTTP_FORM_VARS[KEYMAPXSIZE]); $dfHeightPix = doubleval($HTTP_FORM_VARS[KEYMAPYSIZE]);
2. Chuyển đổi tọa độ điểm ảnh qua tọa độ địa lý bằng hàm GMapPix2Geo()
$nClickGeoX = GMapPix2Geo($nClickPixX, 0, $dfWidthPix, $dfKeyMapXMin, $dfKeyMapXMax, 0);
$nClickGeoY = GMapPix2Geo($nClickPixY, 0, $dfHeightPix, $dfKeyMapYMin, $dfKeyMapYMax, 1);
3. Sử dụng hàm ms_newPointObj() để tạo đối tượng điểm.
$oClickGeo = ms_newPointObj();
4. Gán giá trị tọa độ cho đối tượng điểm
$oClickGeo->setXY($nClickGeoX, $nClickGeoY);
5. Sử dụng hàm truy vấn điểm:
@$gpoMap->queryByPoint ($oClickGeo, MS_SINGLE, -1)
6. Tọa độ thực của điểm được chọn là:
($oClickGeo->x, $oClickGeo->y)
(2) Xác định tình trạng sử dụng tại vị trí được lựa chọn CheckStatus()
Khi lựa chọn được điểm trên bản đồ, ta cần xác định tại điểm đó đã có đối tượng nào tồn tại hay chưa. Trong khuôn khổ ứng dụng này, sẽ sử quản lý các lớp bản đồ:
1. Lớp bản đồ phân bổ nhà ở: mỗi đối tượng nhà sẽ được quản lý bởi