Upload
vcoi-vit
View
104
Download
10
Embed Size (px)
Citation preview
i
LỜI CẢM ƠN
Chúng em xin chân thành cám ơn Khoa Công Nghệ Thông Tin, trường Đại Học
Khoa Học Tự Nhiên TpHCM đã tạo điều kiện tốt cho chúng em thực hiện đề tài
luận văn tốt nghiệp này.
Chúng em xin chân thành cám ơn Thầy Lê Thụy Anh đã tận tình hướng dẫn, chỉ
bảo chúng em trong suốt thời gian thực hiện đề tài.
Chúng em xin chân thành cám ơn quý Thầy Cô trong Khoa đã tận tình giảng
dạy, trang bị cho chúng em những kiến thức quý báu trong những năm học vừa qua.
Chúng con xin nói lên lòng biết ơn sâu sắc đối với Ông Bà, Cha Mẹ đã chăm
sóc, nuôi dạy chúng con thành người.
Xin chân thành cám ơn các anh chị và bạn bè đã ủng hộ, giúp đỡ và động viên
chúng em trong thời gian học tập và nghiên cứu.
Mặc dù chúng em đã cố gắng hoàn thành luận văn trong phạm vi và khả năng
cho phép nhưng chắc chắn sẽ không tránh khỏi những thiếu sót. Chúng em kính
mong nhận được sự cảm thông và tận tình chỉ bảo của quý Thầy Cô và các bạn.
Nhóm sinh viên thực hiện
Nguyễn Trung Kiên – Nguyễn Nguyên Bảo
Tháng 07/ 2005
ii
LỜI NÓI ĐẦU
Vào thời đại ngày nay, việc phát triển phần mềm không đơn thuần chỉ là ngồi gõ
chương trình như thời buổi ban đầu. Ngày nay, nhu cầu phát triển và mở rộng phần
mềm ngày càng đòi hỏi cao hơn, nhanh hơn và chuyên nghiệp hơn. Người sử dụng
phần mềm không chỉ là những người dùng bình thường mà còn là những nhà xây
dựng, phát triển phần mềm khác. Người phát triển phần mềm không còn xây dựng
phần mềm của mình từ chỗ không có gì, họ sẽ sử dụng lại cac phần mềm của những
nhà phát triển khác. Từ đó, nhu cầu đóng gói, trao đổi và mua bán các gói phần
mềm ngày càng tăng cao. Vào thời đại ngày nay, với sự phát triển của Internet cùng
với các công nghệ hướng Net khác kèm theo, việc trao đổi, mua bán các gói phần
mềm và việc thực thi chúng ngày càng thuận lợi và nhanh chóng hơn. Từ đó, dẫn
đến sự ra đời của nhiều giải pháp phát triển phần mềm khác nhau, chẳng hạn như
DCOM, RMI, CORBRA,… Nhưng trong đó, nổi bật và chiếm nhiều ưu điểm nổi
trội phải kể đến giải pháp phát triển phần mềm dựa trên Kiến trúc Hướng Dịch vụ
(SOA – Service Oriented Architecture) và triển khai trên cơ chế Web Service.
Việc áp dụng giải pháp dịch vụ web cho ứng dụng GIS đang được triển khai
ngày càng rộng rãi. Do nó hoàn toàn giải quyết được các yêu cầu đặt ra bởi các ứng
dụng GIS.
Chính vì thế, việc tiến hành nghiên cứu kỹ thuật lập trình Web Service là một
hướng nghiên cứu mang tính chiến lược cho sự phát triển các ứng dụng trong tương
lai. Đề tài luận văn của chúng em là “Tìm hiểu về dịch vụ web cho ứng dụng GIS
và xây dựng ứng dụng minh họa khai thác dịch vụ” gồm có tất cả 8 chương.
Chương 1. Tổng quan: Giới thiệu khái quát về Web Service, GIS, chuẩn
OpenGIS và mục tiêu của đề tài.
Chương 2. Web Map Service (WMS): Nghiên cứu chuẩn WMS do OpenGIS
đưa ra, chuẩn này hỗ trợ việc hiển thị bản đồ thông qua dịch vụ web.
iii
Chương 3. Web Feature Service (WFS): Nghiên cứu chuẩn WFS do OpenGIS
đưa ra, chuẩn này hỗ trợ cho việc truy vấn thông tin các dữ liệu địa lý qua dịch vụ
web.
Chương 4. Bộ lọc (Filter): Nghiên cứu sâu hơn về bộ lọc dùng trong dịch vụ
WFS.
Chương 5. CarbonTool: Nghiên cứu công cụ CarbonTool hỗ trợ cho việc đọc
các chuẩn WMS và WFS.
Chương 6. Cài đặt chương trình OpenGISServer: Mô tả việc xây dựng
chương trình server hỗ trợ hai chuẩn WMS và WFS của OpenGIS.
Chương 7. Cài đặt chương trình client: Mô tả việc xây dựng hai ứng dụng
khách khai thác hai dịch vụ WMS và WFS.
Chương 8. Tổng kết: Tổng kết quá trình nghiên cứu và rút ra hướng phát triển
trong tương lai.
iv
MỤC LỤC
MỤC LỤC .........................................................................................................................iv
DANH SÁCH HÌNH........................................................................................................ix
DANH SÁCH BẢNG........................................................................................................x
DANH SÁCH BẢNG........................................................................................................x
MỘT SỐ THUẬT NGỮ..................................................................................................xi
Chương 1. Tổng quan ......................................................................................................1
1.1. Đặt vấn đề và mục tiêu đề tài........................................................................1
1.2. Giới thiệu Web Service..................................................................................3
1.3. Giới thiệu hai chuẩn WMS và WFS ............................................................3
Chương 2. Web Map Service (WMS)...........................................................................5
2.1. Giới thiệu.........................................................................................................5
2.2. Các element cơ sở...........................................................................................5
2.2.1. Đánh số và thỏa thuận phiên bản (version)...............................5
2.2.2. Những quy tắc chung trong HTTP request ...............................7
2.2.3. Những quy tắc chung trong HTTP response.............................8
2.2.4. Những quy tắc về tham số trong câu request ............................8
2.2.5. Các tham số thông dụng trong câu request ...............................9
2.2.6. Kết quả dịch vụ ...........................................................................13
2.2.7. Biệt lệ dịch vụ .............................................................................13
2.3. Các operation của Web Map Service.........................................................14
2.3.1. GetCapabilities ...........................................................................14
2.3.2. GetMap ........................................................................................26
2.3.3. GetFeatureInfo ............................................................................32
v
Chương 3. Web Feature Service (WFS) ....................................................................36
3.1. Giới thiệu.......................................................................................................36
3.2. Các thành phần dịch vụ cơ sở .....................................................................38
3.2.1. Mã hóa câu request.....................................................................38
3.2.2. Không gian tên............................................................................38
3.3. Các thành phần chung..................................................................................38
3.3.1. Định danh của Feature (Feature identifier) .............................38
3.3.2. Định danh duy nhất toàn cầu ....................................................39
3.3.3. Trạng thái của Feature (Feature State).....................................40
3.3.4. Tên của các thuộc tính ...............................................................40
3.3.5. Tham chiếu đến thuộc tính ........................................................41
3.3.6. Thành phần <Native> ................................................................47
3.3.7. Filter .............................................................................................48
3.3.8. Thông báo về các biệt lệ (Exception Reporting) ....................48
3.3.9. Các thuộc tính XML chung.......................................................49
3.4. DescribeFeatureType ...................................................................................50
3.4.1. Giới thiệu.....................................................................................50
3.4.2. Request ........................................................................................50
3.4.3. Response......................................................................................51
3.4.4. Biệt lệ ...........................................................................................52
3.5. GetFeature .....................................................................................................52
3.5.1. Giới thiệu.....................................................................................52
3.5.2. Request ........................................................................................53
3.5.3. Response......................................................................................55
3.5.4. Biệt lệ ...........................................................................................56
3.6. LockFeature...................................................................................................56
3.6.1. Giới thiệu.....................................................................................56
3.6.2. Request ........................................................................................57
3.6.3. Response......................................................................................58
vi
3.6.4. Biệt lệ ...........................................................................................59
3.7. Transaction ....................................................................................................60
3.7.1. Giới thiệu.....................................................................................60
3.7.2. Request ........................................................................................60
3.7.3. Response......................................................................................69
3.7.4. Biệt lệ ...........................................................................................72
3.8. GetCapabilities .............................................................................................72
3.8.1. Giới thiệu.....................................................................................72
3.8.2. Request ........................................................................................72
3.8.3. Response......................................................................................73
3.8.4. Biệt lệ ...........................................................................................73
Chương 4. Bộ lọc (Filter)...............................................................................................74
4.1. Giới thiệu:......................................................................................................74
4.2. Sử dụng Filter: ..............................................................................................74
4.3. Đặc tả của Filter: ..........................................................................................74
4.4. Các phép toán không gian (Spatial Operators) .........................................75
4.4.1. Mục đích......................................................................................75
4.4.2. Mô tả ............................................................................................75
4.5. Các phép toán so sánh (Comparison operators) .......................................78
4.5.1. Giới thiệu:....................................................................................78
4.5.2. Mô tả: ...........................................................................................78
4.6. Các phép toán Logic ....................................................................................82
4.6.1. Giới thiệu:....................................................................................82
4.6.2. Mô tả: ...........................................................................................82
4.7. Định danh của Feature (Feature Identifier):..............................................83
4.7.1. Giới thiệu:....................................................................................83
4.7.2. Mô tả: ...........................................................................................84
vii
4.8. Biểu thức (Expressions): .............................................................................84
4.8.1. Giới thiệu:....................................................................................84
4.8.2. Mô tả: ...........................................................................................84
4.9. Các phép toán số học: ..................................................................................84
4.9.1. Giới thiệu:....................................................................................84
4.9.2. Mô tả: ...........................................................................................84
4.10. Các hàm (Functions) ....................................................................................85
4.10.1. Giới thiệu:....................................................................................85
4.10.2. Mô tả: ...........................................................................................86
4.11. Các khả năng về Filter: ................................................................................86
Chương 5. Carbon Tool.................................................................................................91
5.1. Giới thiệu.......................................................................................................91
5.2. Một số ví dụ về việc sử dụng bộ thư viện CarbonTools..........................92
5.2.1. Dùng CarbonTools thực hiện GetCapabilities request ..........92
5.2.2. Dùng CarbonTools thực hiện GetFeature request..................96
5.3. Dùng CarbonTools gởi GetMap request .................................................102
5.3.1. Lớp CarbonTools.Core.WMS.SourceWMS ........................102
5.3.2. Lớp CarbonTools.Core.Base.DataRaster ..............................103
5.3.3. Lớp CarbonTools.Core.WMS.HandlerWMS .......................103
5.3.4. Vi dụ thực hiện GetMap request.............................................104
5.4. Dùng CarbonTools gởi DescribeFeatureType request ..........................105
5.5. Dùng CarbonTools gởi request của Transaction và LockFeature ........106
Chương 6. Cài đặt chương trình OpenGIS Server ...............................................107
6.1. Giới thiệu.....................................................................................................107
6.2. Tổ chức và lưu trữ dữ liệu.........................................................................107
6.3. Giao tiếp với client bằng giao thức HTTP ..............................................114
6.3.1. Nhận dữ liệu từ client bằng giao thức HTTP GET: .............114
6.3.2. Nhận dữ liệu từ client bằng giao thức HTTP POST ............114
viii
6.3.3. Trả kết quả về cho Client.........................................................115
6.4. Đọc dữ liệu từ chuỗi XML........................................................................115
6.4.1. Ví dụ đọc 1 tài liệu Xml ..........................................................115
6.5. Các lớp trong chương trình .......................................................................118
Chương 7. Cài đặt các chương trình client .............................................................126
7.1. Cài đặt chương trình OpenGisClientDemo.............................................126
7.1.1. Giới thiệu...................................................................................126
7.1.2. Gởi request cho server .............................................................135
7.2. Cài đặt chương trình OpenGisClientApplication ...................................144
7.2.1. Tính năng...................................................................................144
7.2.2. Màn hình giao diện...................................................................145
Chương 8. Tổng kết ......................................................................................................147
8.1. Kết quả đạt được.........................................................................................147
8.2. Hướng phát triển.........................................................................................147
PHỤ LỤC - MySQL với phần mở rộng hỗ trợ cho OpenGIS ...........................148
TÀI LIỆU THAM KHẢO ...........................................................................................171
ix
DANH SÁCH HÌNH
Hình 1.1. Kiến trúc các dịch vụ web của OGC .......................................................4
Hình 2.1. Hình chữ nhật bao..................................................................................12
Hình 3.1. Lược đồ giao thức..................................................................................37
Hình 7.1. Màn hình chính ....................................................................................127
Hình 7.2. Màn hình minh họa thực hiện request WFS – GetCapabilities ...........128
Hình 7.3. Màn hình minh họa thực hiện request WFS – DescribeFeatureType..129
Hình 7.4. Màn hình minh họa thực hiện request WFS – GetFeature ..................130
Hình 7.5. Màn hình minh họa thực hiện request WFS – GetFeature ..................131
Hình 7.6. Màn hình minh họa thực hiện request WFS – Transaction .................132
Hình 7.7. Màn hình minh họa thực hiện request WMS – GetCapabilities..........133
Hình 7.8. Màn hình minh họa thực hiện request WMS – GetMap......................134
Hình 7.9. Màn hình giao diện chương trình OpenGISClientApplication............145
Hình 7.10. Màn hình lấy thông tin một điểm trên bản đồ .....................................146
x
DANH SÁCH BẢNG
Bảng 2.1. Các ký tự quy ước trong câu HTTP GET URL..........................................7
Bảng 2.2. Danh sách các kiểu MIME..........................................................................10
Bảng 2.3. Các tham số trong GetCapabilities request URL .....................................14
Bảng 2.4. Mối quan hệ giữa giá trị UpdateSequence trong client và server...........15
Bảng 2.5. Thuộc tính lớp...............................................................................................23
Bảng 2.6. Qui định kế thừa các thuộc tính lớp ...........................................................26
Bảng 2.7. Các tham số trong GetMap request............................................................27
Bảng 2.8. Các tham số của request GetFeatureInfo...................................................33
Bảng 5.1. Các thuộc tính của SourceOGCCapabilities .............................................92
Bảng 5.2. Các thuộc tính quan trọng của DataOGCCapabilities .............................93
Bảng 5.3. Các thuộc tính của HandlerOGCCapabilities ...........................................94
Bảng 5.4. Các thuộc tính của CarbonTools.Core.WFS.SourceWFS.......................97
Bảng 5.5. Các thuộc tính của CarbonTools.Core.Features.DataFeatures ...............97
Bảng 5.6. Các thuộc tính của CarbonTools.Core.WFS.HandlerWFS.....................98
Bảng 5.7. Các thuộc tính của CarbonTools.Core.WMS.SourceWMS..................103
Bảng 5.8. Các thuộc tính của CarbonTools.Core.Base.DataRaster .......................103
Bảng 5.9. Các thuộc tính của CarbonTools.Core.WMS.HandlerWMS................104
Bảng 6.1. Các bảng dữ liệu trong CSDL TpHCM...................................................108
Bảng 6.2. Cấu trúc chung của các bảng dữ liệu .......................................................109
Bảng 6.3. Bảng “duong”..............................................................................................110
Bảng 6.4. Bảng “quan”................................................................................................111
Bảng 6.5. Bảng “song” ................................................................................................111
Bảng 6.6. Bảng “tuyensinh” .......................................................................................112
Bảng 6.7. Bảng “ypagesit” ..........................................................................................113
Bảng 6.8. Các lớp trong chương trình .......................................................................125
xi
MỘT SỐ THUẬT NGỮ
Operation Đặc tả của phép biến đổi hoặc truy vấn trên một đối
tượng có thể được gọi thực thi.
Client Phần mềm có thể gọi operation từ server
Request Lời yêu cầu operation của client cho server.
Response Kết quả trả về của operation mà serve gửi cho client.
Tài liệu Capabilities XML Tài liệu metadata mô tả các operation mà một dịch vụ
hỗ trợ.
OGC Tổ chức Open GIS Consortium
OWS – OGC Web Service Các dịch vụ web của OGC
WMS Dịch vụ Web Map Service
WFS Dịch vụ Web Feature Service
Chương 1. Tổng quan
1
Chương 1. Tổng quan
1.1. Đặt vấn đề và mục tiêu đề tài Hệ thống thông tin địa lý (GIS) là một công cụ máy tính để lập bản đồ và phân
tích các sự vật, hiện tượng thực trên trái đất. GIS lưu giữ thông tin về thế giới thực
dưới dạng tập hợp các lớp chuyên đề có thể liên kết với nhau nhờ các đặc điểm địa
lý.
Điều này đơn giản nhưng vô cùng quan trọng và là một công cụ đa năng đã được
chứng minh là rất có giá trị trong việc giải quyết nhiều vấn đề thực tế, từ thiết lập
tuyến đường phân phối của các chuyến xe, đến lập báo cáo chi tiết cho các ứng
dụng quy hoạch, mô phỏng sự lưu thông khí quyển toàn cầu, cho đến việc xác lập
các hệ định vị toàn cầu.
Hiện nay, công nghệ GIS được nghiên cứu ứng dụng đa dạng, đa tầng trong
nhiều lĩnh vực khác nhau (phân tích các sự kiện, dự đoán tác động và hoạch định
chiến lược). Các chuyên gia của mọi lĩnh vực đều nhận thức được những ưu điểm
của sự kết hợp công việc của họ và GIS.
Chính vì thế, việc tìm hiểu các dịch vụ web cho ứng dụng GIS và xây dựng ứng
dụng minh họa khai thác dịch vụ không chỉ là một yêu cầu mang tính khoa học của
ngành công nghệ thông tin mà còn là một đòi hỏi của chính thực tiễn đời sống trong
bối cảnh toàn cầu hoá.
Yêu cầu ứng dụng công nghệ GIS đang phát triển cả về chiều rộng lẫn chiều sâu
đang đặt ra nhiều thách thức kỹ thuật trong quá trình thu thập, phân tích và xử lý dữ
liệu với khối lượng lớn.
Các dữ liệu GIS từ nhiều nguồn và có thể được định dạng theo nhiều chuẩn khác
nhau. Do đó, khi khai thác dữ liệu này, người sử dụng dễ vấp phải những trở ngại
lớn về vấn đề tính tương thích, cũng như những rắc rối trong việc mua bán phần
mềm, làm quen với việc sử dụng phần mềm, chưa kể đến việc phải bỏ ra một lượng
tiền lớn để mua toàn bộ các dữ liệu do nhà cung cấp xây dựng, trong khi hầu hết các
Chương 1. Tổng quan
2
trường hợp ta chỉ cần một phần thông tin trong đó mà thôi. Các dữ liệu này được
đưa về và lưu trữ tập trung ở một nơi, lại phải bỏ ra một khoản tiền không nhỏ khác
cho việc lưu trữ, bảo trì và cập nhật chúng. Rõ ràng là tiêu phí công sức, thời gian,
và tiền bạc một cách vô ích.
Để khắc phục những trở ngại này, việc tiến hành xây dựng các dịch vụ web hỗ
trợ GIS là một giải pháp tốt hiện đang được rất nhiều nơi trên thế giới và trong nước
triển khai thực hiện. Thay vì dồn các dữ liệu lại một nơi và xử lý tập trung trên đó,
giải pháp dịch vụ web lại đi theo con đường xử lý phân tán. Mọi thông tin yêu cầu
và đáp ứng đều được gửi và nhận thông qua Internet.
Nhờ mang lại được những tiện ích thiết thực, các dịch vụ web hỗ trợ GIS đang
ngày càng phát triển nhanh và rộng khắp đến mức làm nảy sinh nhu cầu xây dựng
một chuẩn chung áp dụng rộng rãi trên toàn cầu dành riêng cho các dịch vụ web hỗ
trợ GIS, nhằm đáp ứng mục tiêu hợp tác, giao tiếp được với các dịch vụ web hỗ trợ
GIS trên phạm vi toàn cầu. Nhận thấy yêu cầu đó, tổ chức OGC đã đưa ra các chuẩn
chung thống nhất cho các dịch vụ web hỗ trợ GIS. Trong đó, hai chuẩn được xem là
cơ sở và sử dụng phổ biến nhất là Web Map Service (WMS) và Web Feature
Service (WFS).
Hiện nay, trên thế giới và ở nước ta đã có rất nhiều nơi tiến hành nghiên cứu và
xây dựng các server cung cấp các dịch vụ WMS và WFS nhằm hỗ trợ cho các bài
toán về thông tin địa lý ở những mức độ khác nhau. Tuy nhiên hầu như chỉ có một
số giải pháp được tiến hành theo hướng cung cấp các dịch vụ web trên cơ sở hỗ trợ
tối đa mọi hàm thuộc hai chuẩn WMS và WFS. Do đó, luận văn này hướng vào
mục tiêu nghiên cứu và xây dựng thành công server hỗ trợ đầy đủ các giao tác của
hai dịch vụ WMS và WFS, đồng thời xây dựng các ứng dụng client minh họa khả
năng của server này.
Lý do chọn chuẩn WMS và WFS là do nó đạt tính chuẩn hóa và tính quốc tế
cao, được sử dụng phổ biến và được kiểm nghiệm nghiêm ngặt.
Chương 1. Tổng quan
3
1.2. Giới thiệu Web Service Web Service thực chất là sự kết hợp các máy tính cá nhân với các thiết bị khác,
là một phương thức tích hợp các cơ sở dữ liệu và các mạng để tạo thành một cơ cấu
tính toán ảo mà người sử dụng có thể làm việc thông qua các trình duyệt Web. Bản
thân các dịch vụ này hoạt động thông qua các server trên nền Web chứ không phải
là các máy tính cá nhân, do vậy có thể chuyển các chức nǎng từ máy tính cá nhân
lên Internet. Người sử dụng có thể sử dụng các dịch vụ thông qua bất kỳ loại máy
nào có hỗ trợ Web Service và có khả năng truy cập Internet, kể cả các thiết bị cầm
tay.
Người sử dụng có thể truyền các dữ liệu và các ứng dụng từ máy tính cá nhân tới
các server của một nhà cung cấp Web Service. Các server này trở thành nguồn tiềm
nǎng cung cấp cho người sử dụng cả về độ an toàn, độ riêng tư và khả nǎng truy
nhập.
Các server ứng dụng sẽ là một phần quan trọng của các Web Service bởi vì
thông thường, các server này thực hiện các ứng dụng phức tạp dựa trên sự chuyển
giao giữa người sử dụng và các chương trình kinh doanh hay các cơ sở dữ liệu của
một tổ chức nào đó.
1.3. Giới thiệu hai chuẩn WMS và WFS Tổ chức OpenGis (OGC – OpenGis Consortium) đã đưa ra ba chuẩn dịch vụ
truy cập thông tin địa lý mang tính chuẩn hóa cao là :Web Map Service (WMS),
Web Feature Service (WFS) và Web Coverage Service (WCS). Ngoài ra còn có các
chuẩn khác như GeoParser và GeoCoder. Hình sau đây mô ta sơ đồ kiến trúc các
dịch vụ Web của tổ chức OGC.
Chương 1. Tổng quan
4
Hình 1.1.Kiến trúc các dịch vụ web của OGC
Trong đó, hai chuẩn WMS và WFS là hai chuẩn cơ bản được sử dụng rất nhiều
nhằm cung cấp các dịch vụ biểu diễn các thông tin địa lý ra ảnh bản đồ và truy vấn
các dữ liệu địa lý đó.
Chương 2. Web Map Service (WMS)
5
Chương 2. Web Map Service (WMS)
2.1. Giới thiệu Web Map Service (WMS) là một dịch vụ giúp tạo ra các bản đồ dựa trên các dữ
liệu địa lý. Bản đồ ở đây được hiểu như một cách thể hiện trực quan của dữ liệu địa
lý còn bản thân bản đồ không được xem là dữ liệu. Các bản đồ này được hiển thị
dưới các định dạng ảnh như PNG, GIF, JPEG hoặc các định dạng thành phần đồ
họa vector như SVG (Scalable Vector Graphics), WebCGM (Web Computer
Graphics Metafile). Một WMS sẽ hỗ trợ ba operation, trong đó hai operation đầu là
bắt buộc cho mọi WMS.
1) GetCapabilities: cung cấp các thông tin metadata ở mức dịch vụ, đó là đặc tả
cho các thông tin của dịch vụ WMS và các tham số cần thiết cho các câu yêu cầu
request.
2) GetMap: cung cấp ảnh bản đồ khi nhận được các tham số về chiều và thông
tin không gian địa lý hợp lệ.
3) GetFeatureInfo: truy vấn thông tin của các feature trên bản đồ.
Trình duyệt web có thể yêu cầu WMS thực hiện các operation này bằng cách gửi
các câu request dưới dạng URL. Nội dung của câu URL này phụ thuộc vào việc gọi
thực hiện tác vụ nào.
2.2. Các element cơ sở
2.2.1. Đánh số và thỏa thuận phiên bản (version)
2.2.1.1. Cách thức đánh số phiên bản
Mỗi phiên bản được biểu diễn bằng một bộ số gồm ba số nguyên dương, cách
nhau bởi dấu “.”, nó có dạng như sau “x.y.z”. Trong đó hai số “y” và “z” không
vượt quá 99. Mỗi đặc tả OWS được đánh số độc lập.
Chương 2. Web Map Service (WMS)
6
2.2.1.2. Thay đổi phiên bản
Mỗi một bộ số phiên bản của một đặc tả sẽ được đánh số lại tương ứng với mỗi
lần thay đổi đặc tả đó. Bộ số này sẽ được tăng đều và vẫn không nhiều hơn ba số
nguyên. Có thể các lần tăng sẽ không liên tục nhau.
Số phiên bản xuất hiện trong ít nhất hai chỗ: một ở trong tài liệu Capabilities
XML mô tả dịch vụ, và một trong danh sách tham số của câu request yêu cầu dịch
vụ do client gửi. Mỗi dịch vụ có thể hỗ trợ nhiều phiên bản, và mỗi client có thể
hiểu được nhiều phiên bản. Khi client gửi một câu request yêu cầu dịch vụ thì số
phiên bản trong danh sách tham số của câu request này phải được dịch vụ đó hỗ trợ,
nếu không client sẽ tiến hành thỏa thuận với dịch vụ để chọn ra phiên bản đặc tả
phù hợp. Nếu không thỏa thuận được thì sẽ ngừng liên lạc. Quá trình thỏa thuận
được thực hiện qua operation GetCapabilities và tuân theo qui tắc sau:
Tất cả tài liệu Capabilities XML đều có trong đó một con số phiên bản. Khi
client gửi một request GetCapabilities dịch vụ sẽ xem phiên bản này có phù hợp với
phiên bản trong đặc tả hay không, nếu không sẽ tiến hành thỏa thuận để đạt được
phiên bản phù hợp. Nếu trong request không có số phiên bản thì server sẽ đáp ứng
lại với phiên bản cao nhất mà nó hiểu.
Việc thỏa thuận phiên bản được tiến hành theo trình tự sau:
1)Nếu server hiểu được phiên bản trong câu request thì nó sẽ gửi phiên bản này.
2a)Nếu server không hiểu được phiên bản trong câu request thì nó sẽ gửi lại
phiên bản cao nhất nhỏ hơn phiên bản này.
2b)Nếu phiên bản trong câu request nhỏ hơn bất cứ phiên bản nào mà server hỗ
trợ thì server sẽ gửi lại phiên bản nhỏ nhất mà nó hỗ trợ.
3a)Nếu client vẫn không hiểu phiên bản mới mà server mới gửi lại, thì nó hoặc
là ngừng liên lạc với server hoặc là gửi lại một request mới với phiên bản mà client
hiểu song nhỏ hơn phiên bản mà server vừa gửi. (nếu phiên bản server gửi nhỏ hơn
phiên bản client đã yêu cầu)
Chương 2. Web Map Service (WMS)
7
3b)Nếu phiên bản server gửi lớn hơn phiên bản client đã yêu cầu và client vẫn
không hiểu thì nó sẽ gửi lại một request mới với phiên bản lớn hơn phiên bản server
đã gửi.
Việc thỏa thuận cứ tiếp diễn cho đến khi cả hai đều hiểu được phiên bản thỏa
thuận hoặc đến khi client quyết định ngừng liên lạc với server.
Ví dụ 1: Server hiểu các phiên bản 1, 2, 4, 5 và 8. Client hiểu các phiên bản 1, 3,
4, 6 và 7. Client yêu cầu phiên bản 7. Server trả về phiên bản 5. Client gửi lại yêu
cầu khác với phiên bản 4. Server trả về phiên bản 4, client đồng ý và kết thúc quá
trình thương thảo thành công.
Ví dụ 2: Server hiểu các phiên bản 4, 5 và 8. Client hiểu phiên bản 3. Client yêu
cầu phiên bản 3. Server trả về phiên bản 4. Client không hiểu phiên bản này và bất
cứ phiên bản cao hơn nào khác do đó quá trình thương thảo thất bại. Client ngừng
liên lạc với server.
2.2.2. Những quy tắc chung trong HTTP request
2.2.2.1. HTTP GET
Các ký tự quy ước trong câu HTTP GET URL
Ký tự Ý nghĩa
? Phân cách phần đầu của câu truy vấn.
& Phân cách các tham số trong câu truy vấn.
= Phân cách tên và giá trị của tham số.
/ Phân cách kiểu MIME và kiểu con trong giá trị tham số định dạng.
: Phân cách giữa Namespace và Identifier trong tham số SRS.
, Phân cách giữa các giá trị riêng biệt trong danh sách tham số.
Bảng 2.1.Các ký tự quy ước trong câu HTTP GET URL
HTTP GET request thực chất là một tiền tố URL được gắn thêm vào các tham
số để tạo nên một câu request hợp lệ đến operation.
Chương 2. Web Map Service (WMS)
8
Tiền tố URL bao gồm giao thức, tên host, số port, đường dẫn và dấu chấm hỏi
“?”.
Các tham số là các cặp tên/giá trị và phân cách nhau bởi dấu “&”
Một HTTP GET URL sẽ có dạng như sau: http://host[:port]/path?{name[=value]&}
2.2.2.2. HTTP POST
Các request cho operation sử dụng HTTP POST chưa được định nghĩa trong
WMS.
2.2.3. Những quy tắc chung trong HTTP response Khi nhận được một request hợp lệ, dịch vụ sẽ gửi về một response tương ứng
đúng với những gì request yêu cầu ngọai trừ trường hợp xảy ra thỏa thuận phiên bản
thì có thể cho kết quả khác.
Khi nhận được một request không hợp lệ, dịch vụ sẽ gửi về một ngoại biệt dịch
vụ (Service Exception).
Các đối tượng trả về trong response phải theo kiểu MIME (Multipurpose
Internet Mail Extensions).
2.2.4. Những quy tắc về tham số trong câu request Tên tham số không phân biệt hoa thường.
Giá trị của tham số có phân biệt hoa thường.
Trật tự các tham số có thể tùy ý.
Các tham số có giá trị là một danh sách thì các giá trị được phân cách nhau
bởi dấu phẩy “,”, không được dùng khoảng trắng để phân cách.
Các tham số có giá trị là một danh sách thì khi có một giá trị nào đó là trống
thì để trống giá trị đó (“,,”)
Chương 2. Web Map Service (WMS)
9
2.2.5. Các tham số thông dụng trong câu request
2.2.5.1. VERSION
Tham số VERSION đặc tả số phiên bản. Định dạng và quá trình thỏa thuận
phiên bản đã được đề cập ở trên.
2.2.5.2. REQUEST
Tham số REQUEST chỉ ra operation nào trong dịch vụ cần được thực thi. Giá trị
của nó là tên của một trong các operation mà OWS hỗ trợ.
2.2.5.3. FORMAT
Tham số FORMAT chỉ ra định dạng trả về của response cho một operation.
Một dịch vụ có thể chỉ hỗ trợ một tập con các định dạng được biết của các kiểu
trong operation. Server sẽ quảng cáo các định dạng mà nó hỗ trợ trong tài liệu
Capabilities XML và chấp nhận đáp ứng tất cả các request yêu cầu các định dạng
mà nó hỗ trợ. Nếu như request có một định dạng không được cung cấp bởi server
thì server sẽ gửi đi một biệt lệ dịch vụ (với mã “InvalidFormat”).
Ngược lại, một client cũng có thể chỉ chấp nhận được một tập con các định dạng
được biết của các kiểu trong operation. Nếu client và dịch vụ không cùng đưa ra
được một định dạng chung (cùng hỗ trợ) thì hoặc là client ngừng liên lạc với dịch
vụ đó, hoặc là tìm một nhà cung cấp dịch vụ trung gian có khả năng chuyển đổi các
định dạng, hoặc là dùng phương pháp khác (chẳng hạn như lưu xuống bộ nhớ hoặc
chuyển qua ứng dụng giúp đỡ).
Các định dạng trong cả tài liệu Capabilities XML và trong request đến operation
đều có kiểu MIME. Mỗi operation có một danh sách các định dạng hỗ trợ riêng biệt.
Chương 2. Web Map Service (WMS)
10
Kiểu MIME Nội dung tài liệu
application/vnd.ogc.wms_xml WMS Capabilities XML
application/vnd.ogc.gml Geography Markup Language XML
application/vnd.ogc.se_xml Service Exception XML
application/vnd.ogc.se_inimage Hình với các thông điệp biệt lệ
application/vnd.ogc.se_blank Hình trắng do biệt lệ xảy ra
Bảng 2.2.Danh sách các kiểu MIME
2.2.5.4. EXCEPTIONS
Tham số EXCEPTIONS chỉ ra định dạng để thông báo lỗi.
2.2.5.5. Hệ quy chiếu không gian (Spatial Reference System (SRS))
SRS là một tham số text dùng để chỉ hệ trục tọa độ nằm ngang. Nó bao gồm một
tiền tố namespace, một dấu hai chấm “:”, và một con số. Có hai loại namespace:
EPSG và AUTO.
Một dịch vụ có thể không hỗ trợ hết tất cả các SRS. Server sẽ quảng cáo các
SRS mà nó hỗ trợ trong tài liệu Capabilities XML và chấp nhận đáp ứng tất cả các
request yêu cầu các SRS mà nó hỗ trợ. Nếu như request có một SRS không được
cung cấp bởi server thì server sẽ gửi đi một biệt lệ dịch vụ (với mã “InvalidSRS”).
Ngược lại, một client cũng không cần hỗ trợ hết tất cả các SRS. Nếu client và
dịch vụ không cùng đưa ra được một SRS chung (cùng hỗ trợ) thì hoặc là client
ngừng liên lạc với dịch vụ đó, hoặc là tìm một nhà cung cấp dịch vụ trung gian có
khả năng chuyển đổi hệ trục tọa độ, hoặc là dùng phương pháp khác.
2.2.5.5.1. Không gian tên EPSG Không gian tên EPSG được dựa trên các bảng dữ liệu của Nhóm Khảo sát Dầu
hỏa Châu Âu (European Petroleum Survey Group). Nó định nghĩa những con số đặc
trưng cho các phép chiếu, hệ trục tọa độ chuẩn, đơn vị đo, kinh tuyến gốc,...
Chương 2. Web Map Service (WMS)
11
Ví dụ, khi tham số SRS chỉ ra Hệ qui chiếu Tọa độ Địa lý (Geographic
Coordinate Reference System) thì sẽ là “EPSG:4326”.
2.2.5.5.2. Không gian tên AUTO Không gian tên AUTO được dùng cho các phép chiếu tự động, đó là tập các
phép chiếu với tâm chiếu tùy ý. Một request chứa tham số SRS chỉ ra một phép
chiếu tự động sẽ bao gồm tiền tố không gian tên AUTO, một con số định danh cho
không gian tên AUTO, một con số định danh cho không gian tên EPSG mà chỉ ra
đơn vị cho hình chữ nhật bao trong SRS này, và giá trị của kinh độ và vĩ độ trung
tâm.
Nó có dạng: AUTO:auto_proj_id,epsg_units_id,lon0,lat0
Ví dụ: một dịch vụ hỗ trợ phép chiếu trực giao tự động (Auto Orthographic
projection) sẽ thêm vào element "<SRS>AUTO:42003</SRS>" trong tài liệu
Capabilities XML của nó.
2.2.5.5.3. SRS không xác định Server cũng có thể đưa ra thông tin địa lý mà hệ quy chiếu không gian của nó
không được xác định một cách chính xác. Chẳng hạn như tập hợp các bản đồ lịch sử
vẽ bằng tay được số hóa có thể biểu diễn một vùng trên trái đất nhưng không theo
một hệ tọa độ hiện đại nào. Trong trường hợp này, giá trị “NONE” (viết hoa) sẽ
được dùng khi muốn chỉ ra SRS của tập hợp các bản đồ này.
2.2.5.6. Hình chữ nhật bao
Hình chữ nhật bao là một tập bốn con số nguyên được phân cách bởi dấu phẩy
“,”. Nó biểu diễn các giá trị minX, minY, maxX, maxY theo đơn vị của SRS trong
request. Trong đó, X biểu diễn cho các trục kinh tuyến, Y biểu diễn cho các trục vĩ
tuyến. Mối quan hệ giữa hình chữ nhật bao và ma trận các điểm ảnh được biểu diễn
trong hình dưới đây: hình chữ nhật bao sẽ bao chung quanh các điểm ảnh của ảnh
chứ không đi qua tâm của các điểm ảnh ngòai rìa. Trong ngữ cảnh này, mỗi một
điểm ảnh đều có diện tích.
Chương 2. Web Map Service (WMS)
12
Hình 2.1.Hình chữ nhật bao
Một hình chữ nhật bao không thể có diện tích bằng 0.
Nếu một request đưa ra một hình chữ nhật bao không hợp lệ (ví dụ minX ≥
maxX hay minY ≥ maxY) thì server sẽ đưa ra một biệt lệ.
Nếu một request đưa ra một hình chữ nhật bao không hề giao nhau với hình chữ
nhật bao được đưa ra trong tài liệu Capabilities XML cho đối tượng thông tin địa lý
được yêu cầu, thì server sẽ trả về giá trị rỗng (ví dụ: một bản đồ trắng, ...) cho
element này. Bất kỳ element nào nằm một phần hoặc toàn bộ trong hình chữ nhật
bao sẽ được trả về với định dạng tương ứng.
2.2.5.7. Chiều thời gian
Một vài thông tin địa lý có thể có giá trị trong nhiều thời điểm khác nhau, ví dụ
như bản đồ thời tiết theo giờ. Dịch vụ cần phải thông báo các giờ có thể trong tài
liệu Capabilities XML , và một vài operation cần có thêm tham số để yêu cầu lấy
thông tin về thời gian. Tùy theo ngữ cảnh, giá trị thời gian có thể là một giá trị đơn,
danh sách các giá trị, khoảng thời gian,…
Chương 2. Web Map Service (WMS)
13
2.2.5.8. Chiều cao
Một vài thông tin địa lý có thể có giá trị trong nhiều độ cao khác nhau, ví dụ như
bản đồ mật độ tầng ozone tại các độ cao khác nhau trong khí quyển. Dịch vụ cần
phải thông báo các độ cao có thể trong tài liệu Capabilities XML , và một vài
operation cần có thêm tham số để yêu cầu lấy thông tin về độ cao. Một giá trị độ
cao đơn là một số nguyên hoặc số thực mà đơn vị của nó được đưa ra trong dữ liệu
của EPSG. Tùy theo ngữ cảnh, giá trị độ cao có thể là một giá trị đơn, danh sách các
giá trị, khoảng cách,…
2.2.5.9. Các chiều khác
Một vài thông tin địa lý có thể có thêm nhiều chiều khác, chẳng hạn như ảnh vệ
tinh ở các dải bước sóng khác nhau. Các chiều khác ngoài bốn chiều không gian
được xem như là các “chiều mẫu”. Dịch vụ cần phải thông báo các chiều mẫu có thể
trong tài liệu Capabilities XML , và một vài operation cần có thêm cơ chế để thêm
các tham số chiều mẫu. Mỗi một chiều mẫu có môt tên và một hoặc nhiều giá trị
hợp lệ.
2.2.6. Kết quả dịch vụ Giá trị trả về của môt request hợp lệ sẽ tương ứng với kiểu được yêu cầu trong
tham số FORMAT. Trong môi trường HTTP, header kiểu nội dung của response sẽ
chính xác là kiểu MIME được đưa ra trong request.
2.2.7. Biệt lệ dịch vụ Khi nhận được một request không hợp lệ, dịch vụ sẽ đưa ra một biệt lệ dịch vụ.
Biệt lệ này sẽ giải thích cho ứng dụng client hoặc người sử dụng biết lý do tại sao
request không hợp lệ.
Chương 2. Web Map Service (WMS)
14
2.3. Các operation của Web Map Service
2.3.1. GetCapabilities
2.3.1.1. Chức năng
Lấy dữ liệu ở tầng dịch vụ, đó là những mô tả cho máy và cả con người về nội
dung thông tin của WMS và các tham số request chấp nhận được. Response của một
GetCapabilities request là thông tin chung về bản thân dịch vụ và thông tin riêng
biệt của các bản đồ có thể yêu cầu.
2.3.1.2. GetCapabilities request
Khi tạo ra loại request này, cần phải chỉ ra rằng client đang có nhu cầu tìm kiếm
thông tin về WMS. Do đó, tham số SERVICE trong câu request có giá trị là
“WMS”.
Tham số request Bắt buộc/
Tùy chọn Mô tả
VERSION = version Tùy chọn Phiên bản yêu cầu
SERVICE = WMS Bắt buộc Loại dịch vụ
REQUEST = GetCapabilities Bắt buộc Tên request
UPDATESEQUENCE = string Tùy chọn Dãy số/chuỗi đề điều khiển cache
Bảng 2.3.Các tham số trong GetCapabilities request URL
2.3.1.2.1. VERSION Tham số VERSION là một tham số tùy chọn, được sử dụng trong quá trình thỏa
thuận phiên bản.
2.3.1.2.2. SERVICE Tham số SERVICE là một tham số bắt buộc, dùng để chỉ kiểu dịch vụ nào cần
được thực thi. Khi gọi thực thi GetCapabilities trên một WMS, giá trị của tham số
này phải là “WMS”.
Chương 2. Web Map Service (WMS)
15
2.3.1.2.3. REQUEST Tham số REQUEST là một tham số bắt buộc. Để thực thi operation
GetCapabilities, giá trị “GetCapabilities” sẽ được sử dụng.
2.3.1.2.4. UPDATESEQUENCE Tham số UPDATESEQUENCE là một tham số tùy chọn nhằm giữ tính ổn định
của cache. Giá trị của nó là một số nguyên, một timestamp có định dạng hoặc là một
chuỗi. Server có thể có giá trị UpdateSequence trong tài liệu Capabilities XML .
Giá trị này sẽ được tăng lên khi có theo đổi trong tài liệu Capabilities XML (ví dụ
có bản đồ mới được thêm vào dịch vụ). Client có thể thêm tham số này vào trong
request GetCapabilities của nó. Server sẽ trả về một response dựa trên mối quan hệ
giữa giá trị UpdateSequence tương ứng trong câu request của client và thông tin
trong metadaa của server, mối quan hệ này được biểu diễn thông qua bảng sau:
Giá trị
UpdateSequence trong
request của client
Giá trị UpdateSequence
trong thông tin metadata
của server
Response của server
none any Tài liệu Capabilities XML
mới nhất
any none Tài liệu Capabilities XML
mới nhất
equal equal Biệt lệ:
code=CurrentUpdateSequence
lower higher Tài liệu Capabilities XML
mới nhất
higher lower Biệt lệ:
code=InvalidUpdateSequence
Bảng 2.4.Mối quan hệ giữa giá trị UpdateSequence trong client và server
Chương 2. Web Map Service (WMS)
16
2.3.1.3. GetCapabilities response
Mục “Các element cơ sở “ đã chỉ ra các quy tắc chung cho response của
GetCapabilities. Cấu trúc tài liệu XML của response sẽ tuân theo chuẩn được đưa ra
trong tài liệu DTD. DTD này đặc tả các nội dung bắt buộc và tùy chọn của response
và định dạng của các nội dung ấy.
2.3.1.3.1. Name và Title Có nhiều element mà định dạng của nó bao gồm một cặp <Name> và <Title>.
Trong đó, Name có ý nghĩa trong giao tiếp giữa máy với máy, còn Title có ý nghĩa
cho người sử dụng. Ví dụ , một dataset có thể có Title như sau “Nhiệt độ khí quyển
cực đại” và được yêu cầu với Name là “ATMAX”.
2.3.1.3.2. Thông tin metadata của dịch vụ Phần đầu của tài liệu Capabilities XML là element <Service> cung cấp thông tin
metadata chung của dịch vụ. Nó bao gồm trong đó các element khác như Name,
Title, OnlineResourceURL, Abstract, KeywordList, ContactInformation, Fees và
Access Constraints. Ý nghĩa của các element này như sau.
Element Name của dịch vụ là “OGC:WMS”.
Element Title của dịch vụ là tùy thuộc vào nhà cung cấp, nó là một mô tả ngắn
gọn về dịch vụ.
Element Abstract cho phép mô tả thêm thông tin về các đối tượng có trong dịch
vụ.
Element OnlineResourceURL dùng để chỉ ra website của nhà cung cấp dịch vụ.
Có các element OnlineResourceURL khác nhau cho tiền tố URL với mỗi operation
hỗ trợ.
Element KeywordList là danh sách các từ hỗ trợ cho việc phân loại tìm kiếm.
Element ContactInformation nên được thêm vào để cho biết thêm thông tin liên
lạc cần thiết.
Chương 2. Web Map Service (WMS)
17
Giá trị “none” (viết thường) được dùng để chỉ ra rằng không có phí hay ràng
buộc truy cập đối với dịch vụ này. Nó được viết như sau: <Fees>none</Fees>,
<AccessConstraints>none</AccessConstraints>.
2.3.1.3.3. Layer và Style Phần quan trọng nhất trong tài liệu Capabilities XML là phần định nghĩa các lớp
và kiểu.
Mỗi một bản đồ được đưa ra bởi một element <Layer> trong tài liệu Capabilities
XML. Một lớp cho có thể bao gồm trong đó nhiều lớp con, các lớp này có tính kế
thừa. Một số thuộc tính được định nghĩa ở lớp cha được kế thừa lại ở các lớp con
của nó. Các thuộc tính kế thừa này có thể được định nghĩa lại hoặc không được định
nghĩa lại ở lớp con. Một Map Server có ít nhất một element <Layer> cho mỗi lớp
bản đồ mà nó hỗ trợ.
Do không có quy định nào nên hiện tại, việc đặt tên lớp, tên kiểu, tiêu đề và từ
khóa là túy ý.
2.3.1.3.4. Các property của layer Element <Layer> bao gồm các element con trong đó nhằm cung cấp thông tin
metadata về lớp này. Giá trị của một số element sẽ được kế thừa lại theo quy tắc
được định nghĩa ở mục 3.1.3.7. Dưới đây là ý nghĩa của các element này.
2.3.1.3.4.1. Title Element <Title> là bắt buộc đối với mọi lớp, nó là chuỗi có ý nghĩa cho người
dùng và để hiển thị trong thực đơn. Title không được kế thừa lại bởi các lớp con.
2.3.1.3.4.2. Name Khi và chỉ khi một lớp có element <Name> thì lớp đó mới có thể được yêu cầu
bằng cách sử dụng giá trị tên này trong tham số LAYERS của request GetMap. Nếu
một lớp có Title nhưng không có Name, thì lớp này chỉ có ý nghĩa phân mục cho
các lớp con của nó. Một Map Server có thông báo trong đặc tả của nó một lớp có
element <Name> thì nó sẽ đồng ý trả về một bản đồ tương ứng khi client gửi một
Chương 2. Web Map Service (WMS)
18
request GetMap với đối số LAYERS có giá trị là giá trị của element <Name> này.
Client sẽ không thể gửi request đến lớp chỉ có Title mà không có Name.
Server sẽ gửi một biệt lệ có mã là “LayerNotDefined” nếu client gửi request đến
một lớp không hợp lệ.
Khi gửi request đến một lớp cha thông qua element <Name> của nó thì tất cả
các lớp con sẽ cùng được truy xuất. Ví dụ khi gửi request đến lớp cha là lớp
“Đường” thì các lớp con là lớp “Đường Phố” và “Đường Quốc Lộ” cũng cho phép
gửi request đến từng lớp con hoặc gửi đến cả hai cùng lúc.
Thành phần <Name> không được kế thừa lại bởi các lớp con.
2.3.1.3.4.3. Abstract và KeywordList Tuy <Abstract> và <KeywordList> là hai element tùy chọn nhưng khuyến cáo là
nên dùng. Abstract cho mô tả chi tiết về lớp bản đồ. Còn KeywordList có từ 0 đến
nhiều từ khóa nhằm hỗ trợ cho việc phân loại tìm kiếm. Hai element Abstract và
KeywordList không được kế thừa lại bởi các lớp con.
2.3.1.3.4.4. Style Có thể không có hoặc có nhiều kiểu được mô tả cho một hoặc tập các lớp bằng
cách dùng các element <Style>. Mỗi một element <Style> chứa trong đó một cặp
element <Name> và <Title>. Giá trị Name được sẽ được sử dụng khi client gửi
request GetMap, nó nằm trong tham số STYLES. Title là một chuỗi có ý nghĩa cho
người sử dụng. Nếu lớp hoặc tập lớp đó chỉ có một kiểu thì kiểu này được xem là
kiểu mặc định và không cần được đặc tả tại server.
Element <Style> có thể chứa trong đó thêm nhiều element khác như là
<Abstract> dùng để mô tả chi tiết về kiểu, trong khi <LegendURL> cho biết vị trí
của ảnh ghi chú của bản đồ tương ứng với kiểu này. Element <Format> trong
<LegendURL> cho biết kiểu MIME của ảnh đó và các thuộc tính chiều rộng, chiều
cao của ảnh theo đơn vị pixel.
Chương 2. Web Map Service (WMS)
19
Các <Style> được kế thừa lại bởi các lớp con. Lớp con không được định nghĩa
lại kiểu mà nó kế thừa từ lớp cha, song nó có thể định nghĩa một kiểu mới với một
tên mới mà không có trong lớp cha.
2.3.1.3.4.5. SRS Mỗi một lớp có thể được dùng trong một hoặc nhiều hệ quy chiếu không gian.
Mỗi một lớp có ít nhất một element <SRS> được định nghĩa mới hoặc kế thừa
lại từ lớp cha. Lớp gốc sẽ chứa tất cả các element <SRS> có thể được dùng trong
các lớp con. Sử dụng một element với nội dung trống <SRS></SRS> nếu như
không có SRS nào cả.
Khi một lớp có nhiều element <SRS> thì có hai cách để biểu diễn danh sách các
giá trị SRS, cách đầu tiên được dùng trong phiên bản 1.1.1 , cách thứ hai tuy không
còn được sử dụng song các dịch vụ vẫn hiểu được do tính tương thích lùi.
1)Danh sách các giá trị SRS được đặt trong các element <SRS> liên tiếp nhau,
và mỗi element <SRS> chỉ có một giá trị. Ví dụ: <SRS>EPSG:1234</SRS>
<SRS>EPSG:5678</SRS>.
2)Danh sách các giá trị SRS được đặt trong cùng một element <SRS> và được
phân cách bởi khoảng trắng. Ví dụ: <SRS>EPSG:1234 EPSG:5678</SRS>.
2.3.1.3.4.6. LatLonBoundingBox Mỗi lớp có duy nhất một element <LatLonBoundingBox> được tạo mới hoặc kế
thừa lại từ lớp cha. Nó chỉ ra hình chữ nhật bao nhỏ nhất cho dữ liệu bản đồ trong
hệ tọa độ địa lý EPSG:4326.
LatLonBoundingBox được hộ trợ bất chấp Map Server hỗ trợ SRS nào đi chăng
nữa, tuy nhiên nó chỉ có giá chị xấp sỉ nếu như EPSG:4326 không được hỗ trợ. Mục
đích của nó nhằm giúp cho việc tìm kiếm thông tin địa lý được thực hiện một cách
dễ dàng mà không cần các bộ máy tìm kiếm phải chuyển hệ tọa độ.
Element LatLonBoundingBox và element BoundingBox (được định nghĩa ở
mục sau) có một mối quan hệ với tham số BBOX trong câu request GetMap. Thông
tin metadata về BoundinhBox trong tài liệu Capabilities XML đặc tả hình chữ nhật
Chương 2. Web Map Service (WMS)
20
bao xung quanh lớp bản đồ. Còn tham số BBOX lại đặc tả hình chữ nhật sẽ vẽ trên
bản đồ. Hình chữ nhật BBOX có thể giao, chứa hoặc chứa trong hình chữ nhật
BoundingBox.
2.3.1.3.4.7. BoundingBox Một lớp có thể không có hoặc có nhiều element <BoundingBox> được định
nghĩa mới hoặc kế thừa từ lớp cha. Mỗi một BoundingBox định nghĩa một hình chữ
nhật bao xung quanh dữ liệu bản đồ trong một hệ quy chiếu không gian nhất định,
trong đó thuộc tính SRS sẽ chỉ ra hệ quy chiếu không gian nào được áp dụng. Nếu
diện tích của vùng dữ liệu bản đồ có hình dạng bất thường thì BoundingBox sẽ chỉ
ra hình chữ nhật bao có diện tích nhỏ nhất. Các thuộc tính minx, miny, maxx, maxy
chỉ ra tọa độ của các cạnh của hình chữ nhật bao trong hệ quy chiếu. Các thuộc tính
tùy chọn resx, resy chỉ ra độ độ phân giải không gian của dữ liệu với đơn vị của hệ
quy chiếu trên.
Như vậy, <LatLonBoundingBox> là một Bounding Box đặc biệt với thuộc tính
SRS=”EPSG:4326”, tuy nhiên LatLonBoundingBox không có thuộc tính resx, resy.
Khi đó, nếu có thêm BoundingBox cho EPSG:4326 thì nó nhằm mục đích cung cấp
thêm thông tin về độ phân giải.
Mỗi một lớp có thể có nhiều element <BoundingBox> song mỗi element này chỉ
cho một SRS riêng biệt mà thôi. Một lớp sẽ kế thừa tất cả các giá trị BoundingBox
được định nghĩa ở lớp cha. Song, giá trị BoundingBox này sẽ được thay thế nếu lớp
con định nghĩa lại một BoundingBox mới trên cùng một SRS của BoundingBox
định nghĩa ở lớp cha. Khi lớp con định nghĩa một BoundingBox cho một SRS mới
chưa được định nghĩa ở lớp cha thì BoundingBox này sẽ được thêm vào danh sách
các BoundingBox ở lớp con. Một lớp không được định nghĩa nhiều hơn một
BoundingBox cho cùng một SRS.
Trong một lớp, với cùng một SRS, ta không thể định nghĩa các hình chữ nhật
bao rời nhau. Ví dụ, giả sử như có một dataset mô tả hai vùng diện tích cách xa
nhau, khi đó, server không thể tách ra thành hai hình chữ nhật bao để diễn tả hai
vùng diện tích này trong cùng một SRS và trên cùng một lớp bản đồ. Để giải quyết
Chương 2. Web Map Service (WMS)
21
trường hợp này, server sẽ định nghĩa một hình chữ nhật bao duy nhất bao trùm lên
cả hai vùng diện tích này, hoặc là định nghĩa hai hình chữ nhật bao trên hai lớp bản
đồ khác nhau (có tên lớp và giá trị BoundingBox khác nhau).
Nếu server có khả năng chuyển đổi dữ liệu trên các SRS khác nhau thì nó sẽ
không chọn giải pháp cung cấp các BoundingBox riêng biệt cho từng SRS được hỗ
trợ trên mỗi lớp. Server sẽ chỉ cung cấp thông tin BoundingBox cho ít nhất một
SRS cơ bản của mỗi lớp mà thôi.
2.3.1.3.4.8. ScaleHint Mỗi lớp có thể có một element <ScaleHint> để cung cấp thông tin về tỉ lệ tối
thiểu và tỉ lệ tối đa để hiển thị lớp bản đồ này.
ScaleHint được kế thừa lại ở các lớp con. Nếu lớp con định nghĩa một ScaleHint
mới thì giá trị này sẽ thay thế cho giá trị được kế thừa từ lớp cha.
2.3.1.3.4.9. Dimension và Extent Hai element tùy chọn <Dimension> và <Extent> chứa thông tin metadata cho dữ
liệu đa chiều.
Dimension được kế thừa lại ở các lớp con. Nó có thể định nghĩa thêm nhiều
<Dimension> mới song không được định nghĩa lại <Dimension> kế thừa từ lớp cha.
Extent được kế thừa lại ở các lớp con. Khi lớp con định nghĩa một <Extent> với
thuộc tính Name có cùng giá trị vói thuộc tính Name của <Extent> mà nó kế thừa
lại từ lớp cha, thì giá trị mới sẽ được thay thế cho giá trị cũ.
2.3.1.3.4.10. MetadataURL Một Map Server có thể sử dụng một hoặc nhiều element <MetaDataURL> để
cung cấp các thông tin metadata chuẩn và chi tiết bên dưới lớp đó.
MetadataURL không được kế thừa lại ở các lớp con.
2.3.1.3.4.11. Attribution Element tùy chọn <Attribution> cung cấp cách để định danh nguồn của dữ liệu
bản đồ của một lớp hoặc một tập các lớp. Element <Attribute> chứa trong nó các
Chương 2. Web Map Service (WMS)
22
element tùy chọn khác như: <OnlineResource> cho biết URL của nhà cung cấp dịch
vụ, <Title> cho biết tên của nhà cung cấp dịch vụ, chuỗi này chỉ có ý nghĩa với
người dùng, <LogoURL> cho biết URL của ảnh logo. Element <Format> trong
element <LogoURL> cho biết kiểu MIME của ảnh logo, thuộc tính width và heigth
cho biết kích thước của ảnh tính theo đơn vị pixel.
Attribute có thể được kế thừa ở các lớp con. Bất cứ định nghĩa lại nào ở lớp con
sẽ thay thế giá trị cũ được kế thừa.
2.3.1.3.4.12. Identifier và AuthorityURL Một Map Server có thể không có hoặc có nhiều element <Identifier> để liệt kê
các số định danh hoặc các nhãn trong element <AuthorityURL>. Thuộc tính
authority trong element <Identifier> tương ứng với giá trị của thuộc tính name trong
element <AuthorityURL>. Trong <AuthorityURL> có element <OnlineResource>
chỉ ra URL của tài liệu định nghĩa ý nghĩa của các giá trị Identifier.
Ví dụ: <AuthorityURL name="gcmd">
<OnlineResource xlink:href="some_url"... />
</AuthorityURL>
<Identifier authority="gcmd">id_value</Identifier>
AuthorityURL đuợc kế thừa bởi các lớp con. Lớp con không được định nghĩa lại
các AuthorityURL được kế thừa này.
Identifier không được kế thừa lại ở các lớp con. Một lớp không được định nghĩa
element <Identifier> nếu chưa định nghĩa hay kế thừa element <AuthorityURL>
nào.
2.3.1.3.4.13. FeatureListURL Một Map Server có thể dùng element <FeatureListURL> để chỉ ra danh sách các
feature được biểu diễn trong lớp. FeatureListURL không được kế thừa lại ở các lớp
con.
Chương 2. Web Map Service (WMS)
23
2.3.1.3.4.14. DataURL Một Map Server có thể dùng element <DataURL> để chỉ ra URL nhằm cung
cấp thêm thông tin về dữ liệu biểu diễn trong lớp. DataURL không được kế thừa lại
ở các lớp con.
2.3.1.3.5. Các attribute của layer Một <Layer> có thể không có hoặc có nhiều attribute như: queryable, cascaded,
opaque, noSubsets, fixedWidth, fixedHeight. Tất cả các attribute này là tùy chọn và
mặc định đều có giá trị là 0. Mỗi attribute này có thể được kế thừa hoặc định nghĩa
lại ở các lớp con. Bảng sau mô tả ý nghĩa của các attribute này.
Attribute Miền giá trị Ý nghĩa (default=0)
queryable 0, 1 0: không truy vấn được.
1: truy vấn được.
cascaded 0, nguyên
dương
0: lớp không được yêu cầu bởi Cascading Map Server
n: lớp được yêu cầu n lần bởi các Cascading Map
Server.
opaque 0, 1 0: dữ liệu bản đồ biểu diễn các feature dạng vector
mà không có miền tô.
1: dữ liệu bản đồ là các miền tô đặc.
noSubsets 0, 1 0: WMS có thể vẽ tập con nằm trong bounding box.
1: WMS chỉ có thể vẽ toàn bộ bounding box.
fixedWidth 0, nguyên
dương
0: WMS có thể chỉnh lại chiều rộng bản đồ.
n: bản đồ được cố định chiều rộng và WMS không
thể thay đổi.
fixedHeight 0, nguyên
dương
0: WMS có thể chỉnh lại chiều cao bản đồ.
n: bản đồ được cố định chiều cao và WMS không thể
thay đổi.
Bảng 2.5.Thuộc tính lớp
Chương 2. Web Map Service (WMS)
24
2.3.1.3.5.1. Lớp có thể truy vấn Lớp được gọi là có thể truy vấn nếu như server hỗ trợ operation GetFeatureInfo
trên lớp này. Một server có thể hỗ trợ GetFeatureInfo trên một vài lớp của nó chứ
không hỗ trợ tất cả. Server sẽ gửi ra biệt lệ có mã là “LayerNotQueryable” nếu như
operation GetFeatureInfo được yêu cầu trên lớp không truy vấn được.
2.3.1.3.5.2. Lớp tầng Lớp được gọi là “cascaded” nếu nó được gọi sử dụng bởi một server và được hỗ
trợ trong tài liệu Capabilities XML của một server khác. Nếu một WMS hỗ trợ môt
lớp do một WMS khác cung cấp thì nó sẽ tăng giá trị của thuộc tính cascaded của
lớp đó lên 1.
2.3.1.3.5.3. Lớp đục và lớp trong suốt Nếu attribute tùy chọn opaqued của một lớp không có hoặc có giá trị “0” thì các
bản đồ từ lớp này sẽ không có dữ liệu bề mặt, client sẽ hiển thị nó trong suốt. Chỉ
hiển thị các feature dạng vector như điểm, đường, đa giác (tuy nhiên nếu hiển thị
các feature này liên tục nhau thì xem như nó có miền tô). Nếu có giá trị là “1”, thì
lớp này sẽ biểu diễn cả các bề mặt. Attribute opaqued thường được đặt cho lớp ở
đáy ngăn xếp các lớp khi hiển thị bản đồ. Attribute này chỉ mô tả nội dung dữ liệu
của lớp chứ không mô tả định dạng của ảnh bản đồ
2.3.1.3.5.4. Lớp có tập con và lớp có thể chỉnh kích thước Nếu thông tin metadata của lớp có thêm ba attribute tùy chọn là noSubset,
fixedWidth, fixedHeight (tức là giá trị của các attribute này là “1”) thì Map Server
này ít chức năng hơn một WMS thông thường do nó không thể xuất ra một ảnh của
tập con của dữ liệu địa lý gốc hoặc nó chỉ phục vụ các bản đồ có kích thước cố định
và không thể chỉnh lại kích thước. Ví dụ, một WMS chỉ hỗ trợ các ảnh số hóa từ
bản đồ lịch sử, hoặc các hình ảnh chụp từ vệ tinh, chúng không thể lấy ra tập con
hoặc chỉnh lại kích thước. Tuy nhiên, vẫn thực thi được request GetMap với dữ liệu
trả về là toàn bộ bản đồ với kích thước nguyên thủy.
Chương 2. Web Map Service (WMS)
25
Khi attribute noSubsets=1 thì server không thể cắt dữ liệu hoặc bản đồ thành
một vùng dữ liệu địa lý có diện tích nhỏ hơn hình chữ nhật bao.
Khi có giá trị khác “0”, thì hai attribute fixedWidth và fixedHeight chỉ ra rằng
server không thể chỉnh lại kích thước bản đồ.
2.3.1.3.6. Sự kế thừa các thuộc tính của lớp Bảng sau đây cho biết cách mà các lớp con kế thừa các thuộc tính từ lớp cha như
thế nào. Có thuộc tính không được kế thừa, có thuộc tính được kế thừa, có thuộc
tính được cài đặt lại.
Trong bảng dưới đây, cột “Số lượng” cho biết số lượng element có thể xuất hiện
trong lớp. Trong đó, “1” có nghĩa là chỉ xuất hiện duy nhất một lần trong mỗi lớp,
“0/1” có nghĩa là không xuất hiện hoặc xuất hiện một lần, “0+”có nghĩa là không
xuất hiện hoặc xuất hiện nhiều lần, “1+” có nghĩa là xuất hiện ít nhất một lần.
Cột “Kế thừa” cho biết element có được kế thừa ở lớp con hay không và được
kế thừa như thế nào. Trong đó, “không” có nghĩa là không được kế thừa, “thêm” có
nghĩa là được kế thừa và các lớp con có thể thêm nhiều element, “thay thế” có nghĩa
là được kế thừa và lớp con có thể định nghĩa lại element này.
Chương 2. Web Map Service (WMS)
26
Element Số lượng Kế thừa
Layer 0+ Không
Name 1 Không
Title 1 Không
Abstract 0/1 Không
KeywordList 0/1 Không
Style 0+ Thêm
SRS 1+ Thêm
LatLonBoundingBox 1 Thay thế
BoundingBox 0+ Thay thế
Dimension 0+ Thêm
Extent 0+ Thay thế
Attribution 0/1 Thay thế
AuthorityURL 0+ Thêm
Identifier 0+ Không
MetadataURL 0+ Không
DataURL 0/1 Không
FeatureListURL 0/1 Không
ScaleHint 0/1 Thay thế
Bảng 2.6.Qui định kế thừa các thuộc tính lớp
2.3.2. GetMap
2.3.2.1. Chức năng
Lấy ảnh bản đồ mà các tham số địa lý và chiều đã được định nghĩa hợp lệ. Khi
nhận được một request GetMap, Map Server hoặc là sẽ đáp ứng request này, hoặc là
sẽ tung ra một biệt lệ dịch vụ.
Chương 2. Web Map Service (WMS)
27
2.3.2.2. GetMap request
Tham số request Bắt buộc/
Tùy chọn Mô tả
VERSION=version Bắt buộc Phiên bản request .
REQUEST=GetMap Bắt buộc Tên request .
LAYERS=layer_list Bắt buộc Danh sách các lớp bản đồ
được phân cách bởi dấu phẩy.
STYLES=style_list Bắt buộc Danh sách kiểu của mỗi lớp
trong request .
SRS=namespace:identifier Bắt buộc Hệ quy chiếu không gian.
BBOX=minx,miny,maxx,maxy Bắt buộc Góc dưới trái và trên phải của
hình chữ nhật bao theo đơn vị
của SRS.
WIDTH=output_width Bắt buộc Chiều rộng của ảnh (pixel).
HEIGHT=output_height Bắt buộc Chiều cao của ảnh (pixel).
FORMAT=output_format Bắt buộc Định dạng trả về của bản đồ.
TRANSPARENT=TRUE|FALSE Tùy chọn Sự trong suốt của nền bản đồ
(default=FALSE).
BGCOLOR=color_value Tùy chọn Màu nền
(default=0xFFFFFF).
EXCEPTIONS=exception_format Tùy chọn Định dạng của biệt lệ trả về
của WMS
(default=SE_XML).
TIME=time Tùy chọn Giá trị thời gian của lớp.
ELEVATION=elevation Tùy chọn Giá trị độ cao của lớp.
Các chiều mẫu khác Tùy chọn Giá trị của các chiều.
Bảng 2.7.Các tham số trong GetMap request
Chương 2. Web Map Service (WMS)
28
2.3.2.2.1. VERSION Tham số VERSION là một tham số tùy chọn, được sử dụng trong quá trình thỏa
thuận phiên bản.
2.3.2.2.2. REQUEST Tham số REQUEST là một tham số bắt buộc. Để thực thi operation GetMap, giá
trị “GetMap” được sử dụng.
2.3.2.2.3. LAYERS Tham số bắt buộc LAYERS liệt kê các lớp cần trả về cho request này. Các giá
trị của tham số LAYERS được phân cách bởi dấu phẩy “,”. WMS sẽ vẽ các lớp này
tuần tự từ trái sang phải, nghĩa là, lớp ngoài cùng bên trái sẽ được vẽ đầu tiên, do đó
lớp này sẽ nằm ở dưới cùng.
2.3.2.2.4. STYLES Tham số bắt buộc STYLES liệt kê kiểu mà lớp đó sẽ vẽ. Các giá trị của tham số
STYLES được phân cách bởi dấu phẩy “,”. Có quan hệ tương ứng một-một giữa
một giá trị trong tham số LAYERS và một giá trị trong tham số STYLES. Mỗi bản
đồ trong sanh sách các lớp của tham số LAYERS sẽ được vẽ theo kiểu tương ứng
(cùng vị trí) của nó trong danh sách các kiểu của tham số STYLES. Nói một cách
khác, sẽ không có chuyện client yêu cầu vẽ một lớp theo kiểu của một lớp khác.
Server sẽ đưa ra biệt lệ có mã “StyleNotDefined” nếu một kiểu không hợp lệ được
yêu cầu.
Client có thể yêu cầu kiểu mặc định bằng cách để giá trị null (“STYLES=”).
Nếu yêu cầu vẽ các lớp trong đó lớp thì được yêu cầu vẽ theo kiểu mặc định, lớp thì
yêu cầu vẽ theo kiểu riêng thì tham số STYLES sẽ có giá trị null giữa hai dấu phẩy
“,” (“STYLES=style1,,style2,,”). Nếu tất cả các lớp đều được yêu cầu vẽ theo kiểu
mặc định thì có tể sử dụng dạng “STYLES=” hoặc dạng “STYLES=,,,,,” đều hợp
lệ.
Chương 2. Web Map Service (WMS)
29
2.3.2.2.5. SRS Tham số bắt buộc SRS chỉ ra hệ quy chiếu không gian áp dụng cho các giá trị
của tham số BBOX. SRS đã được trình bày chi tiết ở mục “Các element cơ sở”. Giá
trị của tham số SRS có thể là một trong các giá trị được định nghĩa ở element
<SRS> trong lớp được yêu cầu. Cùng một SRS sẽ được áp dụng cho tất cả các lớp
được yêu cầu trong GetMap.
Nếu server có định nghĩa SRS=NONE cho môt lớp nào đó thì lớp này sẽ không
có một hệ quy chiếu không gian nên sẽ không được vẽ ra cùng với các lớp khác.
Client nên chỉ ra rằng SRS=NONE trong request của GetMap nếu không, server sẽ
đưa ra biệt lệ dịch vụ.
2.3.2.2.6. BBOX Tham số bắt buộc BBOX cho phép client yêu cầu một hình chữ nhật bao. Hình
chữ nhật bao đã được trình bày chi tiết ở mục “Các element cơ sở”. Giá trị của tham
số BBOX là request một dãy các số được phân cách bằng dấu phẩy “,” có dạng sau
“minx, miny, maxx, maxy”.
Nếu server tuyên bố rằng có một lớp nào đó không thể lấy ra tập con, thì client
nên chỉ ra giá trị của tham số BBOX trong request của GetMap đúng bằng giá trị
của BoungdingBox trong tài liệu Capabilities XML, nếu không server sẽ đưa ra biệt
lệ.
2.3.2.2.7. FORMAT Tham số bắt buộc FORMAT chỉ ra định dạng cần trả về cho một operation. Các
giá trị định dạng hợp lệ cho một request GetMap của WMS được liệt kê trong
element <Format> trong tài liệu Capabilities XML. Toàn bộ chuỗi kiểu MIME
trong element <Format> được dùng làm giá trị cho tham số FORMAT.
Với mỗi WMS, nó sẽ hỗ trợ các định dạng “ảnh” hoặc các định dạng “thành
phần đồ họa”. Định dạng ảnh bao gồm các định dạng ảnh thông dụng như GIF (kiểu
MIME là “image/gif”), PNG (kiểu MIME là “image/png”), JPEG (kiểu MIME là
“image/jpeg”) hầu hết đều có thể hiển thị trên trình duyệt web, tuy nhiên có một số
Chương 2. Web Map Service (WMS)
30
lại cần các trình ứng dụng khác để hiển thị. Định dạng thanh phần đồ họa bao gồm
các định dạng như SVG, WebCGM.
2.3.2.2.8. WIDTH, HEIGHT Hai tham số bắt buộc WIDTH và HEIGHT chỉ ra kích thước tính theo số nguyên
các điểm ảnh của ảnh bản đồ sẽ trả về cho client. Có một ràng buộc là hai tham số
WIDTH và HEIGHT phải phù hợp với tham số BBOX, cụ thể là WIDTH ≤ maxx -
minx, và HEIGHT ≤ maxy – miny. Ảnh trả về, bất chấp định dạng là gì, nhưng sẽ
có đúng kích thước chiều rộng và chiều cao là WIDTH và HEIGHT tính theo pixel.
Trong trường hợp tỉ số của BBOX và tỉ số WIDTH / HEIGHT khác nhau thì WMS
sẽ căng ảnh trả về ra sao cho đúng tỉ lệ của BBOX.
Nếu request yêu cầu trả về định dạng thành phần đồ họa (ví dụ: SVG hoặc
WebCGM) thì sẽ không có chiều rộng và chiều cao. Khi đó hai tham số này sẽ
không được sử dụng.
Nếu server tuyên bố rằng lớp được yêu cầu không thay đổi được kích thước thì
client phải truyền vào chính xác giá trị của ảnh cho hai tham số WIDTH và
HEIGHT trong request, nếu không server sẽ đưa ra biệt lệ dịch vụ.
2.3.2.2.9. TRANSPARENT Tham số tùy chọn TRANSPARENT chỉ ra nền của bản đồ có được làm trong
suốt hay không. Tham số TRANSPARENT có hai giá trị là TRUE hoặc FALSE.
Giá trị mặc định là FALSE nếu tham số không được đưa ra trong request.
Khả năng vẽ ảnh với những pixel trong suốt cho phép hiển thỉ kết quả với các
request GetMap khác nhau, các kết quả này sẽ chồng lên nhau tạo nên một bản đồ
tổng hợp. Cũng như vậy, khi request gồm nhiều lớp thì các lớp nằm phía trên cần
phải để tham số TRANSPARENT.
Định dạng ảnh GIF có khả năng hiển thị trong suốt trên trình duyệt web. Định
dạng ảnh PNG cho nhiều lựa chọn trong việc hiển thị ảnh trong suốt nhưng lại hiển
thị với chất lượng rất kém. Định dang ảnh JPEG không hỗ trợ ảnh trong suốt.
Chương 2. Web Map Service (WMS)
31
Khi tham số TRANSPARENT = TRUE và tham số FORMAT chứa định dạng
ảnh (vidụ: image/gif) WMS sẽ trả về kết quả mà trong đó tất cả các điểm ảnh không
biểu diễn cho các feature hoặc dữ liệu của lớp sẽ được làm trong suốt. Ví dụ, lớp
“Đường” sẽ hiển thị trong suốt ở những chỗ không có đường. Khi tham số
TRANSPARENT = FALSE thì những điểm ảnh đó sẽ có giá trị là giá trị của tham
số BGCOLOR.
Khi một lớp được tuyên bố là “đục” thì mọi phần hoặc thực thể trên bản đồ
không thể hiển thị trong suốt được.
Khi tham số FORMAT chứa định dạng thành phần đồ họa thì tham số
TRANSPARENT có thể đưa vào trong request GetMap nhưng sẽ khong được xét
đến ở WMS.
2.3.2.2.10. BGCOLOR Tham số tùy chọn BGCOLOR chỉ ra màu được dùng làm màu nền của bản đồ.
Định dạng cho giá trị màu này là theo chuẩn màu RGB là một dãy sáu số hexa, cứ
mỗi cặp hai số lần lượt biểu diễn cho giá trị màu Đỏ, Xanh lá, Xanh dương. Dạng
của nó như sau OxRRGGBB. Giá trị mặc định là OxFFFFFF nếu tham số này
không có trong request .
Khi tham số FORMAT là một định dạng ảnh thì WMS sẽ vẽ bản đồ trên màu
nền là màu BGCOLOR. Còn nếu tham số FORMAT là một định dạng Thành phần
Đồ họa thì WMS sẽ không vẽ màu nền ra.
Khi một lớp được tuyên bố là “đục” thì mọi phần, mọi thực thể trên bản đồ sẽ
che lấp đi màu nền.
2.3.2.2.11. EXCEPTIONS Tham số tùy chọn EXCEPTIONS chỉ ra cách mà lỗi được báo về cho client. Giá
trị mặc định là “application/vnd.ogc.se_xml” nếu không có tham số này trong
request. Một WMS hỗ trợ một hoặc nhiều định dạng biệt lệ bằng cách lần lượt liệt
kê các định dạng này trong các element <Format> bên trong element <Exceptions>
của tài liệu Capabilities XML của nó. Toàn bộ chuỗi kiểu MIME trong element
Chương 2. Web Map Service (WMS)
32
<Format> được sử dụng làm giá trị cho tham số EXCEPTIONS. Định dạng đầu tiên
trong số các định dạng biệt lệ là bắt buộc đối với mọi WMS, những cái còn lại là
tùy chọn.
1) application/vnd.ogc.se_xml (bắt buộc)
2) application/vnd.ogc.se_inimage (tùy chọn)
3) application/vnd.ogc.se_blank (tùy chọn)
2.3.2.3. GetMap response
Kết quả trả về của một request hợp lệ sẽ là một bản đồ tương ứng với các lớp
thông tin địa lý được yêu cầu, theo kiểu xác định, kèm theo các thông tin về hệ quy
chiếu không gian, hình chữ nhật bao, kích thước, định dạng và độ trong suốt.
Khi một request không hợp lệ được gởi đến, server sẽ trả về một biệt lệ dịch vụ.
2.3.3. GetFeatureInfo
2.3.3.1. Chức năng
Đây là một operation tùy chọn. Nó chỉ hỗ trợ cho các lớp mà attribute
queryable=”1”. WMS sẽ gửi về biệt lệ dịch vụ nếu client gửi request
GetFeatureInfo đến lớp không hợp lệ.
GetFeatureInfo yêu cầu các thông tin của các feature trên bản đồ được trả về ở
request GetMap. Chẳng hạn như sau khi nhận được bản đồ, người dùng chọn vào
một điểm trên bản đồ để muốn biết thêm thông tin chi tiếp ở điểm đó. Operation này
chỉ ra cho client điểm ảnh nào cần truy vấn, và truy vấn trên các lớp bản đồ nào, và
định dạng của thông tin trả về là gì. Do giao thức WMS là giao thức không trạng
thái nên request GetFeatureInfo chỉ ra cho WMS thấy bản đồ nào mà người dùng
đang xem bằng cách thêm vào hầu hết các tham số trong request của GetMap (ngoại
trừ hai tham số VERSION và REQUEST). Trong tập các thông tin đó (BBOX,
SRS, WIDTH, HEIGTH), cùng với vị trí X, Y mà người dùng chọn, WMS sẽ trả về
các thông tin của điểm mà người dùng chọn.
Chương 2. Web Map Service (WMS)
33
GetFeatureInfo chỉ được thực hiện trên định dạng ảnh chứ không thực hiện được
trên định dạng thành phần đồ họa.
Thông tin trả về từ GetFeatureInfo là tùy thuộc vào nhà cung cấp dịch vụ.
2.3.3.2. GetFeatureInfo request
Các tham số của request GetFeatureInfo được liệt kê trong bảng sau.
Tham số request Bắt buộc/
Tùy chọn Mô tả
VERSION=version Bắt buộc Phiên bản request.
REQUEST=GetFeatureInfo Bắt buộc Tên request.
<map_request_copy> Bắt buộc Phần copy lại các tham số của request
GetMap.
QUERY_LAYERS=layer_list Bắt buộc Danh sách các lớp cần truy vấn, được
phân cách bởi dấu phẩy.
INFO_FORMAT=output_format Tùy chọn Định dạng thông tin của feature (kiểu
MIME).
FEATURE_COUNT=number Tùy chọn Số lượng feature cần lấy thông tin
(default = 1).
X=pixel_column Bắt buộc Hoành độ của điểm cần lấy thông tin.
Y=pixel_row Bắt buộc Tung độ của điểm cần lấy thông tin.
EXCEPTIONS=exception_format Tùy chọn Định dạng của biệt lệ
(default=application/vnd.ogc.se_xml)
Vendor-specific parameters Tùy chọn
Bảng 2.8.Các tham số của request GetFeatureInfo
2.3.3.2.1. Tiền tố Vai trò của tiền tố URL đã được đề cập trong mục “Các element cơ sở”. Tiền tố
cho GetCapabilities, GetMap and GetFeatureInfo là khác nhau.
Chương 2. Web Map Service (WMS)
34
2.3.3.2.2. VERSION Ý nghĩa của tham số bắt buộc VERSION đã được đề cập trong mục “Các
element cơ sở”.
2.3.3.2.3. REQUEST Ý nghĩa của tham số bắt buộc REQUEST đã được đề cập trong mục “Các
element cơ sở”. Đối với GetFeatureInfo, giá trị của tham số REQUEST là
“GetFeatureInfo”.
2.3.3.2.4. <map_request_copy> <map_request_copy> không phải là môt cặp tên/ giá trị như các tham số khác.
Hầu hết các tham số trong request GetMap nay lại bị lặp lại trong GetFeatureInfo.
Ngoại trừ hai tham số VERSION và REQUEST thì GetFeatureInfo có giá trị của
riêng nó. Những tham số còn lại trong request GetMap sẽ được tiếp tục nhúng vào
trong request của GetFeatureInfo.
2.3.3.2.5. QUERY_LAYERS Tham số bắt buộc QUERY_LAYERS chỉ ra các lớp bản đồ chứa các feature cần
lấy thông tin. Danh sách các lớp được phân cách bởi dấu phẩy “,”. Tham số này
chứa ít nhất tên của một lớp và ít hơn số lớp được yêu cầu trong request GetMap.
Nếu bất cứ lớp nào trong danh sách không có trong tài liệu Capabilities XML
của WMS thì server sẽ đưa ra biệt lệ dịch vụ.
2.3.3.2.6. INFO_FORMAT Tham số tùy chọn INFO_FORMAT chỉ ra định dạng trả về cho thông tin của
feature. Các giá trị định dạng được dùng được liệt kê lần lượt trong elment
<Format> bên trong element <FeatureInfo> của tài liệu Capabilities XML của
WMS. Toàn bộ chuỗi kiểu MIME trong element <Format> được dùng làm giá trị
của tham số INFO_FORMAT.
Ví dụ: INFO_FORMAT=application/vnd.ogc.gml yêu cầu thông tin feature gửi
theo định dạng GML.
Chương 2. Web Map Service (WMS)
35
2.3.3.2.7. FEATURE_COUNT Tham số tùy chọn FEATURE_COUNT chỉ ra số feature tối đa được phép lấy
thông tin. Đây là một số nguyên lớn hơn 0. Giá trị mặc định là 1 nếu tham số này
không có trong request.
2.3.3.2.8. X,Y Tham số bắt buộc X, Y chỉ ra một điểm cần lấy thông tin trên bản đồ. X và Y
phải nằm trong phạm vi bao quanh bởi tham số WIDTH và HEIGHT của request
GetMap. Tọa độ gốc (0,0) là tâm của điểm ảnh tại góc trên trái, X tăng qua bên
phải, Y tăng xuống dưới.
2.3.3.2.9. EXCEPTIONS Tham số tùy chọn EXCEPTIONS chỉ ra cách mà lỗi được báo về cho client. Giá
trị mặc định là application/vnd.ogc.se_xml nếu như không có tham số này trong
request. Theo đặc tả này (version 1.1.1) thì không còn định dạng nào khác cho biệt
lệ của request GetFeatureInfo.
2.3.3.3. GetFeatureInfo response
WMS sẽ trả về một response theo tham số INFO_FORMAT trong request nếu
request này là hợp lệ, nếu không server sẽ đưa ra một biệt lệ dịch vụ. Response trả
về cho client là tùy thuộc vào nhà cung cấp WMS, nhưng nó phải gắn liền với
những feature gần điểm (X,Y).
Chương 3. Web Feature Service (WFS)
36
Chương 3. Web Feature Service (WFS)
3.1. Giới thiệu WFS cung cấp các giao tác thông thường đến cơ sở dữ liệu GIS như là thêm,
xóa, sửa, truy vấn, khám phá các đối tượng thông tin địa lý. Nó sử dụng giao thức
HTTP như là một nền tính toán phân phối.
Đối tượng địa lý là một tập các thuộc tính, mà mỗi thuộc tính là một bộ ba giá trị
sau {tên, kiểu, giá trị}. Tên và kiểu của thuộc tính đối tượng được quy định bởi kiểu
đối tượng đó. Các đối tượng địa lý phải có ít nhất một thuộc tính có giá trị mô tả
thông tin địa lý. Nó có thể có các thuộc tính không nhằm mô tả thông tin địa lý.
Tiến trình yêu cầu dịch vụ WFS được tiến hành lần lượt theo trình tự sau:
1)Ứng dụng client gửi yêu cầu tài liệu mô tả khả năng của dịch vụ WFS. Đó là
tài liệu mô tả các giao tác mà WFS này hỗ trợ và liệt kê các kiểu feature mà nó hỗ
trợ.
2)Ứng dụng client có thể gửi yêu cầu lấy thông tin mô tả chi tiết của một hay
nhiều kiểu feature đến WFS.
3)Dựa trên thông tin mô tả chi tiết của các kiểu feature này, ứng dụng client sẽ
tạo ra một câu yêu cầu.
4)Yêu cầu này được gửi đến server.
5)WFS thực thi yêu cầu đó.
6)Sau khi đáp ứng xong yêu cầu,WFS sẽ gửi trả về trạng thái kết quả của việc
đáp ứng (thành công một giao tác, hay thất bại).
Để hỗ trợ cho các giao tác thêm, xóa, sửa và truy vấn trên dữ liệu, WFS hỗ trợ
các giao tác sau:
GetCapabilities: WFS bắt buộc phải mô tả khả năng của nó qua giao tác này.
Nó chỉ ra các kiểu feature mà nó hỗ trợ và các giao tác được hỗ trợ trên mỗi kiểu
feature.
Chương 3. Web Feature Service (WFS)
37
DescribeFeatureType: Khi có yêu cầu, WFS phải có khả năng mô tả cấu trúc
của bất kỳ kiểu feature nào mà nó hỗ trợ.
GetFeature: WFS phải có khả năng đáp ứng các yêu cầu lấy các thể hiện của
feature. Hơn nữa client có thể chỉ rõ ra các thuộc tính nào của feature mà nó muốn
lấy kèm theo các tạo ràng buộc trên chúng.
Transactinon: WFS có khả năng hỗ trợ các yêu cầu thêm, xóa, sửa các feature.
LockFeature: WFS có khả năng đáp ứng các yêu cầu khóa các thể hiện thuộc
tính trong khoảng thời gian thực hiện giao tác.
Tùy theo khả năng hỗ trợ các giao tác ở trên mà người ta phân ra làm hai loại
dịch vụ WFS. Một là “WFS cơ bản” (hay còn gọi là dịch vụ WFS chỉ đọc) chỉ hỗ
trợ các giao tác GetCapabilities, DescribeFeatureType và GetFeature. Hai là “WFS
giao tác” thì hỗ trợ thêm giao tác Transaction, còn giao tác LockFeature là tùy chọn.
Hình 3.1. Lược đồ giao thức
<WFS_TransactionReponse> document
Network
<Transaction> request
<schema> document
<DescribeFeatureType> request
<WFS_Capabilities> document
<GetCapabilities> request
Client Server
Chương 3. Web Feature Service (WFS)
38
3.2. Các thành phần dịch vụ cơ sở Các nội dung về đánh số và thỏa thuận phiên bản, các quy tắc về HTTP request,
HTTP response đã được trình bày trong phần các thành phần dịch vụ cơ sở của
WMS.
3.2.1. Mã hóa câu request Có hai phương pháp mã hóa câu request của WFS. Phương pháp thứ nhất sử
dụng XML làm ngôn ngữ mã hóa. Phương pháp thứ hai sử dụng cặp TừKhóa-
GiáTrị để mã hóa các tham số trong câu request. Ví dụ cho phương pháp dùng cặp
từ khóa – giá trị:
"REQUEST=GetCapabilities"
Trong đó “REQUEST” là từ khóa, còn “GetCapabilities” là giá trị. Trong cả hai
phương pháp thì kết quả response hoặc biệt lệ trả về là giống nhau.
3.2.2. Không gian tên Không gian tên được dùng để phân biệt các từ vựng XML với nhau. Đối với
WFS, có ba không gian tên sau:
1) http://www.opengis.net/wfs – các từ vựng về interface của WFS
2) http://www.opengis.net/gml – các từ vựng GML
3) http://www.opengis.net/ogc – các từ vựng cho OGC Filter
3.3. Các thành phần chung
3.3.1. Định danh của Feature (Feature identifier) Mỗi Feature sẽ được định danh một cách duy nhất. Nghĩa là khi một server WFS
thông báo cho client biết định danh của một Feature thì định danh này sẽ được sử
dụng luôn cho Feature đó trong các lần tham chiếu đến nó (cho đến khi Feature đó
bị xóa). Đoạn lược đồ XML dùng để mô tả định danh này như sau: <xsd:element name="FeatureId" type="ogc:FeatureIdType"/>
<xsd:complexType name="FeatureIdType">
<xsd:attribute name="fid" type="xsd:anyURI" use="required"/>
</xsd:complexType>
Chương 3. Web Feature Service (WFS)
39
Mục đích của định danh này chính là để cho các tác vụ truy vấn cơ sở dữ liệu
trên server có thể thực hiện được.
3.3.2. Định danh duy nhất toàn cầu Đối với riêng một Web Feature Service thì định danh cục bộ đã là đủ. Tuy
nhiên, đối với tất cả các Web Feature Service theo tổ chức OGC thì cần phải có một
định danh duy nhất cho mỗi đối tượng thuộc bất kì loại đối tượng nào. Theo cách
tiếp cận trước đây thì một đối tượng được tham chiếu đến dựa trên 2 thành phần là
phạm vi (scope) và định danh (FeatureId), phạm vi chính là URL của server chứa
loại Feature và FeatureId chính là định danh cục bộ của Feature bên trong server đó.
Cách tiếp cận này rất bất tiện khi vận chuyển và bất tiện trong một số trường hợp
khác nữa.
Mục đích của phần này là để chỉ ra rằng việc sử dụng một chuỗi định danh duy
nhất cho Feature sẽ thuận tiện hơn trong nhiều trường hợp. Chuỗi định danh duy
nhất này có thể được tạo ra bằng cách kết hợp giữa URL của Web Feature Service
với định danh cục bộ của Feature.
Chuỗi định danh này chỉ thật sự có ích khi mà nó là một chuỗi URL hoặc một
chuỗi URN mà có thể được dùng để truy xuất trực tiếp đến Feature mà nó chỉ đến.
Cấu trúc của chuỗi URL và URN này có thể được các Web Feature Service mô tả
một cách riêng biệt. Một điều cần lưu ý khi sử dụng URN là: không phải một Web
Feature Service nào cũng có thể lấy được các đối tượng dữ liệu. Do đó, nó chỉ có
ích khi được dùng để định danh duy nhất cho đối tượng.
Sử dụng URL và URN sẽ có ích cho các ứng dụng cần truy xuất đến các đối
tượng thô một cách đơn giản bởi vì các ứng dụng này không cần biết gì về chi tiết
của việc cài đặt. Cách định danh này cũng rất có ích khi mà nó được tích hợp với
các công nghệ XML cao cấp như là XSLT hoặc RDF, và cũng có ích cho việc
debug.
Chương 3. Web Feature Service (WFS)
40
3.3.3. Trạng thái của Feature (Feature State) Định nghĩa của các Feature của một WFS được cung cấp bởi một lược đồ ứng
dụng GML (GML application schema). Ở phần sau sẽ mô tả cách mà client yêu cầu
một tài liệu XML có chứa định nghĩa của các đối tượng có trên server được cung
cấp bởi lược đồ ứng dụng GML này. Các định nghĩa lược đồ ứng dụng này cần phải
tuân thủ mô tả của ngôn ngữ đánh dấu địa lí của chuẩn OpenGIS (OpenGIS
Geography Markup Language- GML ), phiên bản 2.1.1.
Một ứng dụng client sử dụng định nghĩa lược đồ ứng dụng GML của một loại
Feature nào đó để chỉ đến tất cả các Feature thuộc loại Feature này và chỉ đến tên và
kiểu dữ liệu của các thuộc tính của các Feature này. Giá trị của các thuộc tính của
một Feature sẽ cấu thành trạng thái của Feature đó (Feature state). Một ứng dụng
client tham chiếu đến các Feature bằng cách chỉ ra tên của loại Feature đó và tên
của các thuộc tính của Feature. Một ứng dụng client có thể yêu cầu một transaction
WFS thực hiện cập nhật trạng thái của một Feature thông qua các operation insert,
update, delete.
3.3.4. Tên của các thuộc tính Một Web Feature Service tham chiếu đến tên các thuộc tính của Feature được
định nghĩa trong lược đồ ứng dụng GML. Tuy nhiên, vì trạng thái của một Feature
được thể hiện bằng GML, nên tên các thuộc tính được Web Feature Service sử dụng
phải tuân thủ theo mô tả của một tài liệu XML. Thêm nữa, tên các thuộc tính có thể
chứa phần Namespace theo như mô tả của Namespace của XML. Định nghĩa dưới
đây được trích ra từ mô tả của XML: NCName ::= (Letter | '_') (NCNameChar)*
NCNameChar ::=Letter|Digit|'.'|'-'|'_'|CombiningChar|Extender
QName ::= (Prefix ':')? LocalPart
Prefix ::= NCName
LocalPart ::= NCName
Chương 3. Web Feature Service (WFS)
41
Ví dụ:
Ví dụ của các tên thuộc tính hợp lệ là:
Age, Temperature, _KHz, myns:INWATERA_1M.WKB_GEOM
Ví dụ của các tên thuộc tính không hợp lệ:
+Domain, 123_SomeName
3.3.5. Tham chiếu đến thuộc tính
3.3.5.1. Giới thiệu
GML cho phép các Feature địa lý được phép chứa các thuộc tính phi địa lí phức
hợp. Vấn đề đặt ra là làm cách nào để có thể tham chiếu được đến các thuộc tình
này ở nhiều nơi khác nhau (chẳng hạn như trong câu truy vấn hoặc trong 1 chuỗi
Filter). WFS phải dùng đến cấu trúc XPath được mô tả dưới đây để tham chiếu đến
các thuộc tính và các thuộc tính con của Feature.
3.3.5.2. Biểu thức XPath (XPath expression)
Ngôn ngữ đường dẫn XML (XML Path Language) chính là ngôn ngữ dùng để
chỉ ra các phần của một tài liệu XML, còn ở đây nó được dùng để chỉ đển các thuộc
tính của Feature, các thuộc tính này được chỉ đến bởi các thành phần (element) hoặc
các thuộc tính của tài liệu XML.
Theo tài liệu này thì các WFS không cần phải hỗ trợ hoàn toàn ngôn ngữ XPath,
để giảm chi phí cài đặt thì các WFS chỉ phải hỗ trợ các phần sau đây của ngôn ngữ
XPath.
1)WFS phải hỗ trợ các đường dẫn đến các địa chỉ được viết tắt.
2)Đường dẫn đến các địa chỉ phải dùng kí tự “/” để ngăn cách giữa các cấp.
3)Bước đầu tiên của đường dẫn phải tương ứng với thành phần gốc của thuộc
tính của Feature đang được tham chiếu tới hoặc tương ứng với thành phần gốc của
loại Feature mà có bước kế tiếp tương ứng với thành phần gốc của thuộc tính của
Feature đang được tham chiếu tới.
Chương 3. Web Feature Service (WFS)
42
Ví dụ: Xét tài liệu XML sau đây mô tả về 1 đối tượng person. <?xml version="1.0" ?>
<schema
targetNamespace="http://www.someserver.com/myns"
xmlns:myns="http://www.someserver.com/myns"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="1.0">
<import namespace="http://www.opengis.net/gml"
schemaLocation="../gml/2.1/feature.xsd"/>
<element name="Person" type="myns:PersonType"
substitutionGroup="gml:_Feature"/>
<complexType name="PersonType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="LastName" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
</simpleType>
</element>
<element name="FirstName" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="10"/>
</restriction>
</simpleType>
</element>
Chương 3. Web Feature Service (WFS)
43
<element name="Age" type="integer"
nillable="true"/>
<element name="Sex" type="string"/>
<element name="Spouse">
<complexType>
<attribute name="sin" type="xsd:anyURI"
use="required" />
</complexType>
</element>
<element name="Location"
type="gml:PointPropertyType"
nillable="true"/>
<element name="Address" type="myns:AddressType"
nillable="true"/>
<element name="Phone" type="xsd:string"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="sin" type="xsd:anyURI"
use="required"/>
</extension>
</complexContent>
</complexType>
<complexType name="AddressType">
<sequence>
<element name="StreetName" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
</simpleType>
</element>
<element name="StreetNumber" nillable="true">
Chương 3. Web Feature Service (WFS)
44
<simpleType>
<restriction base="string">
<maxLength value="10"/>
</restriction>
</simpleType>
</element>
<element name="City" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
</simpleType>
</element>
<element name="Province" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
</simpleType>
</element>
<element name="PostalCode" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="15"/>
</restriction>
</simpleType>
</element>
<element name="Country" nillable="true">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
Chương 3. Web Feature Service (WFS)
45
</simpleType>
</element>
</sequence>
</complexType>
</schema>
Chú ý là thuộc tính Address là 1 thuộc tính phức hợp thuộc loại AddressType.
Một Feature person có thể được mô tả như sau: <?xml version="1.0" ?>
<myns:Person
sin="111222333"
xmlns:myns=http://www.opengis.net/myns
xmlns:gml=http://www.opengis.net/gml
xmlns:xlink=http://www.w3.org/1999/xlink
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.opengis.net/myns
erson.xsd">
<myns:LastName>Smith</myns:LastName>
<myns:FirstName>Fred</myns:FirstName>
<myns:Age>35</myns:Age>
<myns:Sex>Male</myns:Sex>
<myns:Spouse sin="444555666" />
<myns:Location>
<gml:Point>
<gml:coordinates>15,15</gml:coordinates>
</gml:Point>
</myns:Location>
<myns:Address>
<myns:StreetName>Main St.</myns:StreetName>
<myns:StreetNumber>5</myns:StreetNumber>
<myns:City>SomeCity</myns:City>
Chương 3. Web Feature Service (WFS)
46
<myns:Province>SomeProvince</myns:Province>
<myns:PostalCode>X1X 1X1</myns:PostalCode>
<myns:Country>Canada</myns:Country>
</myns:Address>
<myns:Phone>416-123-4567</myns:Phone>
<myns:Phone>416-890-1234</myns:Phone>
</myns:Person>
Sử dụng biếu thức XPath thì các thuộc tính của Feature Person có thể được tham
chiếu như dưới đây:
LastName
FirstName
Age
Sex
Source
Location
Address
Address/StreetNumber
Address/StreetName
Address/City
Address/Province
Address/Postal_Code
Address/Country
Phone[1]
Phone[2]
Chú ý là đối với Feature này thì mỗi đường dẫn được bắt đầu bằng thành phần
gốc của thuộc tính của Feature đang được tham chiếu, tương ứng với tên của thuộc
tính. Mỗi thuộc tính được tham chiếu tới bởi loại đường dẫn này có thể được bắt
đầu bởi thành phần gốc của Feature (chính là tên loại Feature). Do đó thuộc tính
LastName có thể được tham chiếu bằng đường dẫn Person/LastName. Thuộc tính
City có thể được tham chiếu tới bởi đường dẫn Person/Address/City.
Chương 3. Web Feature Service (WFS)
47
Thành phần Phone xuất hiện nhiều lần và vị từ [1], [2] được dùng để chỉ cụ thể
thành phần này là thành phần thứ mấy. Vị từ [1] dùng để chỉ lần xuất hiện thứ nhất
của thành phần Phone, vị từ [2] chỉ lần xuất hiện thứ 2 của thành phần Phone.
3.3.6. Thành phần <Native> Mỗi nhà cung cấp chỉ có được một số khả năng nhất định nào đó.
Thành phần <Native> được dùng để truy xuất đến các khả năng riêng của từng
nhà cung cấp của một Web Feature Service nào đó.
Thành phần <Native> được định nghĩa như sau: <xsd:element name="Native" type="wfs:NativeType"/>
<xsd:complexType name="NativeType">
<xsd:any />
<xsd:attribute name="vendorId" type="xsd:string"
use="required"/>
<xsd:attribute name="safeToIgnore" type="xsd:boolean"
use="required"/>
</xsd:complexType>
Thành phần này chỉ đơn giản chứa lệnh (command ) hoặc là thao tác (operation)
riêng biệt của nhà cung cấp.
Thuộc tính VendorId được dùng để chỉ nhà cung cấp hiểu lệnh và thao tác được
mô tả trong thành phần <Native>. Thuộc tính này được đưa ra để cho một Web
Feature Service biết là nó có thể xử lí được một lệnh nào đó hay không.
Thuộc tình safeToIgnore chỉ cho Web Feature Service biết là nó nên làm gì nếu
như nó không nhận ra các lệnh hay các thao tác đó. Thuộc tính safeToIgnore có 2
giá trị là True và False, ý nghĩa của chúng như sau:
Nếu safeToIgnore=False thì Web Feature Service không thể bỏ qua thao tác
được yêu cầu, nếu như nó không thể giải quyết được thì coi như thao tác này thất
bại.
Nếu safeToIgnore=True thì Web Feature Service có thể bỏ qua thành phần
<Native> này.
Chương 3. Web Feature Service (WFS)
48
Ví dụ: mô tả cách dùng thành phần <Native> để kích hoạt một chức năng của
một cơ sở dữ liệu quan hệ dựa trên SQL. Thành phần <Native> này chỉ ra rằng đây
là một lệnh Oracle và lệnh này có thể bỏ qua: <Native vendorId="Oracle" safeToIgnore="True">
ALTER SESSION ENABLE PARALLEL DML
</Native>
3.3.7. Filter Một Filter định nghĩa một tập hợp Feature sẽ được thao tác. Tập hợp này có thể
bao gồm một hoặc nhiều Feature (có thể đếm được) hoặc một tập hợp các Feature
được định nghĩa bởi các ràng buộc không gian hoặc phi không gian (đây là các ràng
buộc trên các thuộc tính vô hướng hay các thuộc tính địa lý của các loại đối tượng).
Các Filter này được mô tả trong tài liệu OGC Filter Encoding Implementation
Specification.
3.3.8. Thông báo về các biệt lệ (Exception Reporting) Nếu như Web Feature Service gặp phải lỗi khi xử lí một truy vấn nào đó hoặc là
khi nó không hiểu được một câu truy vấn nào đó, nó có thể phát sinh một tài liệu
XML để chỉ ra lỗi đã xảy ra. Định dạng của loại tài liệu dùng để thông báo lỗi này
được mô tả bởi lược đồ thông báo lỗi (định nghĩa trong phần A.2).
Một thành phần <ServiceExceptionReport> có thể chứa một hoặc nhiều lỗi.
Thuộc tính bắt buộc version được dùng để chỉ phiên bản của lược đồ thông báo lỗi.
Trong phiên bàn WFS này thì giá trị này cố định là 1.2.0.
Các thông báo lỗi cụ thể được chứa trong thành phần <ServiceException>.
Thuộc tính tùy chọn code dùng để chỉ mã lỗi của lỗi phát sinh. Thuộc tính tùy chọn
locator được dùng để chỉ nơi gây ra lỗi trong câu truy vấn. Một số thành phần trong
tài liệu này chứa thuộc tính handle, thuộc tính này liên kết một cái tên gợi nhớ với
mỗi thành phần. Nếu thuộc tính này tồn tại thì giá trị của nó có thể xuất hiện trong
thuộc tính Locator của thành phần <ServiceException> . Nếu như thuộc tính này
Chương 3. Web Feature Service (WFS)
49
không tồn tại thì Web Feature Server có thể dùng các phương pháp khác để chỉ nơi
gây ra lỗi, chẳng hạn như dùng số thứ tự của dòng gây ra lỗi….
Ví dụ:
Ví dụ dưới đây dùng để chỉ ra một lỗi là: câu lệnh Insert đầu tiên bị lỗi vì nó
thiểu một dấu đóng tag XML trong câu truy vấn. <?xml version="1.0" ?>
<ServiceExceptionReport
version="1.2.0"
xmlns=http://www.opengis.net/ogc
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.opengis.net/ogc
../wfs/1.0.0/OGC-exception.xsd">
<ServiceException code="999" locator="INSERT STMT 01">
parse error: missing closing tag for element WKB_GEOM
</ServiceException>
</ServiceExceptionReport>
3.3.9. Các thuộc tính XML chung
3.3.9.1. Thuộc tính version
Tất cả các câu truy vấn gởi lên một WFS đều có chứa một thuộc tính là version.
Thuộc tính bắt buộc version dùng để chỉ ra phiên bản WFS của câu truy vấn này.
Giá trị mặc định của version là 1.0.0, đây cũng là phiên bản mà tài liệu này mô tả.
3.3.9.2. Thuộc tính service
Tất cả các câu truy vấn gởi lên một WFS đều chứa thuộc tính bắt buộc là
service. Thuộc tính này dùng để chỉ ra loại dịch vụ được gọi thực hiện. Khi truy vấn
đến một Web Feature Service thì service có giá trị là “WFS”.
Chương 3. Web Feature Service (WFS)
50
3.3.9.3. Thuộc tính handle
Ưng dụng client sử dụng thuộc tính handle để gán cho mỗi câu truy vấn một tên
gợi nhớ. Nếu client có sử dụng thuộc tính này thì khi có lỗi xảy ra Web Feature
Service sẽ dùng handle để chỉ ra chỗ bị lỗi.
3.4. DescribeFeatureType
3.4.1. Giới thiệu Chức năng của operation DescribeFeatureType là tạo ra một mô tả lược đồ của
các kiểu của feature được hỗ trợ bởi WFS. Các mô tả lược đồ định nghĩa làm thế
nào mà một WFS trông đợi các thể hiện của feature được mã hóa để đưa vào đầu
vào và làm thế nào mà các thể hiện của feature được xuất ra ở đầu ra.
3.4.2. Request Một thành phần DescribeFeatureType có thể không chứa hoặc chứa nhiều
thành phần TypeName mã hóa cho tên của các kiểu feature được mô tả. Nếu nội
dung của thành phần DescribeFeatureType là rỗng, thì request sẽ được hiểu là yêu
cầu tất cả các kiểu của feature mà WFS hỗ trợ. Tài liệu XML mã hóa cho request
DescribeFeatureType được định nghĩa theo đọan lược đồ XML sau: <xsd:element name="DescribeFeatureType"
type="wfs:DescribeFeatureTypeType"/>
<xsd:complexType name="DescribeFeatureTypeType">
<xsd:sequence>
<xsd:element name="TypeName" type="xsd:QName"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="version" type="xsd:string"
use="required" fixed="1.0.0"/> <xsd:attribute
ame="service" type="xsd:string" use="required"
ixed="WFS"/>
<xsd:attribute name="outputFormat" type="xsd:string"
Chương 3. Web Feature Service (WFS)
51
use="optional" default="XMLSCHEMA"/>
</xsd:complexType>
Thuộc tính outputFormat dùng để chỉ ngôn ngữ mô tả lược đồ. Định dạng xuất
bắt buộc cho operation DescribeFeatureType là một lược đồ XML, và giá trị của
tham số này là XLMSCHEMA. Các định dạng khác cũng có thể chấp nhận nếu
được đặc tả trong tài liệu Capabilities XML.
3.4.3. Response Nếu thuộc tính outputFormat có giá trị là XLMSCHEMA thì trong response
của DescribeFeatureType request, WFS phải đưa ra lược đồ XML là một lược đồ
ứng dụng GML hợp lệ nó định nghĩa lược đồ của các kiểu feature được liệt kê trong
request.
Một tàl liệu lược đồ XML chỉ có thể mô tả các thành phần nằm trong cùng một
không gian tên. Điều này có nghĩa là WFS không thể có các feature trong nhiều
không gian tên trong cùng một lược đồ XML. Để vượt qua giới hạn này, WFS sẽ
tạo ra một lược đồ XML gọi là lược đồ “bao” nó chứa trong đó các lược đồ của các
feature từ nhiều không gian tên khác nhau trong câu request. Ví dụ: xem xét một
request sau: <?xml version="1.0" ?>
<DescribeFeatureType
version="1.0.0"
service="WFS"
xmlns=http://www.opengis.net/wfs
xmlns:ns01=http://www.server01.com/ns01
xmlns:ns02=http://www.server02.com/ns02
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-basic.xsd">
<TypeName>ns01:TREESA_1M</TypeName>
<TypeName>ns02:ROADL_1M</TypeName>
Chương 3. Web Feature Service (WFS)
52
</DescribeFeatureType>
WFS sẽ trả về một response cho request trên như sau: <?xml version="1.0" ?>
<schema
xmlns=http://www.w3.org/2001/XMLSchema
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<import namespace=http://www.server01.com/ns01
schemaLocation="http://www.myserver.com/wfs.cgi?
request=DescribeFeatureType&typeName=ns01:TREESA_1M"/>
<import namespace=http://www.server02.com/ns02
schemaLocation="http://www.yourserver.com/wfs.cgi?
request=DescribeFeatureType&typeName=ns02:ROADL_1M"/>
</schema>
Trong ví dụ trên, WFS dùng một request DescribeFeatureType để lấy về các
lược đồ cho các feature nằm trong các không gian tên khác nhau.
3.4.4. Biệt lệ Nếu trong khi gọi request DescribeFeatureType mà xảy ra lỗi thì WFS sẽ gửi
đi một biệt lệ.
3.5. GetFeature
3.5.1. Giới thiệu Operation GetFeature cho phép lấy các feature của một WFS. Sau khi xử lý
request của GetFeature, WFS sẽ gửi lại một tài liệu XML chứa các kết quả cho
client.
Chương 3. Web Feature Service (WFS)
53
3.5.2. Request Tài liệu XML mã hóa cho request của GetFeature được định nghĩa bởi đọan
lược đồ XML sau đây: <xsd:element name="GetFeature" type="wfs:GetFeatureType"/>
<xsd:complexType name="GetFeatureType">
<xsd:sequence>
<xsd:element ref="wfs:Query" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="version"
type="xsd:string" use="required" fixed="1.0.0"/>
<xsd:attribute name="service"
type="xsd:string" use="required" fixed="WFS"/>
<xsd:attribute name="handle"
type="xsd:string" use="optional"/>
<xsd:attribute name="outputFormat"
type="xsd:string" use="optional" default="GML2"/>
</xsd:attribute>
<xsd:attribute name="maxFeatures"
type="xsd:positiveInteger"
use="optional"/>
</xsd:complexType>
<xsd:element name="Query" type="wfs:QueryType"/>
<xsd:complexType name="QueryType">
<xsd:sequence>
<xsd:element ref="ogc:PropertyName" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element ref="ogc:Filter" minOccurs="0"
maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="handle"
type="xsd:string" use="optional"/>
Chương 3. Web Feature Service (WFS)
54
<xsd:attribute name="typeName"
type="xsd:QName" use="required"/>
<xsd:attribute name="featureVersion"
type="xsd:string" use="optional"/>
</xsd:complexType>
Thành phần <GetFeature> chứa một hoặc nhiều thành phần <Query> mà mỗi
thành phần sẽ chứa trong đó một câu truy vấn. Kết quả của tất cả các câu truy vấn
trong request của GetFeature được nối lại thành một chuỗi kết quả duy nhất.
Thuộc tính outputFormat sẽ định nghĩa định dạng dùng để tạo chuỗi kết quả.
Giá trị mặc định là GML2. Các định dạng khác cũng có thể chấp nhận nếu được
đặc tả trong tài liệu Capabilities XML.
Thuộc tính tùy chọn maxFeatures được dùng để giới hạn số lượng các feature
mà một request có thể gọi. Một khi đạt tới giới hạn này thì chuỗi kết quả sẽ được
nối lại ngay tại điểm đó.
Mỗi một câu truy vấn trong một request GetFeature được định nghĩa bằng cách
sử dụng thành phần <Query>. Thành phần này định nghĩa kiểu feature cần truy
vấn, thuộc tính cần lấy của nó và các ràng buộc áp dụng trên các thuộc tính đó.
Thuộc tính typeName dùng để chỉ ra tên của kiểu feature hoặc lớp feature được
truy vấn.
Thuộc tính featureVersion cung cấp việc định phiên bản cho các feature.
Thành phần <PropertyName> dùng để kiệt kê các thuộc tính của feature mà
các thuộc tính này được chọn trong câu truy vấn và giá trị của chúng được xuất ra
trong response cho request GetFeature. Các ứng dụng client có thể xác định các
thuộc tính của feature bằng cách tạo ra câu request DescribeFeatureType trước khi
tạo ra câu request GetFeature. Nếu không có thành phần <PropertyName> nào
được chỉ định thì tất cả các thuộc tính của feature sẽ được truy vấn.
Thành phần <Filter> dùng để định nghĩa các ràng buộc trên câu truy vấn. Kể cả
ràng buộc không gian và phi không gian đều có thể được mô tả trong đặc tả bộ lọc.
Chương 3. Web Feature Service (WFS)
55
Nếu thành phần <Filter> không được dùng trong thành phần <Query> thì câu truy
vấn này không có ràng buộc và tất cả mọi thể hiện của feature đều được truy vấn.
Thành phần <GetFeatureWithLock> tương tự như thành phần <GetFeature> và
thêm ý nghĩa rằng WFS sẽ khóa các feature được chọn lại, thường là cho mục đích
cập nhật feature.
3.5.3. Response Định dạng của response cho một request của GetFeature được quy định bởi
thuộc tính outputFormat. Giá trị mặc định cho thuộc tính này là GML2.
Đoạn lược đồ XML sau mô tả công dụng của thuộc tính schemaLocation trên
thành phần gốc: <?xml version="1.0" ?>
<wfs:FeatureCollection
xmlns=http://www.opengis.net/myns
xmlns:myns=http://www.opengis.net/myns
xmlns:gml=http://www.opengis.net/gml
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.opengis.net/myns
http://www.someserver.com/wfs.cgi?
request=DescribeFeatureType&typename=TREESA_1M,ROADL_1M"> …
Đối với lọai request <GetFeatureWithLock>, WFS cần phải tạo ra chuỗi kết quả
bao gồm cả định danh khóa. Định danh khóa này được mã hóa dựa trên thuộc tính
lockId được định nghĩa trong thành phần <wfs:FeatureCollection>. Đoạn lược đồ
XML sau mình họa làm thế nào để thêm thuộc tính lockID vào câu response của
operation. <wfs:FeatureCollection lockId="00A01"… >
…
</wfs:FeatureCollection>
Chương 3. Web Feature Service (WFS)
56
3.5.4. Biệt lệ Nếu trong khi gọi request GetFeature mà xảy ra lỗi thì WFS sẽ gửi đi một biệt
lệ.
3.6. LockFeature
3.6.1. Giới thiệu Kết nối Internet vốn là không trạng thái. Điều đó dẫnn đến hậu quả là các giao
tác được thực hiện mà không có sự bảo đảm. Để hiểu rõ hơn, ta hãy xét một tác vụ
cập nhập. Client gọi cập nhật một feature. Feature được hiệu chỉnh ở client rồi được
gửi ngược lại cơ sở dữ liệu thông qua request yêu cầu cập nhật của operation
Transaction. Quá trình thực hiện sẽ xảy ra mất mát do ở đây không có gì bảo đảm
rằng trong lúc feature đang được cập nhật ở phía client thì không có một client khác
cũng đến và cập nhật feature này trên cơ sở dữ liệu.
Một cách duy nhất để đảm bảo quá trình thực hiện là yêu cầu quá trình truy xuất
dữ liệu được thực hiện hoàn toàn tách biệt, có nghĩa là khi có một giao tác truy cập
vào cơ sở dữ liệu thì không được có một giao tác khác cũng đồng thời truy cập vào
cơ sở dữ liệu đó. Điều này được thực hiện bằng cách sử dụng khóa để điều khiển sự
truy cập đến cơ sở dữ liệu.
Mục đích của operation LockFeature là để đưa ra một cơ chế khóa feature lâu
dài và được bảo đảm về sừ bền vững. LockFeature là tùy chọn và không cần được
hỗ trợ bởi các WFS. Nếu có hỗ trợ thì nó phải được đặc tả trong tài liệu Capabilities
XML.
Chương 3. Web Feature Service (WFS)
57
3.6.2. Request Tài liệu XML mã hóa cho request của LockFeature được định nghĩa bởi đoạn
lược đồ XML sau: <xsd:element name="LockFeature" type="wfs:LockFeatureType"/>
<xsd:complexType name="LockFeatureType">
<xsd:sequence>
<xsd:element name="Lock"
type="wfs:LockType"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="version"
type="xsd:string" use="required" fixed="1.0.0"/>
<xsd:attribute name="service"
type="xsd:string" use="required" fixed="WFS"/>
<xsd:attribute name="expiry"
type="xsd:positiveInteger" use="optional"/>
<xsd:attribute name="lockAction"
type="wfs:AllSomeType" use="optional"/>
</xsd:complexType>
<xsd:complexType name="LockType">
<xsd:sequence>
<xsd:element ref="ogc:Filter" minOccurs="0"
maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="handle"
type="xsd:string" use="optional"/>
<xsd:attribute name="typeName"
type="xsd:QName" use="required"/>
</xsd:complexType>
Chương 3. Web Feature Service (WFS)
58
Thành phần <LockFeature> có thể chứa trong nó một hay nhiều thành phần
<Lock> định nghĩa cho các giao tác khóa trên nhiều thể hiện của feature của cùng
loại feature.
Thuộc tính expiry được dùng để chỉ ra giới hạn trong bao lâu mà WFS có thể
giữ được khóa trên các thể hiện của feature cho đến khi có sự kiện không có giao
tác nào được phát ra nữa thì sẽ giải phóng khóa. Giá trị của nó được tính theo phút.
Khi số phút này hết, thì WFS sẽ giải phóng khóa nếu nó kết thúc. Bất cứ giao tác
nào nhằm tác động đến khóa thông qua định danh khóa đều bị dịch vụ từ chối. Tuy
nhiên lại không có đặc tả cho biết khóa sẽ được giữ trong bao lâu nếu thuộc tính này
không được định nghĩa. Tuy nhiên, hầu hết các WFS sẽ có các phương thức để kiểm
tra và giải phóng khóa sau một khoảng thời gian không có giao tác nào tác động tới
nó.
Thuộc tính tùy chọn lockAction được dùng để điều khiển các khóa của feature.
Nếu có giá trị là ALL thì WFS sẽ cố gắng khóa trên tất cả các feature được yêu cầu
truy vấn trong request. Nếu tất cả các feature không được khóa thì operation sẽ báo
thất bại. Nếu có giá trị là SOME thì cố gắng khóa trên các feature nào trong câu
request mà nó khóa được mà thôi. Giá trị mặc định của thuộc tính lockAction là
ALL.
3.6.3. Response Tài liệu XML mã hóa cho response của request của LockFeature được định
nghĩa bởi đoạn lược đồ XML sau: <xsd:element name="WFS_LockFeatureResponse"
type="wfs:WFS_LockFeatureResponseType"/>
<!-- RESPONSE TYPES -->
<xsd:complexType name="WFS_LockFeatureResponseType">
<xsd:sequence>
<xsd:element ref="wfs:LockId"/>
<xsd:element name="FeaturesLocked"
type="wfs:FeaturesLockedType" minOccurs="0"/>
Chương 3. Web Feature Service (WFS)
59
<xsd:element name="FeaturesNotLocked"
type="wfs:FeaturesNotLockedType" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="FeaturesLockedType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element ref="ogc:FeatureId"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="FeaturesNotLockedType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element ref="ogc:FeatureId"/>
</xsd:sequence>
</xsd:complexType>
Trong response của một LockFeature request, WFS sẽ tạo ra một tài liệu XML.
Tài liệu này chứa một định danh khóa mà ứng dụng client có thể dùng trong các
operation của WFS để giao tác đến một tập các thể hiện feature đã được khóa.
Trong response có thể có các thành phần tùy chọn <FeaturesLocked> và
<FeaturesNotLocked> tùy thuộc vào giá trị của thuộc tính lockAction trong câu
request. Nếu nó có giá trị là SOME thì thành phần <WFS_LockFeatureResponse>
phải chứa các thành phần <FeaturesLocked> và <FeaturesNotLocked>. Thành
phần <FeaturesLocked> liệt kê các định danh feature đã được khóa bởi request
LockFeature. Thành phần <FeaturesNotLocked> liệt kê các định danh feature
không thể khóa bởi WFS (có thể do nó được khóa bởi một ai khác).
Không có định dạng cho các định danh khóa. Chỉ có một yêu cầu duy nhất là tập
ký tự trong định danh khóa phải theo tập ký tự của request giao tác.
3.6.4. Biệt lệ Nếu WFS không hỗ trợ LockFeature thì nó sẽ gửi một biệt lệ để báo rằng
operation này không được hỗ trợ khi có một yêu cầu về LockFeature được gởi đến.
Chương 3. Web Feature Service (WFS)
60
Nếu WFS hỗ trợ LockFeature và khi xảy ra một lỗi trong request thì nó sẽ gửi
ra một biệt lệ.
3.7. Transaction
3.7.1. Giới thiệu Operation Transaction được dùng để mô tả các giao tác làm thay đổi dữ liệu
của các feature cho phép truy xuất qua môi trường web. Một WFS có thể thực hiện
operation Transaction một cách trực tiếp hoặc được chuyển qua ngôn ngữ của kho
lưu trữ đích mà nó kết nối tới và để cho kho lưu trữ thực hiện giao tác này. Khi giao
tác chấm dứt, WFS sẽ gửi trả về một lài liệu XML mô tả trạng thái kết thúc của giao
tác.
Operation Transaction là tùy chọn cho các WFS, nó không cần thiết phải hỗ trợ
giao tác này. Nếu được hỗ trợ thì nó phải được đặc tả trong tài liệu Capabilities
XML.
3.7.2. Request
3.7.2.1. Định nghĩa lược đồ
Tài liệu XML của request cho Transaction được định nghĩa bởi đoạn lược đồ
XML sau: <xsd:element name="Transaction" type="wfs:TransactionType"/>
<xsd:complexType name="TransactionType">
<xsd:sequence>
<xsd:element ref="wfs:LockId" minOccurs="0"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="wfs:Insert"/>
<xsd:element ref="wfs:Update"/>
<xsd:element ref="wfs:Delete"/>
<xsd:element ref="wfs:Native"/>
</xsd:choice>
</xsd:sequence>
Chương 3. Web Feature Service (WFS)
61
<xsd:attribute name="version"
type="xsd:string" use="required" fixed="1.0.0"/>
<xsd:attribute name="service"
type="xsd:string" use="required" fixed="WFS"/>
<xsd:attribute name="handle"
type="xsd:string" use="optional"/>
<xsd:attribute name="releaseAction"
type="wfs:AllSomeType" use="optional"/>
</xsd:complexType>
<xsd:element name="LockId" type="xsd:string"/>
<xsd:element name="Insert" type="wfs:InsertElementType"/>
<xsd:complexType name="InsertElementType">
<xsd:sequence>
<xsd:element ref="gml:_Feature" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="handle" type="xsd:string"
use="optional"/>
</xsd:complexType>
<xsd:element name="Update" type="wfs:UpdateElementType"/>
<xsd:complexType name="UpdateElementType">
<xsd:sequence>
<xsd:element ref="wfs:Property" maxOccurs="unbounded"/>
<xsd:element ref="ogc:Filter" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="handle" type="xsd:string"
use="optional"/>
<xsd:attribute name="typeName" type="xsd:QName"
use="required"/> </xsd:complexType>
<xsd:element name="Delete" type="wfs:DeleteElementType"/>
<xsd:complexType name="DeleteElementType">
<xsd:sequence>
<xsd:element ref="ogc:Filter" minOccurs="1" maxOccurs="1"/>
Chương 3. Web Feature Service (WFS)
62
</xsd:sequence>
<xsd:attribute name="handle" type="xsd:string"
use="optional"/>
<xsd:attribute name="typeName" type="xsd:QName"
use="required"/> </xsd:complexType>
<xsd:element name="Property" type="wfs:PropertyType"/>
<xsd:complexType name="PropertyType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:QName"/>
<xsd:element name="Value"/>
</xsd:sequence>
</xsd:complexType>
3.7.2.2. Mô tả các thuộc tính
Thuộc tính hadle dùng để gán một tên dễ nhớ cho thành phần tương ứng với nó.
Ngoài ra nó còn giúp cho việc báo lỗi đến ứng dụng client được dễ hiểu hơn. Khi lỗi
xảy ra, WFS sẽ dùng thuộc tính handle để định vị lỗi nhằm phát sinh ra biệt lệ một
cách chính xác. Nếu thuộc tính này không được xác định, WFS sẽ cố gắng thông
báo vị trí của biệt lệ tương ứng với lỗi trong request của Transaction dựa trên số
dòng hoặc một cơ chế nào khác.
Giả sử WFS có hỗ trợ operation LockFeature và/hoặc operation
GetFeatureWithLock, thì thuộc tính releaseAction được dùng để điều khiển việc
giải phóng các feature đã khóa khi request của Transaction hoàn thành. Nếu thuộc
tính này có giá trị ALL thì chỉ ra rằng tất cả các khóa của các feature bị khóa với
định danh khóa <LockID> sẽ được giải phóng khi giao tác chấm dứt, bất chấp
trong số các feature đang bị khóa vẫn còn có feature đang được truy cập. Nếu thuộc
tính này có giá trị SOME thì chỉ ra rằng chỉ những khóa của các feature có trong
request của Transaction sẽ được giải phóng, và khi đó, thuộc tính releaseAction
của thành phần <LockFeature> hoặc <GetFeatureWithLock> sẽ được trả về giá
trị “0” sau khi kết thúc giao tác. Giá trị mặc định của releaseAction là ALL.
Chương 3. Web Feature Service (WFS)
63
3.7.2.3. Thành phần <Transaction>
Thành phần <Transaction> có thể không chứa hoặc chứa nhiều các thành phần
<Insert>, <Update>, <Delete>, chúng mô tả các thao tác thêm, cập nhật, xóa các
thể hiện của feature. Một thành phần <Transaction> trống vẫn hợp lệ song sẽ
không có ích.
Thành phần tùy chọn <LockID> chỉ ra rằng giao tác sẽ thực hiện trên các thể
hiện feature đã được khóa nào. Nếu WFS không hỗ trợ khả năng khóa feature thì
thành phần <LockID> sẽ bị bỏ qua. Nếu WFS có hỗ trợ khóa và có một định danh
khóa không hợp lệ thì WFS sẽ gửi ra một biệt lệ và giao tác sẽ chấm dứt.
Thành phần <Native> đã được định nghĩa ở mục “Các thành phần mở rộng”.
3.7.2.4. Thành phần <Insert>
Thành phần <Insert> được dùng để thêm mới các thể hiện của feature. Trong
một operation Transaction có thể có nhiều thành phần <Insert> và với mỗi thành
phần <Insert> có thể được dùng để tạo mới nhiều thể hiện của feature.
Trong response trả về cho giao tác <Insert>, WFS sẽ trả về một danh sách các
định danh feature mới được gán cho các thể hiện của feature được thêm mới. Các
định danh feature được hiển thị theo đúng trình tự được thực hiện trong thành phần
<Insert> của giao tác.
Ví dụ: Giao tác sau sẽ tạo mới hai thể hiện của kiểu feature INWATERA_1M. <?xml version="1.0"?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns="http://www.someserver.com/myns"
xmlns:gml="http://www.opengis.net/gml"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.someserver.com/myns
Chương 3. Web Feature Service (WFS)
64
http://www.someserver.com/wfs/cwwfs.cgi?
request=describefeaturetype&typename=INWATERA_1M.xsd
http://www.opengis.net/wfs ../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Insert>
<INWATERA_1M>
<WKB_GEOM>
<gml:Polygon gid="1"
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>-98.54,24.26 ...</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</WKB_GEOM>
<ID>150</ID>
<F_CODE>ABCDE</F_CODE>
<HYC>152</HYC>
<TILE_ID>250</TILE_ID>
<FAC_ID>111</FAC_ID>
</INWATERA_1M>
<INWATERA_1M>
<WKB_GEOM>
<gml:Polygon gid="1"
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>-99.99,22.22 ...</gml:coordinates>
gml:outerBoundaryIs>
</gml:Polygon>
</WKB_GEOM>
<ID>111</ID>
Chương 3. Web Feature Service (WFS)
65
<F_CODE>FGHIJ</F_CODE>
<HYC>222</HYC>
<TILE_ID>333</TILE_ID>
<FAC_ID>444</FAC_ID>
</INWATERA_1M>
</wfs:Insert>
</wfs:Transaction>
3.7.2.5. Thành phần <Update>
Thành phần <Update> được dùng để cập nhật các thể hiện của feature. Trong
một operation Transaction có thể có nhiều thành phần <Update> và với mỗi thành
phần <Update> có thể được dùng để cập nhật nhiều thể hiện của feature.
Thành phần <Update> chứa một hoặc nhiều thành phần <Property> cho biết
tên và giá trị cập nhật của thuộc tính của kiểu feature được định danh bằng thuộc
tính typeName. Thành phần <Name> trong thành phần <Property> chỉ ra tên
thuộc tính cần cập nhật. Thành phần tùy chọn <Value> chỉ ra giá trị cập nhật cho
thuộc tính đó. Nếu thành phần này không được định nghĩa thì giá trị NULL sẽ được
gán cho thuộc tính này. Nếu thuộc tính này không được phép có giá trị NULL thì
WFS sẽ đưa ra môt biệt lệ.
Phạm vi của thành phần <Update> được ràng buộc bởi thành phần <Filter>. Nó
được dùng để giới hạn phạm vi của giao tác cập nhật.
Ví dụ: Ví dụ sau cho thấy giao tác cập nhật thuộc tính POPULATION của định
danh feature BUILTUPA_1M.1013 <?xml version="1.0" ?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns="http://www.someserver.com/myns"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Chương 3. Web Feature Service (WFS)
66
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Update typeName="BUILTUPA_1M">
<wfs:Property>
<wfs:Name>POPULATION</wfs:Name>
<wfs:Value>4070000</wfs:Value>
</wfs:Property>
<ogc:Filter>
<ogc:FeatureId fid="BUILTUPA_1M.10131"/>
</ogc:Filter>
</wfs:Update>
</wfs:Transaction>
Cập nhật thuộc tính POPULATION_TYPE của danh sách các feature sau với
giá trị mới là “CITY”. Các feature cần cập nhật có các định danh feature sau:
BUILTUPA_1M.1013, BUILTUPA_1M.34, BUILTUPA_1M.24256 <?xml version="1.0" ?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns="http://www.someserver.com/myns"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Update typeName="BUILTUPA_1M">
<wfs:Property>
<wfs:Name>POPULATION_TYPE</wfs:Name>
<wfs:Value>CITY</wfs:Value>
</wfs:Property>
<ogc:Filter>
Chương 3. Web Feature Service (WFS)
67
<ogc:FeatureId fid="BUILTUPA_1M.1013"/>
<ogc:FeatureId fid="BUILTUPA_1M.34"/>
<ogc:FeatureId fid="BUILTUPA_1M.24256"/>
</ogc:Filter>
</wfs:Update>
</wfs:Transaction>
3.7.2.6. Thành phần <Delete>
Thành phần <Delete> dùng để chỉ ra rằng một hoặc nhiều thể hiện feature sẽ bị
xóa đi. Phạm vi của giao tác xóa được giới hạn bởi thành phần <Filter>.
Ví dụ: Xóa một feature đơn. <?xml version="1.0" ?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns="http://www.someserver.com/myns"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Delete typeName="INWATERA_1M">
<ogc:Filter>
<ogc:FeatureId fid="INWATERA_1M.1013"/>
</ogc:Filter>
</wfs:Delete>
</wfs:Transaction>
Chương 3. Web Feature Service (WFS)
68
Xóa một tập các thể hiện feature. <?xml version="1.0" ?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns:myns="http://www.someserver.com/myns"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Delete typeName="myns:INWATERA_1M">
<ogc:Filter>
<ogc:FeatureId fid="INWATERA_1M.1013"/>
<ogc:FeatureId fid="INWATERA_1M.10"/>
<ogc:FeatureId fid="INWATERA_1M.13"/>
<ogc:FeatureId fid="INWATERA_1M.140"/>
<ogc:FeatureId fid="INWATERA_1M.5001"/>
<ogc:FeatureId fid="INWATERA_1M.2001"/>
</ogc:Filter>
</wfs:Delete>
</wfs:Transaction>
Xóa một tập các thể hiện của feature INWATERA_1M nằm trong miền đa giác
được chỉ định. Thành phấn <Filter> được dùng để ràng buộc phạm vi của giao tác
va đa giác được biểu diễn bằng GML. <?xml version="1.0" ?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns="http://www.someserver.com/myns"
xmlns:wfs="http://www.opengis.net/wfs"
Chương 3. Web Feature Service (WFS)
69
xmlns:gml="http://www.opengis.net/gml"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Delete typeName="INWATERA_1M">
<ogc:Filter>
<ogc:Within>
<ogc:PropertyName>WKB_GEOM</ogc:PropertyName>
<gml:Polygon gid="pp9"
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>-95.7,38.1 -97.8,38.2 ...</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</ogc:Within>
</ogc:Filter>
</wfs:Delete>
</wfs:Transaction>
3.7.3. Response Trong response trả về cho request của Transaction, WFS trả về một tài liệu
XML mô tả trạng thái kết thúc của giao tác.
Tài liệu XML mã hóa cho response được mô tả bằng đoạn lược đồ XML sau. <xsd:element name="WFS_TransactionResponse"
type="wfs:WFS_TransactionResponseType"/>
<xsd:complexType name="WFS_TransactionResponseType">
<xsd:sequence>
<xsd:element name="InsertResult"
type="wfs:InsertResultType"
Chương 3. Web Feature Service (WFS)
70
minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="TransactionResult"
type="wfs:TransactionResultType"/>
</xsd:sequence>
<xsd:attribute name="version"
type="xsd:string" use="required" fixed="1.0.0"/>
</xsd:complexType>
<xsd:complexType name="TransactionResultType">
<xsd:sequence>
<xsd:element name="Status" type="wfs:StatusType"/>
<xsd:element name="Locator" type="xsd:string" minOccurs="0"/>
<xsd:element name="Message" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="handle" type="xsd:string"
use="optional"/>
</xsd:complexType>
<xsd:complexType name="InsertResultType">
<xsd:sequence>
<xsd:element ref="ogc:FeatureId" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="handle" type="xsd:string"
use="optional"/>
</xsd:complexType>
<xsd:complexType name="StatusType">
<xsd:choice>
<xsd:element ref="wfs:SUCCESS"/>
<xsd:element ref="wfs:FAILED"/>
<xsd:element ref="wfs:PARTIAL"/>
</xsd:choice> </xsd:complexType>
<xsd:element name="SUCCESS" type="wfs:EmptyType"/>
<xsd:element name="FAILED" type="wfs:EmptyType"/>
<xsd:element name="PARTIAL" type="wfs:EmptyType"/>
Chương 3. Web Feature Service (WFS)
71
Thành phần <WFS_TransactionResponse> có thể không chứa hoặc chứa nhiều
thành phần <InsertResult> và chứa một thành phần <TransactionResult>.
Thành phần <InsertResult> chứa một hoặc nhiều định danh feature mới được
thêm vào. Một thành phần <InsertResult> tương ứng với một thành phần <Result>
trong câu request.
Kết quả của toàn bộ giao tác được mô tả trong thành phần <TransactionResult>.
Thành phần này phải chứa một thành phần <Status> và có thể chứa thành phần
<Locator> và <Status>. Trong đó, thành phần <Status> mô tả trạng thái hoàn thành
của giao tác. Còn thành phần <Locator> chỉ ra phần nào trong giao tác bị lỗi. Ngoài
ra còn thành phần <Messeage> dùng để báo các thông điệp lỗi.
Ví dụ: Giả sư có giao tác tạo mới các thể hiện của feature “STMT1”, “STMT2”,
“STMT3”. Response cho giao tác này như sau: <?xml version="1.0" ?>
<wfs:TransactionResponse
version="1.0.0"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:InsertResult handle="STMT1">
<ogc:FeatureId fid="SOMEFEATURE.4567"/>
<ogc:FeatureId fid="SOMEFEATURE.4568"/>
<ogc:FeatureId fid="SOMEFEATURE.4569"/>
</wfs:InsertResult>
<wfs:InsertResult handle="STMT2">
<ogc:FeatureId fid="FEATURE1.4569"/>
</wfs:InsertResult>
<wfs:InsertResult handle="STMT3">
<ogc:FeatureId fid="FEATURE2.389345"/>
</wfs:InsertResult>
Chương 3. Web Feature Service (WFS)
72
<wfs:TransactionResult handle="TX01">
<wfs:Status>
<wfs:SUCCESS/>
</wfs:Status>
</wfs:TransactionResult>
</wfs:TransactionResponse>
3.7.4. Biệt lệ Khi xảy ra một lỗi trong request của operation Transaction thì WFS sẽ gửi ra
một biệt lệ.
3.8. GetCapabilities
3.8.1. Giới thiệu Một WFS phải mô tả được khả năng của nó. Cụ thể là WFS phải tạo được một
tài liệu Capabilities XML để mô tả khả năng của nó.
3.8.2. Request Thành phần <GetCapabilities> dùng để yêu cầu WFS gửi tài liệu Capabilities
XML của nó. Request này được định nghĩa bằng đoạn lược đồ XML sau: <xsd:element name="GetCapabilities"
type="wfs:GetCapabilitiesType"/>
<xsd:complexType name="GetCapabilitiesType">
<xsd:attribute name="version"
type="xsd:string" use="optional"/>
<xsd:attribute name="service"
type="xsd:string" use="required" fixed="WFS"/>
</xsd:complexType>
Trong đó thuộc tính service đã được định nghĩa trong mục “Các thành phần
chung”.
Chương 3. Web Feature Service (WFS)
73
3.8.3. Response Tài liệu mô tả khả năng của WFS gồm các phần sau.
1) Dịch vụ: phần này cung cấp thông tin về bản thân dịch vụ.
2)Chả năng: phần này chỉ ra danh sách các request mà WFS có thể thực hiện.
3)Danh sách kiểu feature: phần này định nghĩa các kiểu feature và các giao tác
có thể có trên mỗi feature. Ngoài ra còn có một số thông tin phụ thêm chẳng hạn
như SRS.
4)Khả năng của bộ lọc: phần này là tùy chọn. Nếu có phần này, WFS sẽ thực
hiện thêm các bộ lọc trong đó, còn nếu không WFS chỉ thực hiện các bộ lọc mặc
định tối thiểu mà thôi.
Thuộc tính version để chỉ ra lược đồ nào được áp dụng. Định dạng của nó có thể
gồm một, hai hoặc ba con số được phân cách nhau bằng dấu chấm: “x” hoặc “x.y”
hoặc “x.y.z” với số ngoài cùng bên tay trái là số có nghĩa nhất.
3.8.4. Biệt lệ Khi xảy ra lỗi trong request của GetCapabilities, WFS sẽ trả về một biệt lệ.
Chương 4. Bộ lọc (Filter)
74
Chương 4. Bộ lọc (Filter)
4.1. Giới thiệu: Một biểu thức Filter là 1 điều kiện ràng buộc về giá trị của các thuộc tính của 1
loại đối tựong nào đó, mục đích của Filter là để xác định 1 tập các đối tượng để thực
hiện các thao tác.
Filter được cài đặt tuân theo các đặc tả của XML Điều này sẽ rất thuận lợi, bởi
vì ngày nay đã có rất nhiều công cụ hỗ trợ đọc, ghi … XML. Ta có thể chuyển 1
Filter được cài đặt theo chuẩn XML thành 1 mệnh đề WHERE trong câu lệnh SQL
để thực hiện truy vấn dữ liệu từ cơ sở dữ liệu. Tương tự, 1 Filter được cài đặt theo
chuẩn XML sẽ có thể được chuyển sang các biểu thức XPath hoặc XPointer để lấy
dữ liệu từ 1 tài liệu XML.
4.2. Sử dụng Filter: Filter có thể được sử dụng trong nhiều dịch vụ web khác nhau theo các chuẩn
của OGC , trong bài báo cáo này thì Filter được dùng để tạo ra các ràng buộc đối
với các Feature cần lấy về trong request GetFeature của WFS.
4.3. Đặc tả của Filter: Thành phần gốc của 1 biếu thức Filter, tức là thành phần <Filter>, được mô tả
bởi đoạn lược đồ XML sau đây: <xsd:element name="Filter" type="ogc:FilterType"/>
<xsd:complexType name="FilterType">
<xsd:choice>
<xsd:element ref="ogc:spatialOps"/>
<xsd:element ref="ogc:comparisonOps"/>
<xsd:element ref="ogc:logicOps"/>
<xsd:element ref="ogc:FeatureId" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:complexType>
Chương 4. Bộ lọc (Filter)
75
Các thành phần <logicalOps>, <spatialOps>, <comparisonOps> và tương ứng
với các phép toán logic, phép toán không gian và phép toán so sánh. Ngoài ra, nếu
sử dụng thành phần <FeatureId> thì 1 Filter có thể chỉ đến 1 hoặc 1 số đối tượng cụ
thể.
4.4. Các phép toán không gian (Spatial Operators)
4.4.1. Mục đích Các phép toán không gian này được dùng để kiểm tra xem các tham số của nó có
thỏa mãn 1 mối quan hệ về mặt không gian nào đó hay không. Phép toán này có kết
quả là TRUE nếu như các tham số đó có quan hệ, ngược lại là FALSE.
4.4.2. Mô tả Các phép toán không gian này được mô tả bằng đoạn lược đồ XML sau:
<xsd:element name="Equals"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Disjoint"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Touches"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Within"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Overlaps"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Crosses"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Intersects"
Chương 4. Bộ lọc (Filter)
76
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Contains"
type="ogc:BinarySpatialOpType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="DWithin"
type="ogc:DistanceBufferType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Beyond"
type="ogc:DistanceBufferType"
substitutionGroup="ogc:spatialOps"/>
<xsd:element name="BBOX"
type="ogc:BBOXType" substitutionGroup="ogc:spatialOps"/>
<xsd:complexType name="SpatialOpsType" abstract="true"/>
<xsd:element name="spatialOps" type="ogc:SpatialOpsType"
abstract="true"/>
<xsd:complexType name="BinarySpatialOpType">
<xsd:complexContent>
<xsd:extension base="ogc:SpatialOpsType">
<xsd:sequence>
<xsd:element ref="ogc:PropertyName"/>
<xsd:choice>
<xsd:element ref="gml:_Geometry"/>
<xsd:element ref="gml:Box"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="BBOXType">
<xsd:complexContent>
Chương 4. Bộ lọc (Filter)
77
<xsd:extension base="ogc:SpatialOpsType">
<xsd:sequence>
<xsd:element ref="ogc:PropertyName"/>
<xsd:element ref="gml:Box"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DistanceBufferType">
<xsd:complexContent>
<xsd:extension base="ogc:SpatialOpsType">
<xsd:sequence>
<xsd:element ref="ogc:PropertyName"/>
<xsd:element ref="gml:_Geometry"/>
<xsd:element name="Distance"
type="ogc:DistanceType"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DistanceType" mixed="true">
<xsd:attribute name="units" type="xsd:anyURI"
use="required"/>
</xsd:complexType>
Một phép toán không gian được dùng để kiểm tra xem giữa 1 thuộc tính địa lý,
được chỉ ra bởi tên thuộc tính, và 1 đối tượng địa lý (1 hình chữ nhật hoặc 1 đa
giác…) có thỏa mãn mối quan hệ được chỉ ra bởi phép toán đó không. Chẳng hạn
có thể sử dụng phép toán <Intersects> để kiểm tra xem 1 thuộc tính có kiểu dữ liệu
là Polygon (đa giác) có cắt 1 hình chữ nhật được chỉ ra trong tham số của phép toán
đó không.
Chương 4. Bộ lọc (Filter)
78
Các phép toán Equals, Disjoint, Touches, Within, Overlaps, Crosses,
Contains cũng có ý nghĩa tương tự. Ta có thể suy ra từ nghĩa của các tên của các
phép toán này.
Thành phần BBOX chính là ràng buộc về hình chữ nhật bao. Nó tương đương
với phép toán <Not><Disjoint>.. </Not><Disjoint>, nghĩa là nó xác định các đối
tượng địa lý có quan hệ cắt nhau với 1 hình chữ nhật xác định nào đó.
Các phép toán <DWithin> và <Beyond> kiểm tra xem giá trị địa lý của 1 thuộc
tính có nằm trong 1 đối tượng địa lý hoặc là nằm cách đối tượng địa lý này 1
khoảng cách xác định được chỉ ra hay không. Khoảng cách này được chỉ ra bởi
thành phần <Distance>.
4.5. Các phép toán so sánh (Comparison operators)
4.5.1. Giới thiệu: Các phép toán này được dùng để đánh giá phép so sánh về mặt toán học giữa 2
tham số. Nếu các tham số này thỏa điều kiện của phép so sánh này thì phép toán trả
về TRUE, ngược lại phép toán trả về FALSE.
4.5.2. Mô tả: Dưới đây là đoạn lược đồ XML mô tả các phép toán so sánh này:
<xsd:element name="PropertyIsEqualTo"
type="ogc:BinaryComparisonOpType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsNotEqualTo"
type="ogc:BinaryComparisonOpType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsLessThan"
type="ogc:BinaryComparisonOpType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsGreaterThan"
type="ogc:BinaryComparisonOpType"
substitutionGroup="ogc:comparisonOps"/>
Chương 4. Bộ lọc (Filter)
79
<xsd:element name="PropertyIsLessThanOrEqualTo"
type="ogc:BinaryComparisonOpType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsGreaterThanOrEqualTo"
type="ogc:BinaryComparisonOpType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsLike"
type="ogc:PropertyIsLikeType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsNull"
type="ogc:PropertyIsNullType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:element name="PropertyIsBetween"
type="ogc:PropertyIsBetweenType"
substitutionGroup="ogc:comparisonOps"/>
<xsd:complexType name="ComparisonOpsType" abstract="true"/>
<xsd:element name="comparisonOps"
type="ogc:ComparisonOpsType"
abstract="true"/>
<xsd:complexType name="BinaryComparisonOpType">
<xsd:complexContent>
<xsd:extension base="ogc:ComparisonOpsType">
<xsd:sequence>
<xsd:element ref="ogc:expression"
minOccurs="2" maxOccurs="2"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="PropertyIsLikeType">
<xsd:complexContent>
Chương 4. Bộ lọc (Filter)
80
<xsd:extension base="ogc:ComparisonOpsType">
<xsd:sequence>
<xsd:element ref="ogc:PropertyName"/>
<xsd:element ref="ogc:Literal"/>
</xsd:sequence>
<xsd:attribute name="wildCard"
type="xsd:string" use="required"/>
<xsd:attribute name="singleChar"
type="xsd:string" use="required"/>
<xsd:attribute name="escape" type="xsd:string"
use="required"/>
</x sd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="PropertyIsNullType">
<xsd:complexContent>
<xsd:extension base="ogc:ComparisonOpsType">
<xsd:choice>
<xsd:element ref="ogc:PropertyName"/>
<xsd:element ref="ogc:Literal"/>
</xsd:choice>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="PropertyIsBetweenType">
<xsd:complexContent>
<xsd:extension base="ogc:ComparisonOpsType">
<xsd:sequence>
<xsd:element ref="ogc:expression"/>
Chương 4. Bộ lọc (Filter)
81
<xsd:element name="LowerBoundary"
type="ogc:LowerBoundaryType"/>
<xsd:element name="UpperBoundary"
type="ogc:UpperBoundaryType"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="LowerBoundaryType">
<xsd:choice>
<xsd:element ref="ogc:expression"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="UpperBoundaryType">
<xsd:sequence>
<xsd:element ref="ogc:expression"/>
</xsd:sequence>
</xsd:complexType>
Ngoài các phép toán so sánh chuẩn (=, >, <, >=, <=, <>), còn có các phép toán
khác là <PropertyIsLike>, <PropertyIsBetween> và <PropertyIsNull>
Phép toán <PropertyIsLike> được dùng để so sánh 1 chuỗi với 1 khuôn mẫu
nào đó. Một mẫu được định nghĩa bởi sự kết hợp của các kí tự thông thường như
các kí tự wildCard, singleChar, escapeChar. Kí tự wildCard được dùng để tượng
trưng cho 1 nhóm các kí tự hoặc là không có kí tự nào. Kí tự singleChar dùng để
tượng trưng cho 1 kí tự duy nhất. Kí tự escapeChar được dùng loại bỏ ý nghĩa của
các kí tự singleChar, wildCard và kể cả chính nó.
Chương 4. Bộ lọc (Filter)
82
Thành phần <PropertyIsNull> được dùng để kiểm tra xem giá trị trong nội
dung của nó có rỗng hay không. Giá trị 0 là giá trị khác rỗng.
Thành phần <PropertyIsBetween> được dùng để kiểm tra xem 1 giá trị có nằm
trong 1 khoảng được chỉ ra bởi 2 thành phần là <LowerBoundary> và
<UpperBoundary> hay không.
4.6. Các phép toán Logic
4.6.1. Giới thiệu: Các phép toán logic được dùng để kết hợp các biểu thức điều kiện lại với nhau.
Phép toán AND sẽ có giá trị là TRUE nếu như tất cả các phép toán kết hợp có giá trị
là TRUE. Phép toán OR sẽ có giá trị là TRUE nếu như có ít nhất 1 phép toán trong
số các phép toán kết hợp có giá trị là TRUE. Phép toán NOT dùng để đảo ngược kết
quả của 1 biểu thức.
4.6.2. Mô tả: Dưới đây là đoạn lược đồ XML mô tả các phép toán so sánh này:
<xsd:element name="And" type="ogc:BinaryLogicOpType"
substitutionGroup="ogc:logicOps"/>
<xsd:element name="Or" type="ogc:BinaryLogicOpType"
substitutionGroup="ogc:logicOps"/>
<xsd:element name="Not" type="ogc:UnaryLogicOpType"
substitutionGroup="ogc:logicOps"/>
<xsd:element name="logicOps" type="ogc:LogicOpsType"
abstract="true"/>
<xsd:complexType name="LogicOpsType" abstract="true"/>
<xsd:complexType name="BinaryLogicOpType">
<xsd:complexContent>
<xsd:extension base="ogc:LogicOpsType">
<xsd:choice minOccurs="2"
maxOccurs="unbounded">
Chương 4. Bộ lọc (Filter)
83
<xsd:element ref="ogc:comparisonOps"/>
<xsd:element ref="ogc:spatialOps"/>
<xsd:element ref="ogc:logicOps"/>
</xsd:choice>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="UnaryLogicOpType">
<xsd:complexContent>
<xsd:extension base="ogc:LogicOpsType">
<xsd:sequence>
<xsd:choice>
<xsd:element
ref="ogc:comparisonOps"/>
<xsd:element ref="ogc:spatialOps"/>
<xsd:element ref="ogc:logicOps"/>
</xsd:choice>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Các thành phần <And> , <Or> hay <Not> được dùng để kết hợp các biểu thức
logic, biểu thức không gian hay biểu thức vô hướng để tạo ra 1 biểu thức kết hợp
phức tạp.
4.7. Định danh của Feature (Feature Identifier):
4.7.1. Giới thiệu: Một định danh của Feature được dùng để chỉ 1 Feature địa lý cụ thể trong ngữ
cảnh của dịch vụ web chứa Feature này.
Chương 4. Bộ lọc (Filter)
84
4.7.2. Mô tả: Thành phần <FeatureId> được mô tả bởi đoạn lược đồ XML sau:
<xsd:element name="FeatureId" type="ogc:FeatureIdType"/>
<xsd:complexType name="FeatureIdType">
<xsd:attribute name="fid" type="xsd:anyURI"
use="required"/>
</xsd:complexType>
Thành phần <FeatureId> được dùng để chỉ ra các Feature trong 1 biểu thức
Filter hoặc tong các tài liệu XML khác.
4.8. Biểu thức (Expressions):
4.8.1. Giới thiệu: Một biểu thức là 1 sự kết hợp của 1 hoặc nhiều biểu tượng (symbol) và cho kết
quả là TRUE hoặc là FALSE.
4.8.2. Mô tả: Một biểu thức có thể được tạo nên bởi các thành phần sau đây:
<Add>, <Sub>, <Mul>, <Div>, <PropertyName>, <Literal> và <Function>.
4.9. Các phép toán số học:
4.9.1. Giới thiệu: Các thành phần được đề cập trong phần này gồm có các phép toán cộng, trừ,
nhân, chia…. Đây là các phép toán 2 ngôi, nhận 2 tham số và trả về 1 kết quả.
4.9.2. Mô tả: Dưới đây là đoạn lược đồ XML mô tả các phép toán này:
<xsd:element name="Add"
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Sub"
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
Chương 4. Bộ lọc (Filter)
85
<xsd:element name="Mul"
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:element name="Div"
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:complexType name="BinaryOperatorType">
<xsd:complexContent>
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
<xsd:element ref="ogc:expression"
minOccurs="2" maxOccurs="2"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Thành phần <Add> thực hiện phép toán cộng, hai tham số của nó có thể là bất
kì biểu thức nào.
Thành phần <Sub> thực hiện phép toán trừ, thành phần thứ 1 là số bị trừ, thành
phần thứ 2 là số trừ, hai tham số của nó có thể là bất kì biểu thức nào.
Thành phần <Mul> thực hiện phép toán nhân, hai tham số của nó có thể là bất kì
biểu thức nào.
Thành phần <Div> thực hiện phép toán chia,thành phần thứ nhất là số bị chia,
thành phần thứ 2 là số chia, hai tham số của nó có thể là bất kì biểu thức nào. Thành
phần thứ 2 phải khác 0.
4.10. Các hàm (Functions)
4.10.1. Giới thiệu: Phần này đề cập đến hàm có giá trị đơn, sử dụng thành phần <Function>. Một
hàm là 1 thủ tục dùng để thực hiện 1 tác vụ tính toán nào đó. Một hàm có thể không
nhận tham số hoặc nhận nhiều tham số và trả về 1 kết quả duy nhất.
Chương 4. Bộ lọc (Filter)
86
4.10.2. Mô tả: Đoạn lược đồ XML dưới đây mô tả các hàm này:
<xsd:element name="Function"
type="ogc:FunctionType"
substitutionGroup="ogc:expression"/>
<xsd:complexType name="FunctionType">
<xsd:complexContent>
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
<xsd:element ref="ogc:expression"
minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string"
use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Một hàm bao gồm tên hàm, được chỉ ra bởi thuộc tính name, không có hoặc có
nhiều tham số chứa trong thành phần <Function>. Các tham số có thể là bất kì biểu
thức nào.
4.11. Các khả năng về Filter: Phần này định nghĩa 1 lược đồ mô tả các khả năng, lược đồ này có thể được
dùng trong các tài liệu mô tả các khả năng của 1 dịch vụ có sử dụng Filter. Tài liệu
này cho biết là dịch vụ này có hỗ trợ các loại Filter nào. Chẳng hạn như 1 Web
Feature Service có sử dụng Filter sẽ cần phải thêm đoạn mô tả đưới đây trong tài
liệu mô tả các khả năng của nó để thông báo cho các client biết là nó có hỗ trợ các
loại Filter nào.
Chương 4. Bộ lọc (Filter)
87
<xsd:element name="Filter_Capabilities">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Spatial_Capabilities"
type="ogc:Spatial_CapabilitiesType"/>
<xsd:element name="Scalar_Capabilities"
type="ogc:Scalar_CapabilitiesType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Một dịch vụ hỗ trợ các Filter về không gian sẽ thêm phần mô tả các khả năng về
Filter không gian. Các khả năng về Filter không gian bao gồm các khả năng lọc dữ
liệu không gian dựa trên hình chữ nhật bao và các phép toán về không gian khác là
:Equals, Disjoint, Touches, Within, Overlaps, Crosses, Intersects, Contains,
DWithin và Beyond.
Các khả năng về Filter không gian được mô tả trong đoạn lược đồ XML dưới
đây: <xsd:complexType name="Spatial_CapabilitiesType">
<xsd:sequence>
<xsd:element name="Spatial_Operators"
type="ogc:Spatial_OperatorsType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Spatial_OperatorsType">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="ogc:Equals"/>
<xsd:element ref="ogc:Disjoint"/>
<xsd:element ref="ogc:Touches"/>
<xsd:element ref="ogc:Within"/>
Chương 4. Bộ lọc (Filter)
88
<xsd:element ref="ogc:Overlaps"/>
<xsd:element ref="ogc:Crosses"/>
<xsd:element ref="ogc:Intersect"/>
<xsd:element ref="ogc:Contains"/>
<xsd:element ref="ogc:DWithin"/>
<xsd:element ref="ogc:Beyond"/>
<xsd:element ref="ogc:BBOX"/>
</xsd:choice>
</xsd:complexType>
Các khả năng về các Filter vô hướng bao gồm khả năng xử lí các biểu thức
logic, biểu thức so sánh, biểu thức chứa các phép toán số học và biểu thức chứa các
hàm. Đoạn lược đồ dưới đây mô tả khả năng về các Filter vô hướng: <xsd:complexType name="Scalar_CapabilitiesType">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="ogc:Logical_Operators"/>
<xsd:element name="Comparison_Operators"
type="ogc:Comparison_OperatorsType"/>
<xsd:element name="Arithmetic_Operators"
type="ogc:Arithmetic_OperatorsType"/>
</xsd:choice>
</xsd:complexType>
Thành phần <Logical_Operators> dùng để chỉ ra rằng dịch vụ này có chứa các
Filter của các phép toán And, Or, Not.
Thành phần <Comparison_Operators> dùng để chỉ ra các loại phép toán so
sánh được dịch vụ này cung cấp. Thành phần <Simple_Comparisons> cho biết là
các phép toán >, <, >=, <=, = được hỗ trợ. Các thành phần <Like>, <Between> và
<NullCheck> cho biết là dịch vụ này có hỗ trợ các phép toán là LIKE, BETWEEN
và NULL.
Chương 4. Bộ lọc (Filter)
89
Thành phần <Arithmetic_Operators> cho biết là dịch vụ này hỗ trợ các phép
toán số học nào. Thành phần <Simple_Arithmetic> cho biết dịch vụ này có hỗ trợ
các phép toán là cộng, trừ, nhân, chia.
Thành phần <Functions> dùng để chỉ ra tên các hàm được hỗ trợ và số lượng
tham số của từng hàm.
Ví dụ:
Ví dụ dưới đây là 1 đoạn mô tả các khả năng Filter của 1 dịch vụ. Tài liệu này
cho biết dịch vụ này hỗ trợ tất cả các loại Filter đã được mô tả trong các phần trước
cộng thêm các hàm được liệt kê: <Filter_Capabilities>
<Spatial_Capabilities>
<Spatial_Operators>
<BBOX />
<Equals />
<Disjoint />
<Intersect />
<Touches />
<Crosses />
<Within />
<Contains />
<Overlaps />
<Beyond />
</Spatial_Operators>
</Spatial_Capabilities>
<Scalar_Capabilities>
<Logical_Operators />
<Comparison_Operators>
<Simple_Comparisons />
<Like />
<Between />
<NullCheck />
Chương 4. Bộ lọc (Filter)
90
</Comparison_Operators>
<Arithmetic_Operators>
<Simple_Arithmetic />
<Functions>
<Function_Names>
<FunctionName
nArgs="1">MIN</FunctionName>
<FunctionName
nArgs="1">MAX</FunctionName>
<FunctionName
nArgs="1">SIN</FunctionName>
<FunctionName
nArgs="1">COS</FunctionName>
<!--.
. … Các hàm khác …
.
-->
</Function_Names>
</Functions>
</Arithmetic_Operators>
</Scalar_Capabilities>
</Filter_Capabilities>
Chương 5. CarbonTools
91
Chương 5. CarbonTools
5.1. Giới thiệu CarbonTools là bộ toolkit dành cho .NET, được viết bằng môi trường .NET. Nó
cung cấp các lớp, các hàm hỗ trợ cho việc giao tiếp với các server hỗ trợ WFS và
WMS. Nó giúp thực hiện dễ dàng các request như : GetCapabilities, GetMap… ,
nhận tài liệu Xml trả về, đọc hiểu tài liệu Xml này và chuyển nó thành các dạng dữ
liệu dễ xử lí.
Bộ CarbonTools hiện đang có phiên bản 2.0.2, có thể download miễn phí tại địa
chỉ http://www.thecarbonproject.com/products/carbon.html
Sau khi install file setup CarbonTools2SDK.msi, ta sẽ được :
Hai file .dll dùng làm thư viện là CarbonTools.Controls.dll và
CarbonTools.Core.dll. Để sử dụng các lớp, các hàm do toolkit này cung
cấp, chỉ cần đưa các thư viện này vào project của mình.
Một tài liệu hướng dẫn sử dụng giới thiệu chi tiết các lớp, các hàm được
cung cấp.
Ba chương trình ví dụ mẫu sử dụng thư viện.
Tuy nhiên, bộ toolkit phiên bản 2.0.2 này vẫn còn thiếu nhiều chức năng. Chẳng
hạn như:
Không hỗ trợ đọc hiểu kết quả trả về từ DescribeFeatureType request
Không hỗ trợ Filter cho các loại Feature khi thực hiện GetFeature request
Đối với 2 request LockFeature Transaction, chỉ hỗ trợ việc gởi các tài liệu
Xml chứa nội dung cần gởi lên server và nhận kết quả trả về là 1 tài liệu
Xml. Ta phải tự tạo và tự đọc hiểu các tài liệu Xml này.
Chương 5. CarbonTools
92
5.2. Một số ví dụ về việc sử dụng bộ thư viện CarbonTools
5.2.1. Dùng CarbonTools thực hiện GetCapabilities request Để thực hiện GetCapabilities request ta chủ yếu sử dụng 3 lớp quan trọng trong
CarbonTools, chúng đều nằm trong Package CarbonTools.Core.OGCCapabilities:
SourceOGCCapabilites, DataOGCCapabilities và HandlerOGCCapabilities.
5.2.1.1. Lớp SourceOGCCapabilities
Lớp này chứa các thông tin cần thiết cho việc thực hiện request như: địa chỉ của
server để gởi request lên, version của WFS hay WMS mà server cung cấp….
SourceOGCCapabilities gồm các thuộc tính chính như sau:
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 Address System.Uri Chứa địa chỉ của server nơi mà
request được gởi đến
2 ServiceType CarbonTools.Core.Ba
se.OGCServiceTypes
Xác định loại service cần lấy
thông tin là WFS hay WMS
Có 2 giá trị là:
CarbonTools.Core.Base.OGCS
erviceTypes.WFS: Cho biết
loại service cần lấy là WFS.
CarbonTools.Core.Base.OGCS
erviceTypes.WMS: Cho biết
loại service cần lấy là WMS.
3 Version string Cho biết phiên bản của WFS
hay WMS muốn lấy từ server
4 Credentials System.Net.Network
Credential
Chứa thông tin về việc xác
thực người dùng trên server.
Bảng 5.1. Các thuộc tính của SourceOGCCapabilities
Chương 5. CarbonTools
93
5.2.1.2. Lớp DataOGCCapabilities
Lớp này chứa kết quả trả về sau khi thực hiện GetCapabilities request.
Các thuộc tính quan trọng
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 ServiceType CarbonTools.Co
re.Base.OGCSer
viceTypes
Xác định loại service cần lấy thông
tin là WFS hay WMS
Có 2 giá trị là:
CarbonTools.Core.Base.OGCServic
eTypes.WFS: Cho biết loại service
cần lấy thông tin là WFS
CarbonTools.Core.Base.OGCServic
eTypes.WMS: Cho biết loại service
cần lấy thông tin là WMS
2 RequestItems RequestItemCo
llection
Chứa các thông tin về các request
được server hỗ trợ (như:
GetCapabilites, GetMap…).
Các thông tin này gồ: tên request,
địa chỉ để gởi request, các giao thức
được hỗ trợ cho request (GET,
POST).
3 LayerItems CarbonTools.C
ore.OGCCapabi
lities.LayerItem
Danh sách các loại Feature có trên
server
Bảng 5.2. Các thuộc tính quan trọng của DataOGCCapabilities
Chương 5. CarbonTools
94
5.2.1.3. Lớp HandlerOGCCapabilities
Lớp này có tác dụng thực hiện việc gởi request lên server theo phương pháp
bất đồng bộ và nhận kết quả trả về.
Các thuộc tính
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 Source CarbonTools.Core.OGC
Capabilities.SourceOGC
Capabilities
Chứa các thông tin của
request cần gởi lên
server
2 Data CarbonTools.Core.OGC
Capabilities.DataOGCCa
pabilities
Chứa kết quả trả về
sau khi gởi request
3 Synchronous boolean Cho biết có thực hiện
request theo kiểu đồng
bộ hay không
4 OperationDone EventHandler Đây là 1 delegate. có
tác dụng thông báo khi
mà quá trình nhận dữ
liệu không đồng bộ
được thực hiện xong.
5 ProgressChange
d
EventHandler Đây là 1 delegate, có
tác dụng thông báo về
tình trạng của tiến
trình nhận dữ liệu
không đồng bộ.
Bảng 5.3. Các thuộc tính của HandlerOGCCapabilities
Chương 5. CarbonTools
95
Phương thức của lớp này
GetCapabilities(): Gởi request lên server với các thông tin chứa trong
Source và lấy kết quả về, lưu trong Data.
Ví dụ thực hiện request:
SourceOGCCapabilities source = new SourceOGCCapabilities();
source.Version = "1.1.1";
source.Address = new
Uri(“http://localhost/OpenGISServer/VNesOpenGISServe
r.aspx”, true);
HandlerOGCCapabilites handler = new
HandlerOGCCapabilities(source);
//Hàm handler_ProgressChanged được gọi mỗi khi có sự //thay
đổi về trạng thái của tiến trình nhận dữ liệu
handler.ProgressChanged += new
EventHandler(handler_ProgressChanged);
//Sau khi quá trình nhận dữ liệu kết thúc thì hàm
//handler_OperationDone được gọi
handler.OperationDone += new
EventHandler(handler_OperationDone);
//Gởi request theo phương pháp không đồng bộ
handler.Synchronous = false;
//Sau khi gọi hàm này thì ta vẫn có thể thực hiện tiếp //các
tác vụ khác vì quá trình gởi và nhận dữ liệu //được thực hiện
riêng biệt trong 1 tiểu trình khác.
handler.GetCapabilities();
//Hàm đáp ứng sự kiện khi tiến trình thay đổi trạng //thái
private void handler_ProgressChanged(object sender,
EventArgs e)
{
Chương 5. CarbonTools
96
//Sử dụng Progressbar đê thể hiện tiến trình thực
//hiện request, cập nhật giá trị của Progressbar khi
//tiến trình thay đổi trạng thái.
progressBar1.Value = handler.GetProgress(100);
statusBarPanel1.Text = handler.State.ToString();
}
//Hàm đáp ứng sự kiện khi tiến trình hoàn thành
private void handler_OperationDone(object sender, EventArgs
e)
{
//Lấy danh sách các loại Feature (Layer) trên server
LayerItemCollection featureTypes =
((DataOGCCapabilities)handler.Data).LayerItems;
enumerator = layers.GetEnumerator();
while ( enumerator.MoveNext() )
{
LayerItem currentType =
(LayerItem)enumerator.Current;
string TypeName = currentType.Name;
string TypeTitle = currentType.Title;
}
}
5.2.2. Dùng CarbonTools thực hiện GetFeature request CarbonTools hỗ trợ request này không đầy đủ, nó không hỗ trợ Filter cho các
Feature.
Để thực hiện loại request này, ta sử dụng các lớp chính như sau:
SourceWFS, HandlerWFS và DataFeatures
5.2.2.1. Lớp CarbonTools.Core.WFS.SourceWFS
Lớp này chứa các thông tin về request mà client cần gởi lên server
Chương 5. CarbonTools
97
Các thuộc tính quan trọng
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 Address System.Uri Địa chỉ cần phải gởi request
2 Layers ArrayList Danh sách các loại Feature
cần lấy về
3 MaxFeatures int Là tham số MaxFeature
trong request
4 Version string Phiên bản WFS mà server
cài đặt
Bảng 5.4. Các thuộc tính của CarbonTools.Core.WFS.SourceWFS
5.2.2.2. Lớp CarbonTools.Core.Features.DataFeatures
Lớp này chứa các thông tin về các Feature lấy được từ server sau khi thực
hiện request
Các thuộc tính chính
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 BBox CarbonTools.Core.BoundingBox Hình chữ nhật
bao của các
Feature lấy
được
2 Features CarbonTools.Core.Features.Item
Collection
Danh sách các
Feature lấy
được cùng với
thông tin chi
tiết của các
Feature đó.
Bảng 5.5. Các thuộc tính của CarbonTools.Core.Features.DataFeatures
Chương 5. CarbonTools
98
5.2.2.3. Lớp CarbonTools.Core.WFS.HandlerWFS
Các thuộc tính
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 Data CarbonTools.Core.Features.
DataFeatures
Dữ liệu lấy được từ
server sau khi thực
hiện request
2 Source CarbonTools.Core.WFS.Source
WFS
Thông tin request
cần gởi lên server
3 Synchronous boolean Cho biết request này
được thực hiện theo
kiểu đồng bộ hay
không đồng bộ
4 OperationDone EventHandler Đây là 1 delegate. có
tác dụng thông báo
khi mà quá trình
nhận dữ liệu không
đồng bộ được thực
hiện xong.
5 ProgressChang
ed
EventHandler Đây là 1 delegate, có
tác dụng thông báo
về tình trạng của tiến
trình nhận dữ liệu
không đồng bộ.
Bảng 5.6. Các thuộc tính của CarbonTools.Core.WFS.HandlerWFS
Phương thức GetFeature(): Gởi request lên server với các thông tin chứa
trong Source và lấy kết quả về, lưu trong Data.
Chương 5. CarbonTools
99
Ví dụ thực hiện GetFeature request
//Thiết lập các thông tin cho request
SourceWFS source = new SourceWFS();
source.Address =
“http://localhost/OpenGISServer/VNesOpenGISServer.aspx”;
source.Layers.Add(new WFSLayerType(“quan”));
source.Layers.Add(new WFSLayerType(“duong”));
//Thực hiện gởi request bằng phương pháp không đồng //bộ.
HandlerWFS handlerWFS = new HandlerWFS( source);
handlerWFS.ProgressChanged += new
EventHandler(handler_ProgressChanged);
handlerWFS.OperationDone += new
EventHandler(handlerWFS_OperationDone);
handlerWFS.Synchronous = false;
handlerWFS.GetFeature();
//Lấy kết quả trả về
LayerItemCollection collection = handlerWFS.Data.Features;
//Duyệt qua danh sách các Feature
foreach (Item item in items)
{
string sName = item.Name;
if (item is ItemElement)
{
//Nếu đây là thuộc tính bình thường
if (((ItemElement)item).Value != null)
string sValue =((ItemElement)item).Value;
else if (item is ItemMember)
{}
//Nếu đây là thuộc tính địa lý (tức là các kiểu
//Point, LineString…)
else if (item is ItemGeometry)
{
Chương 5. CarbonTools
100
//Nếu như thuộc tính này là 1 Point
if (((ItemGeometry)(item)).GeometryObject is
CarbonTools.Core.Geometries.Point)
{
CarbonTools.Core.Geometries.Point point =
(CarbonTools.Core.Geometries.Point)
((ItemGeometry)
(Item)).GeometryObject;
string sX = point.X;
if (point.Y != Double.MaxValue)
string sY = point.Y;
if (point.Z != Double.MaxValue)
string sZ = point.Z;
}
//Nếu thuộc tính này là 1 LineString
else if (((ItemGeometry)(item)).GeometryObject
is
CarbonTools.Core.Geometries.LineString)
{
}
//Nếu thuộc tính này là 1 Polygon
else if (((ItemGeometry)(item)).GeometryObject
is
CarbonTools.Core.Geometries.Polygon)
{
System.Collections.CollectionBase coll =
((CarbonTools.Core.Geometries.Polygon)
((ItemGeometry)(item)).GeometryObject).
Interior as
System.Collections.CollectionBase;
if (coll.Count > 0)
Chương 5. CarbonTools
101
}
//Nếu thuộc tính này là 1 Collection
else if (((ItemGeometry)(item)).GeometryObject
is
System.Collections.CollectionBase)
{
System.Collections.CollectionBase coll =
(System.Collections.CollectionBase)
((ItemGeometry)(item)).GeometryObject;
//Nếu nó là 1 PointCollection
if(((ItemGeometry)item)).GeometryObject is
CarbonTools.Core.Geometries.PointCollection)
{}
//Nếu nó là 1 LineStringCollection
else if
(((ItemGeometry)(item)).GeometryObject is
CarbonTools.Core.Geometries.
LineStringCollection)
{
}
//Nếu thuộc tính này là PolygonCollection
elseif
(((ItemGeometry)(item)).GeometryObject is
CarbonTools.Core.Geometries.PolygonCollection)
}
else if (((ItemGeometry)(item)).GeometryObject is
CarbonTools.Core.Geometries.Envelope)
Chương 5. CarbonTools
102
{
}
if (item.Attributes.Count > 0)
{
IEnumerator enumerator =
item.Attributes.GetEnumerator();
while (enumerator.MoveNext())
{
ItemElement elem = enumerator.Current as
ItemElement;
string sName = elem.Name;
string sValue = elem.Value;
}
}
}
}
5.3. Dùng CarbonTools gởi GetMap request Để thực hiện gởi 1 GetMap request ta cần sử dụng các lớp quan trọng sau:
HandlerWMS, DataRaster, SourceWMS
5.3.1. Lớp CarbonTools.Core.WMS.SourceWMS Lớp này chứa các thông tin cần thiết để thực hiện 1 GetMap request.
Các thuộc tính của lớp
Chương 5. CarbonTools
103
STT Tên thuộc
tính
Kiểu dữ liệu Ý nghĩa
1 Version string Phiên bản WMS mà server cài đặt
2 Address System.Uri Địa chỉ sẽ gởi request
3 BBox CarbonTools.Core.
BoundingBox
Vùng hình chữ nhật cần lấy hình ảnh
4 BgColor Color Màu nền của ảnh cần lấy về
5 Format string Định dạng ảnh cần lấy về
6 Height int Chiều cao của ảnh
7 Width int Chiều rộng của ảnh
8 Transparent Bool Cho biết ảnh trả về có transparent không
8 Layers ArrayList Chứa danh sách các Layer cần lấy về
Bảng 5.7. Các thuộc tính của CarbonTools.Core.WMS.SourceWMS
5.3.2. Lớp CarbonTools.Core.Base.DataRaster Lớp này chứa hình ảnh được server gởi về.
Các thuộc tính
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 Map Image Chứa ảnh được server
gởi về
2 BBox CarbonTools.Core.BoundingBox Hình chữ nhật bao
của ảnh
Bảng 5.8. Các thuộc tính của CarbonTools.Core.Base.DataRaster
5.3.3. Lớp CarbonTools.Core.WMS.HandlerWMS Lớp này có tác dụng gởi 1 WMS request lên server và nhận kết quả trả về là
1 ảnh
Chương 5. CarbonTools
104
Các thuộc tính
STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa
1 Source CarbonTools.Core.
WMS.SourceWMS
Chứa các thông tin về request cần
gởi lên server
2 Data CarbonTools.Core.
Base.DataRaster
Chứa hình ảnh trả về
3 Synchronous bool Cho biết gởi request theo phương
pháp bất đồng bộ hay không
Bảng 5.9. Các thuộc tính của CarbonTools.Core.WMS.HandlerWMS
Phương thức GetMap(): Thực hiện việc gởi GetMap request với các thông
tin trong Source và nhận kết quả về, lưu trong thuộc tính Data.
5.3.4. Vi dụ thực hiện GetMap request //Lấy các thông tin cần thiết để gởi request
sourceWms = new SourceWMS();
sourceWms.Version = “1.1.0”;
sourceWms.Address =
“http://localhost/OpenGISServer/VNesOpenGISServer.aspx”;
sourceWms.BBox = new
BoundingBox(Double.Parse(txtMinX.Text),Double.Par
se(txtMinY.Text),Double.Parse(txtMaxX.Text),Doubl
e.Parse(txtMaxY.Text),cmbCoordinate.Text);
sourceWms.BgColor = txtBackColor.BackColor;
sourceWms.Format = cmbFormat.Text;
sourceWms.Height = Int32.Parse(txtHeight.Text);
sourceWms.Width = Int32.Parse(txtWidth.Text);
//Chọn các Layer cần lấy về, mỗi Layer có thể thiết lập thêm
có thêm //thuộc tính style cho nó
for (int i = 0;i < SelectedLayers.Count;i++)
{
Chương 5. CarbonTools
105
if (SelectedStyles[i] != null)
sourceWms.Layers.Add(newWMSLayerType(((LayerItem)
SelectedLayers[i]).Name,((MapStyle)
SelectedStyles[i]).Name));
else
sourceWms.Layers.Add(new
WMSLayerType(((LayerItem)SelectedLayers
[i]).Name,""));
}
sourceWms.Transparent = chkTransparent.Checked;
Thực hiện gởi request
//Tạo 1 HandlerWMS với Source là sourceWms
handlerWms = new HandlerWMS(sourceWms);
handlerWms.ProgressChanged += new
EventHandler(handler_GetMapProgressChanged);
handlerWms.OperationDone += new
EventHandler(handler_GetMapOperationDone);
handlerWms.Synchronous = false;
handlerWms.GetMap();
//Nhận ảnh trả về
picMap.Image = ((DataRaster)handlerWms.Data).Map;
5.4. Dùng CarbonTools gởi DescribeFeatureType request Để thực hiện DescribeFeatureType request ta dùng các lớp SourceWFS và
HandlerWFS. Hai lớp này đã được trình bày ở trên trong phần gởi
GetFeature request.
Khi gởi 1 request, ta cũng cần xác định các loại Feature cần được mô tả trong
SourceWFS. Nhưng kết quả trả về chỉ là 1 đối tượng XmlDocument, ta phải
tự đọc hiểu tài liệu Xml này để lấy kết quả.
Chương 5. CarbonTools
106
Loại request này không được hỗ trợ để gởi theo phương pháp bất đồng bộ,
phải gởi theo phương pháp đồng bộ.
Thực hiện gởi DescribeFeatureType request bằng hàm
XmlDocument xml = HandlerWFS.GetFeatureSchema();
Sau khi hàm này thực hiện xong thì lệnh kế tiếp mới được thực hiện.
Ví dụ thực hiện DescribeFeatureType request
SourceWFS source = new SourceWFS();
source.Address =
http://localhost/OpenGISServer/VNesOpenGISServer .aspx”;
source.Layers.Add(new WFSLayerType(“quan”));
source.Layers.Add(new WFSLayerType(“duong”));
HandlerWFS handlerWFS = new HandlerWFS( source);
XmlDocument XmlResult = handlerWFS.GetFeatureSchemaXml();
Ta phải tự đọc kết quả từ XmlDocument này, CarbonTools không hỗ trợ lấy
kết quả từ nó.
5.5. Dùng CarbonTools gởi request của Transaction và LockFeature Đối với các request này thì CarbonTools chỉ hỗ trợ việc gởi request bằng
hàm: HandlerWFS.SendXml(XmlDocument sentDocument, out XmlDocument
receivedDocument)
Hàm này gởi sentDocument lên server với Address được chỉ ra trong
Source và lưu kết quả trả về trong receivedDocument.
Ta phải tự tạo sentDocument để gởi và phải tự đọc receivedDocument trả
về để lấy kết quả.
Chương 6. Cài đặt chương trình OpenGISServer
107
Chương 6. Cài đặt chương trình OpenGIS Server
6.1. Giới thiệu Server được cài đặt bằng ASP.NET hỗ trợ các loại Request sau:
Các Request của Web Feature Service:
• GetCapabilities
• GetFeature
• DescribeFeatureType
• Transaction
• LockFeature
Các Request của Web Map Service:
• GetCapabilities
• GetMap
6.2. Tổ chức và lưu trữ dữ liệu Hệ quản trị cơ sở dữ liệu được sử dụng để cài đặt Server là MySQL Version
4.1. Hệ quản trị này hỗ trợ rất tốt cho các ứng dụng OpenGIS vì nó có các
hàm, các kiểu dữ liệu tuân theo các đặc tả của OpenGIS. Chi tiết về MySQL
với các hỗ trợ cho OpenGIS có thể xem thêm ở phần phụ lục.
Dữ liệu trên Server là dữ liệu về địa lý thành phố Hồ Chí Minh, gồm các
bảng sau:
Chương 6. Cài đặt chương trình OpenGISServer
108
Tên bảng Ý nghĩa
bachhoatonghop Lưu trữ thông tin về các cửa hàng bách hóa tổng hợp trong
thành phố
baotang Lưu trữ thông tin về các bảo tàng trong thành phố
benhvien Lưu trữ thông tin về các bệnh viện trong thành phố
benxe Lưu trữ thông tin về các bến xe trong thành phố
buudien Lưu trữ thông tin về các bưu điện trong thành phố
cho Lưu trữ thông tin về các chợ trong thành phố
chua Lưu trữ thông tin về các chùa trong thành phố
diadanh Lưu trữ thông tin về các địa danh khác trong thành phố
duong Lưu trữ thông tin về các con đường trong thành phố
khachsan Lưu trữ thông tin về các khách sạn trong thành phố
lanhsuquan Lưu trữ thông tin về các lãnh sự quán trong thành phố
nganhang Lưu trữ thông tin về các ngân hàng trong thành phố
nhatho Lưu trữ thông tin về các nhà thờ trong thành phố
quan Lưu trữ thông tin về các quận trong thành phố
sieuthi Lưu trữ thông tin về các siêu thị trong thành phố
song Lưu trữ thông tin về các con sông trong thành phố
truongcap3 Lưu trữ thông tin về các trường cấp 3 trong thành phố
truongdaihoc Lưu trữ thông tin về các trường đại học trong thành phố
tuyensinh Lưu trữ thông tin về các trường học trong thành phố
ubndquan Lưu trữ thông tin về các ủy ban nhân dân trong thành phố
ypagesit Lưu trữ thông tin về 1 số công ty, tổ chức
lockedfeature Lưu trữ các đối tượng bị khóa bằng Request LockFeature
Bảng 6.1.Các bảng dữ liệu trong CSDL TpHCM
Chương 6. Cài đặt chương trình OpenGISServer
109
Mô tả chi tiết về các bảng trong cơ sở dữ liệu
Các bảng: bachhoatonghop, baotang, benhvien, benxe, buudien, cho,
chua, diadanh, khachsan, lanhsuquan, nganhang, nhatho, sieuthi,
truongcap3, truongdaihoc, ubndquan có cùng cấu trúc như sau:
STT Tên cột Kiểu dữ liệu Ý nghĩa
1 geographicalshape Kiểu Point (*), được lưu trữ
theo định dạng riêng bên
trong MySQL.
Là 1 điểm, cho biết tọa
độ của đối tượng trên
bản đồ
2 TEN Kiểu chuỗi Tên của đối tượng
3 THUOC Kiểu chuỗi Quận mà đối tượng này
thuộc về
4 ID Số nguyên (AutoNumber) Định danh của đối
tượng, là khóa chính
Bảng 6.2.Cấu trúc chung của các bảng dữ liệu
Chương 6. Cài đặt chương trình OpenGISServer
110
Bảng “duong”:
STT Tên cột Kiểu dữ liệu Ý nghĩa
1 geographicalshape Kiểu MultiLineString (*),
được lưu trữ theo định dạng
riêng trong MySQL
Cho biết các điểm tạo
nên con đường này.
2 FNODE_ Số thực
3 TNODE_ Số thực
4 LPOLY_ Số thực
5 RPOLY_ Số thực
6 LENGTH Số thực Chiều dài con đường
7 DUONG_ Số thực
8 DUONG_ID Số thực
9 ROAD_NAME Chuỗi Tên đường
10 DAI_LO Số thực
11 HO_TRAI Chuỗi
12 HO_PHAI Chuỗi
13 LO_GIOI_MO Số thực
14 LO_GIOI_CU Số thực
15 ID Số nguyên Định danh của con
đường, là khóa chính
Bảng 6.3.Bảng “duong”
Chương 6. Cài đặt chương trình OpenGISServer
111
• Bảng “quan”
STT Tên cột Kiểu dữ liệu Ý nghĩa
1 geographicalshape Kiểu Polygon (*), được lưu
trữ theo định dạng riêng
trong MySQL.
Các điểm tạo nên
đường viền xung quanh
phạm vi của quận.
2 DIENTICH Số thực Diện tích của quận
3 CHUVI Số thực Chu vi của quận
4 TENQUAN Chuỗi Tên quận
5 ID Số nguyên Định danh của quận, là
khóa chính
Bảng 6.4.Bảng “quan”
Bảng “song”
STT Tên cột Kiểu dữ liệu Ý nghĩa
1 geographicalshape Kiểu Polygon (*), được lưu
trữ theo định dạng riêng
trong MySQL.
Các điểm tạo nên
đường viền xung quanh
phạm vi của sông
2 DIENTICH Số thực Diện tích của sông
3 CHUVI Số thực Chu vi của sông
4 TENSONG Chuỗi Tên sông
5 ID Số nguyên Định danh của sông, là
khóa chính
Bảng 6.5.Bảng “song”
Chương 6. Cài đặt chương trình OpenGISServer
112
Bảng “tuyensinh”
STT Tên cột Kiểu dữ liệu Ý nghĩa
1 geographicalshape Kiểu Point(*), được lưu trữ
theo định dạng riêng trong
MySQL.
Là 1 điểm cho biết tọa
độ của đối tượng trên
bản đồ
2 TEN Chuỗi Tên trường
3 THUOC Chuỗi Quận mà trường này
thuộc về
4 DIACHI Chuỗi Địa chỉ của trường.
5 DIENTHOAI Chuỗi Số điện thoại của
trường
6 PHUONG Chuỗi Phường mà trường này
thuộc về
7 MOTA Chuỗi Mô tả về trường
8 ID Số nguyên Định danh trường, là
khóa chính
Bảng 6.6.Bảng “tuyensinh”
Chương 6. Cài đặt chương trình OpenGISServer
113
Bảng ypagesit
STT Tên cột Kiểu dữ liệu Ý nghĩa
1 geographicalshape Kiểu Point(*), được lưu trữ
theo định dạng riêng trong
MySQL.
Là 1 điểm cho biết tọa
độ của công ty hoặc tổ
chức trên thành phố
2 NAME Chuỗi Tên công ty, tổ chức
3 S_NAME Chuỗi Tên viết tắt
4 S_TYPE Chuỗi Loại dịch vụ cung cấp
5 S_EXTADDR Chuỗi Địa chỉ
6 S_NUMBER Chuỗi Đường số
7 S_STREET Chuỗi Tên đường
8 S_WARD Chuỗi Phường
9 S_DISTRICT Chuỗi Quận
10 S_PHONE Chuỗi Số điện thoại
11 S_FAX Chuỗi FAX
12 S_WEB Chuỗi WEB
13 S_EMAIL Chuỗi EMAIL
14 S_GTSL Chuỗi Giới thiệu
15 ID Số nguyên Định danh, là khóa
chính
Bảng 6.7.Bảng “ypagesit”
Các loại Feature (FeatureType) trên Server:
Mỗi loại Feature trên Server tương ứng với 1 bảng trong cơ sở dữ liệu. Cụ
thể ta có các loại Feature sau:
BachHoaTongHop, BaoTang, BenhVien, BenXe, BuuDien, Cho, Chua,
DiaDanh, Duong, KhachSan, LanhSuQuan, NganHang, NhaTho, uan, SieuThi,
Song, TruongCap3, TruongDaiHoc, TuyenSinh, UBNDQuan, YPageSit.
Chương 6. Cài đặt chương trình OpenGISServer
114
Các loại Feature: BachHoaTongHop, BaoTang, BenhVien, BenXe,
BuuDien, Cho, Chua, DiaDanh, KhachSan, LanhSuQuan, NganHang,
NhaTho, SieuThi, TruongCap3, TruongDaiHoc, UBNDQuan.
Có cùng các thuộc tính và các kiểu dữ liệu cho các thuộc tính nên được
nhóm chung vào cùng 1 nhóm gọi là loại Feature “nơi chốn”.
Các thuộc tính và các kiểu dữ liệu của từng thuộc tính của các loại Feature
này chính là các cột và các kiểu dữ liệu của các cột của bảng tương ứng.
6.3. Giao tiếp với client bằng giao thức HTTP Server hỗ trợ 2 giao thức để truyền và nhận dữ liệu từ client là HTTP GET
và HTTP POST.
6.3.1. Nhận dữ liệu từ client bằng giao thức HTTP GET: Để lấy các tham số được gởi cùng với URL trong giao thức này ta dùng hàm
sau:
HttpContext.Current.Request[Tên tham số]
Ví dụ:
Đối với chuỗi URL:
http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVICE
=WFS&VERSION=1.0.0
Để lấy được tham số SERVICE ta viết như sau: string s = HttpContext.Current.Request["SERVICE"];
Nếu tên tham số chỉ ra không có trong chuỗi URL thì hàm trả về null.
6.3.2. Nhận dữ liệu từ client bằng giao thức HTTP POST Đối với giao thức HTTP POST thì các dữ liệu do client gởi lên sẽ không
được thêm vào cuối chuỗi URL mà được gởi trong phần body của request.
Trong .NET, phần dữ liệu do client gởi lên được lưu trong thuộc tính
InputStream của lớp Request, đây là 1 Stream.
Chương 6. Cài đặt chương trình OpenGISServer
115
HttpContext.Current.Request.InputStream.
Ví dụ dưới đây lấy dữ liệu do client gởi lên, sử dụng lớp StreamReader để
đọc dữ liệu từ Stream và chuyển từ Stream sang text để xử lí:
Stream stream = Request.InputStream;
StreamReader read = new StreamReader(stream);
string sPostContent = read.ReadToEnd();
6.3.3. Trả kết quả về cho Client Để trả chuỗi kết quả về cho client, ta dùng hàm Response.Write(s).
Tuy nhiên, khi dùng hàm này để trả kết quả về cho client thì client không chỉ
nhận được chuỗi s mà còn nhận được 1 chuỗi HTML đi kèm. Chuỗi HTML
này gồm các tag dùng cho việc hiển thị trang web. Tuy nhiên, trong ứng
dụng này thì chuỗi HTML này là không cần thiết. Để server đừng gởi thêm
chuỗi HTML này, ta dùng hàm Response.End() ngay sau hàm
Response.Write(s).
Response.Write(sResponse);
Response.End();
6.4. Đọc dữ liệu từ chuỗi XML Để đọc dữ liệu từ chuỗi Xml ta có thể sử dụng các lớp sau: XmlDocument,
XmlNode, XmlNodeList, XmlElement, XmlAttributes.
6.4.1. Ví dụ đọc 1 tài liệu Xml Xét chuỗi sRequestXml có nội dung như sau:
<?xml version="1.0" ?>
<wfs:Transaction
version="1.0.0"
service="WFS"
xmlns:cite="http://www.opengeospatial.net/cite"
xmlns:ogc="http://www.opengis.net/ogc"
Chương 6. Cài đặt chương trình OpenGISServer
116
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"
xsi:schemaLocation="http://www.opengis.net/wfs
../wfs/1.0.0/WFS-transaction.xsd">
<wfs:Update typeName="duong">
<wfs:Property>
<wfs:Name>NAME</wfs:Name>
<wfs:Value>Ngô Gia Tự</wfs:Value>
</wfs:Property>
<ogc:Filter>
<ogc:FeatureId fid="duong.3"/>
</ogc:Filter>
</wfs:Update>
<wfs:Delete typeName=”quan”>
<ogc:Filter>
<ogc:FeatureId fid="quan.1"/>
</ogc:Filter>
</wfs:Delete>
</wfs:Transaction>
Mỗi XmlNode sẽ tương ứng với 1 tag trong chuỗi Xml, chẳng hạn tag
<wfs:Transaction> là 1 XmlNode.
Mỗi XmlNode có chứa nhiều XmlNode con, và có thể chứa các Attributes
của node đó.
Chẳng hạn, trong ví dụ trên thì node <wfs:Transaction> có 2 node con là
<wfs:Update> và <wfs:Delete>. Node <wfs:Update> này chứa 2 node con
là <wfs:Property> và <ogc:Filter>.
Node <wfs:Update> và node <wfs:Delete> có 1 attribute là “typeName”.
Chương 6. Cài đặt chương trình OpenGISServer
117
Đọc dữ liệu từ chuỗi Xml này.
Trước hết, cần phải tạo 1 XmlDocument tương ứng với chuỗi này:
XmlDocument requestDocument = new XmlDocument();
requestDocument.LoadXml(sRequestXml);
Lấy node đầu tiên <wfs:Transaction>:
XmlNode first = requestDocument.FirstNode;
Lấy 2 node con <wfs:Update> và <wfs:Delete>:
XmlNodeList childs = first.ChildNodes;
XmlNode updateNode = childs[0];
XmlNode deleteNode = childs[1];
Lấy attribute “typeName” của node <wfs:Update>
string sUpdateTypeName = updateNode.Attributes[“typeName”];
Nếu như node không chứa attribute này thì hàm này trả về null.
Lấy giá trị của Node <wfs:Name>, sử dụng thuộc tính InnerXml của lớp
XmlNode
string Name = updateNode.FirstChild.FirstChild.InnerXml;
Lấy tên của Node <wfs:Update>, có cả phần NameSpace phía trước tên
node
string sNodeName = updateNode.Name;
Khi đó sNodeName = “wfs:Update”, trong đó “wfs” là NameSpace của Update”.
Lấy tên của Node <wfs:Update>, không lấy phần NameSpace phía trước
tên node
string sLocalNodeName = updateNode.LocalName;
Khi đó sLocalNodeName = “Update”.
Chương 6. Cài đặt chương trình OpenGISServer
118
Để lấy chuỗi Xml tương ứng với Node <wfs:Update>:
string xmlUpdate = updateNode.OuterXml;
Khi đó, chuỗi xmlUpdate sẽ có giá trị là: <wfs:Update typeName="duong">
<wfs:Property>
<wfs:Name>NAME</wfs:Name>
<wfs:Value>Ngô Gia Tự</wfs:Value>
</wfs:Property>
<ogc:Filter>
<ogc:FeatureId fid="duong.3"/>
</ogc:Filter>
</wfs:Update>
6.5. Các lớp trong chương trình Tên lớp Mô tả
Others/ExceptionBuilder Xây dựng chuỗi XML dùng để báo
các lỗi về cho client khi có lỗi trong
request
Other/OtherTasks Chứa tên các FeatureType trong
chương trình
Chức các thuộc tính của các
FeatureType
Chứa các hàm thực hiện những tác vụ
phụ trong chương trình
WFS/CheckBasicParameterClasses/Abstra
ctHTTPClass
Lớp trừu tượng, có tác dụng lấy các
tham số mà client gửi lên trong
request.
Chương 6. Cài đặt chương trình OpenGISServer
119
WFS/CheckBasicParameterClasses/HTTP
GetClass
Kế thừa từ lớp
CheckBasicParameterClasses/Abstrac
tHTTPClass, có tác dụng lấy các tham
số mà client gửi lên trong 1 HTTP
GET request
WFS/CheckBasicParameterClasses/HTTP
PostClass
Kế thừa từ lớp
CheckBasicParameterClasses/Abstrac
tHTTPClass, có tác dụng lấy các tham
số mà client gửi lên trong 1 HTTP
POST request
WFS/FeatureClass/AbstractFeature Là 1 lớp abstract, gồm các hàm dùng
để thực hiện các tác vụ liên quan đến
các FeatureType trên Server, chẳng
hạn như:
Đọc từ cơ sở dữ liệu để lấy về các
Feature thỏa 1 số điều kiện nào đó
Tạo ra chuỗi Xml mô tả các Feature
để trả về cho client (chức năng này
được cài đặt cụ thể ở các lớp con của
nó).
Lấy các thuộc tính của Feature
……
Chương 6. Cài đặt chương trình OpenGISServer
120
WFS/FeatureClass/DistrictFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature.
Có chức năng thực hiện các thao tác
trên loại Feature “Quan”:
Lấy các thuộc tính của loại Feature
“Quan”.
Tạo chuỗi Xml mô tả với các Feature
“Quan” lấy được từ cơ sở dữ liệu để
trả về cho client
WFS/FeatureClass/PlaceFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature.
Có chức năng thực hiện các thao tác
trên các Feature thuộc loại Feature
“nơi chốn”
Lấy các thuộc tính của loại Feature
“noi chon”.
Tạo chuỗi Xml mô tả với các Feature
“noi chon” lấy được từ cơ sở dữ liệu
để trả về cho client
WFS/FeatureClass/RiverFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature.
Có chức năng thực hiện các thao tác
trên các Feature thuộc loại Feature
“Song”
Lấy các thuộc tính của loại Feature
“Song”.
Tạo chuỗi Xml mô tả với các Feature
“Song” lấy từ csdl trả về cho client.
Chương 6. Cài đặt chương trình OpenGISServer
121
WFS/FeatureClass/RoadFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature.
Có chức năng thực hiện các thao tác
trên các Feature thuộc loại Feature
“Duong”
Lấy các thuộc tính của loại Feature
“Duong”.
Tạo chuỗi Xml mô tả với các Feature
“Duong” lấy được từ cơ sở dữ liệu để
trả về cho client
WFS/FeatureClass/UniversityEnrollmentF
eature
Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature.
Có chức năng thực hiện các thao tác
trên các Feature thuộc loại Feature
“UBNDQuan”
Lấy các thuộc tính của loại Feature
“UBNDQuan”.
Tạo chuỗi Xml mô tả với các Feature
“UBNDQuan” lấy được từ cơ sở dữ
liệu để trả về cho client
WFS/FeatureClass/YPageSitFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature.
Có chức năng thực hiện các thao tác
trên các Feature thuộc loại Feature
“YPageSit”
Lấy các thuộc tính của loại Feature
“YPageSit”.
Tạo chuỗi Xml mô tả với các Feature
“YPageSit” lấy từ csdl trả về client.
Chương 6. Cài đặt chương trình OpenGISServer
122
WFS/FilterClasses/FilterSolution Có chức năng tạo ra chuỗi query dùng
để truy vấn cơ sở dữ liệu từ đối tượng
XmlDocument mô tả chuỗi Filter.
WFS/WFS Operation
Classes/DescribeFeatureTypeSolution/Get
ParameterClasses/AbstractHttp
Là 1 lớp ảo, có tác dụng lấy các tham
số của DescribeFeatureType request
.
WFS/WFS Operation
Classes/DescribeFeatureTypeSolution/Get
ParameterClasses/HttpGetRequest
Là lớp con của lớp WFS/WFS
OperationClasses/DescribeFeatureTyp
eSolution/GetParameterClasses/Abstr
actHttp.
Có tác dụng lấy các tham số của
DescribeFeatureType request được
gởi lên bằng giao thức HTTP GET.
WFS/WFS Operation
Classes/DescribeFeatureTypeSolution/Get
ParameterClasses/HttpPostRequest
Là lớp con của lớp WFS/WFS
OperationClasses/DescribeFeatureTyp
eSolution/GetParameterClasses/Abstr
actHttp.
Có tác dụng lấy các tham số của
DescribeFeatureType request được
gởi lên bằng giao thức HTTP POST.
WFS/WFS Operation
Classes/DescribeFeatureTypeSolution/Des
cribeFeatureTypeSolution
Có chức năng nhận 1
DescribeFeatureType request, lấy về
mô tả của các loại Feature và tạo
chuỗi response bằng Xml.
WFS/WFS Operation
Classes/GetFeatureSolution/GetParameter
Classes/AbstractHttp
Là 1 lớp ảo, có tác dụng lấy các tham
số của GetFeature request .
WFS/WFS Operation
Classes/GetFeatureSolution/GetParameter
Là lớp con của lớp WFS/WFS
OperationClasses/GetFeatureSolution/
Chương 6. Cài đặt chương trình OpenGISServer
123
Classes/HttpGetRequest GetParameterClasses/AbstractHttp.
Có tác dụng lấy các tham số của
GetFeature request được gởi lên
bằng giao thức HTTP GET.
WFS/WFS Operation
Classes/GetFeatureSolution/GetParameter
Classes/HttpPostRequest
Là lớp con của lớp WFS/WFS
OperationClasses/GetFeatureSolution/
GetParameterClasses/AbstractHttp.
Có tác dụng lấy các tham số của
GetFeature request được gởi lên
bằng giao thức HTTP POST.
WFS/WFS Operation
Classes/GetFeatureSolution/GetFeatureSo
lution
Có chức năng nhận 1 GetFeature
request, truy vấn cơ sở dữ liệu để lấy
về các Feature được yêu cầu và tạo
chuỗi response bằng Xml.
WFS/WFS Operation
Classes/LockFeatureSolution/GetParamet
erClasses/AbstractHttp
Là 1 lớp ảo, có tác dụng lấy các tham
số của LockFeature request .
WFS/WFS Operation
Classes/LockFeatureSolution/GetParamet
erClasses/HttpGetRequest
Là lớp con của lớp WFS/WFS
OperationClasses/LockFeatureSolutio
n/GetParameterClasses/AbstractHttp.
Có tác dụng lấy các tham số của
LockFeature request được gởi lên
bằng giao thức HTTP GET.
WFS/WFS Operation
Classes/LockFeatureSolution/GetParamet
erClasses/HttpPostRequest
Là lớp con của lớp WFS/WFS
OperationClasses/LockFeatureSolutio
n/GetParameterClasses/AbstractHttp.
Có tác dụng lấy các tham số của
LockFeature request được gởi lên
bằng giao thức HTTP POST.
Chương 6. Cài đặt chương trình OpenGISServer
124
WFS/WFS Operation
Classes/LockFeatureSolution/LockFeature
Solution
Có chức năng nhận 1 LockFeature
request, khóa các Feature theo yêu cầu
và tạo chuỗi response bằng Xml.
WFS/WFS Operation
Classes/LockFeatureSolution/DataBaseAc
cess
Gồm các hàm thực hiện các thao tác
trên cơ sở dữ liệu liên quan tới chức
năng khóa và mở khóa các Feature.
WFS/WFS Operation
Classes/TransactionSolution/OperationSol
ution/HTTPGETDelete
Có chức năng nhận Transaction
request với Operation là Delete, được
gởi lên bằng giao thức HTTP GET,
thực hiện xóa các Feature theo yêu
cầu và tạo response tương ứng.
WFS/WFS Operation
Classes/TransactionSolution/OperationSol
ution/HTTPPOSTDelete
Có chức năng nhận Transaction
request với Operation là Delete, được
gởi lên bằng HTTP POST, thực hiện
xóa các Feature theo yêu cầu và tạo
response tương ứng
WFS/WFS Operation
Classes/TransactionSolution/OperationSol
ution/HTTPPOSTUpdate
Có chức năng nhận Transaction
request với Operation là Update,
được gởi lên bằng HTTP POST, thực
hiện việc cập nhật các Feature theo
yêu cầu và tạo response tương ứng
WFS/WFS Operation
Classes/TransactionSolution/OperationSol
ution/HTTPPOSTInsert
Có chức năng nhận Transaction
request với Operation là Insert, được
gởi lên bằng HTTP POST, thực hiện
việc thêm các Feature theo yêu cầu và
tạo response tương ứng.
WFS/WFS Operation
Classes/TransactionSolution/DataBaseAcc
ess
Gồm các hàm dùng để thao tác trên cơ
sở dữ liệu. Thực hiện thêm, xóa, sửa
các bảng trong csdl theo yêu cầu.
Chương 6. Cài đặt chương trình OpenGISServer
125
WFS/WFS Operation
Classes/TransactionSolution/TransactionS
olution
Có chức năng nhận 1 Transaction
request, thực hiện yêu cầu transaction
tương ứng và trả về chuỗi response
bằng Xml.
WFS/WFS Operation
Classes/GetCapabilitiesSolution
Có chức năng nhận 1 GetCapabilities
request, lấy thông tin về các khả năng
của server và trả về chuỗi response
bằng Xml.
WFS/WFS Operation
Classes/FeatureRequest
Chứa 1 loại Feature cần truy vấn và
các điều kiện truy vấn đối với lớp đó.
WFS/WFSSolution Nhận 1 WFS request, xác định loại
request cụ thể và gọi lớp tương ứng để
thực hiện request này
Bảng 6.8.Các lớp trong chương trình
Chương trình có 1 trang ASP.NET ở địa chỉ
http://localhost/OpenGISServer/VNesOpenGISServer.aspx
Trang này sẽ trực tiếp nhận các request từ client, thực hiện 1 số kiểm tra để đảm
bảo tính hợp lệ của request, xác định loại request là WFS hay WMS và gọi lớp
tương ứng để đáp ứng request.
Các file Xml lưu trữ các thông tin về server.
File XmlFiles/WFS_Capabilities.xml: File này chứa nội dung của tài liệu
Xml dùng làm response cho request GetCapabilities.
File XmlFiles/ExceptionFrame.xml: File này chứa phần khung nội dung
của chuỗi Xml dùng làm response khi request có lỗi.
Các file trong thư mục WFS/FeatureTypeFiles: đây là các file chứa các tài
liệu xml dùng để mô tả các loại Feature. Các file này hỗ trợ cho response
của DescribeFeatureType request
Chương 7. Cài đặt các chương trình client
126
Chương 7. Cài đặt các chương trình client
7.1. Cài đặt chương trình OpenGisClientDemo
7.1.1. Giới thiệu
7.1.1.1. Tính năng
Chương trình OpenGISClient là 1 chương trình được cài đặt bằng C# ở dạng
Window Form.
Chức năng của chương trình là minh họa 1 cách cụ thể, rõ ràng việc thực
hiện các request WFS và WMS lên các server hỗ trợ WFS và WMS.
Chương trình lưu 1 danh sách các server hỗ trợ WFS và WMS, có thể thêm
các server mới. Trong quá trình thực hiện request, ta có thể chọn bất kì
server nào để gởi request và nhận kết quả từ server đó.
Các request mà OpenGISClient hỗ trợ gồm:
WFS:
• GetCapabilities
• DescribeFeatureType
• GetFeature
• LockFeature
• Transaction
WMS:
• GetCapabilities
• GetMap
Chương trình sử dụng bộ thư viện CarbonTools. Bộ thư viện này hỗ trợ thực
hiện request.
Chương 7. Cài đặt các chương trình client
127
7.1.1.2. Màn hình giao diện
7.1.1.2.1. Màn hình chính
Hình 7.1. Màn hình chính
Chương 7. Cài đặt các chương trình client
128
7.1.1.2.2. Màn hình minh họa thực hiện request WFS - GetCapabilities
Hình 7.2.Màn hình minh họa thực hiện request WFS – GetCapabilities
Chương 7. Cài đặt các chương trình client
129
7.1.1.2.3. Màn hình minh họa thực hiện request WFS – DescribeFeatureType.
Hình 7.3.Màn hình minh họa thực hiện request WFS – DescribeFeatureType
Chương 7. Cài đặt các chương trình client
130
7.1.1.2.4. Màn hình minh họa thực hiện request WFS – GetFeature
Hình 7.4.Màn hình minh họa thực hiện request WFS – GetFeature
Chương 7. Cài đặt các chương trình client
131
7.1.1.2.5. Màn hình minh họa thực hiện request WFS – GetFeature
Hình 7.5.Màn hình minh họa thực hiện request WFS – GetFeature
Chương 7. Cài đặt các chương trình client
132
7.1.1.2.6. Màn hình minh họa thực hiện request WFS – Transaction
Hình 7.6.Màn hình minh họa thực hiện request WFS – Transaction
Chương 7. Cài đặt các chương trình client
133
7.1.1.2.7. Màn hình minh họa thực hiện request WMS – GetCapabilities
Hình 7.7.Màn hình minh họa thực hiện request WMS – GetCapabilities
Chương 7. Cài đặt các chương trình client
134
7.1.1.2.8. Màn hình minh họa thực hiện request WMS – GetMap
Hình 7.8.Màn hình minh họa thực hiện request WMS – GetMap
Chương 7. Cài đặt các chương trình client
135
7.1.2. Gởi request cho server Sau khi xây dựng xong chuỗi request bằng Xml, ta cần phải gởi chuỗi
request này lên cho server.
Trong .NET, ta có thể thực hiện việc gởi 1 request lên cho server theo 2 cách
là: đồng bộ và bất đồng bộ
7.1.2.1. Thực hiện việc gởi request bằng phương pháp đồng bộ
Đối với phương pháp đồng bộ, sau khi thực hiện 1 request thì client phải chờ
cho đến khi nhận xong response từ server, nó mới có thể thực hiện tiếp các
tác vụ khác. Do đó, trong lúc nhận response từ server thì client không thể
làm được việc gì khác.
Để gởi request bằng phương pháp đồng bộ, ta sử dụng 2 lớp là
HttpWebRequest và HttpWebResponse.
7.1.2.1.1. Gởi request bằng phương pháp dồng bộ với giao thức HTTP GET Trong trường hợp này chuỗi URL có thể chứa thêm các thông tin khác.
Ví dụ dưới đây gởi request đến 1 server có chuỗi URL là
string sURL =
“http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVIC
E=WFS&
VERSION=1.0.0&REQUEST=GetFeature&TypeName=buudien,quan,duong”
Chuỗi URL này có thêm các tham số là SERVICE, VERSION,
REQUEST, TypeName.
Tạo đối tượng HttpWebRequest và gởi chuỗi URL
System.Net.HttpWebRequest httpRequest =
System.Net.HttpWebRequest)System.Net.WebRequest.Create(sURL);
Chương 7. Cài đặt các chương trình client
136
Nhận kết quả trả về dưới dạng 1 stream.
System.Net.WebResponse httpResponse =
httpRequest.GetResponse();
System.IO.Stream stream = httpResponse.GetResponseStream();
Sau khi nhận dòng dữ liệu này, ta có thể lấy dữ liệu trong dòng dữ liệu
dưới dạng chuỗi hoặc lưu dòng dữ liệu xuống file.
StreamReader reader = new StreamReader(stream);
Chuyển kết quả sang 1 chuỗi.
string response = reader.ReadToEnd();
Lưu dòng dữ liệu xuống file.
FileStream file = new
FileStream("c:\\xml.xml",FileMode.Create,FileAccess.Write);
int ch;
do{
ch = stream.ReadByte();
if (ch!= -1)
file.WriteByte((byte)ch);
}while (ch != -1);
file.Close();
7.1.2.1.2. Gởi request bằng phương pháp đồng bộ với giao thức HTTP POST Trong trường hợp này nội dung cần gởi lên server được lưu trong phần body
của request.
Ví dụ dưới đây gởi 1 request dưới dạng POST lên server.
Server có địa chỉ là
sAddress=http://localhost/OpenGISServer/VNesOpenGISServer.aspx
Nội dung cần gởi lên server này được lưu trong chuỗi sPostContent.
Khi đó việc gởi request và nhận response được thực hiện như sau:
Chương 7. Cài đặt các chương trình client
137
• Tạo đối tượng HttpWebRequest và ghi nội dung của chuỗi sPostContent
vào phần body của request.
System.Net.HttpWebRequest myHttpWebRequest =
(System.Net.HttpWebRequest)System.Net.WebRequest.Creat
e(sAddress);
System.Text.ASCIIEncoding encoding=new
System.Text.ASCIIEncoding();
byte[] byte1=encoding.GetBytes(sPostContent);
//Chọn loại ContentType của dữ liệu cần gởi lên
myHttpWebRequest.ContentType="application/x-www-form-
urlencoded";
// Xác định chiều dài của chuỗi cần gởi lên
myHttpWebRequest.ContentLength=sPostContent.Text.
Length;
myHttpWebRequest.Method = "POST";
Stream newStream = myHttpWebRequest.GetRequestStream();
newStream.Write(byte1,0,byte1.Length);
newStream.Close();
System.Net.WebResponse httpResponse =
myHttpWebRequest.GetResponse();
System.IO.Stream stream =
httpResponse.GetResponseStream();
StreamReader reader = new StreamReader(stream);
//Chuyển kết quả sang 1 chuỗi.
string response = reader.ReadToEnd();
stream.Close();
httpResponse.Close();
//Lấy kết quả trả về.
System.Net.WebResponse httpResponse =
httpRequest.GetResponse();
System.IO.Stream stream =
httpResponse.GetResponseStream();
Chương 7. Cài đặt các chương trình client
138
7.1.2.2. Gởi request bằng phương pháp không đồng bộ
Khi gởi 1 request bằng phương pháp không đồng bộ, ta có thể tiếp tục thực
hiện các tác vụ khác trong lúc nhận kết quả trả về bởi vì tác vụ nhận kết quả
từ server sẽ được thực hiện trong 1 tiểu trình khác.
7.1.2.2.1. Gởi request bằng phương pháp không đồng bộ với giao thức HTTP GET Ví dụ dưới đây minh họa việc gởi request đến server bằng phương pháp
không đồng bộ với giao thức HTTP GET.
Chương trình dưới đây là 1 chương trình dưới dạng console, có chức năng
nhận 1 chuỗi URI từ dòng lệnh, yêu cầu tài nguyên từ địa chỉ đó, in dữ liệu ra
màn hình sau khi nó nhận xong dữ liệu từ server.
Chương trình định nghĩa 2 lớp là lớp RequestState, có tác dụng chuyển dữ
liệu qua lại giữa các các lời gọi không đồng bộ và lớp ClientGetAsync dùng
để tạo 1 request bằng phương pháp không đồng bộ
• Lớp RequestState lưu trạng thái của request trong suốt quá trình gọi
các hàm để phục vụ request. Nó chứa 1 đối tượng WebRequest và 1 đối
tượng Stream, đối tượng WebRequest chứa request hiện tại đến tài
nguyên trên server và đối tượng Stream chứa dòng dữ liệu nhận được từ
response của server, và 1 đối tuợng StreamBuilder chứa toàn bộ chuỗi
response. Một đối tượng RequestState được dùng làm tham số state khi
hàm AsyncCallback được đăng kí với
hàmWebRequest.BeginGetResponse.
• Lớp ClientGetAsync chứa các hàm và các thuộc tính dưới đây:
o Thuộc tính allDone chứa 1 đối tượng của lớp ManualResetEvent,
dùng để báo hiệu khi request hoàn thành.
o Hàm Main() đọc thông tin từ dòng lệnh và tạo 1 request đến 1 tài
nguyên trên internet. Nó tạo 1 đối tuợng WebRequest wreq và đối
tượng RequestState rs, gọi hàm BeginGetResponse để bắt đầu quá
Chương 7. Cài đặt các chương trình client
139
trình thực hiện request. Sau đó nó gọi hàm allDone.WaitOne() để cho
chương trình sẽ không kết thúc khi vẫn chưa nhận xong response. Sau
khi đọc được response, 1 hàm này xuất nội dung trong response ra
màn hình và chương trình kết thúc.
o Hàm RespCallBack() dùng để cài đặt 1 hàm callback không đồng
bộ đến tài nguyên trên internet. Nó tạo ra 1 đối tượng WebResponse
dùng để chứa response từ server, lấy dòng dữ liệu từ response này và
bắt đầu quá trình đọc dữ liệu từ dòng dữ liệu 1 cách không đồng bộ.
o Hàm ReadCallBack() dùng để cài đặt 1 hàm callback không đồng
bộ, hàm callback này có tác dụng đọc dữ liệu từ dòng dữ liệu của
chuỗi response. Nó chuyển dữ liệu nhận được tài nguyên internet và
gán nó cho thuộc tính ResponseData của đối tượng RequestState,
sau đó nó lại bắt đầu tiếp thao tác đọc dữ liệu không đồng bộ trong
dòng dữ liệu của response từ server cho đến khi không còn dữ liệu trả
về. Sau khi toàn bộ dữ liệu đã được đọc xong, hàm ReadCallBack()
đóng dòng dữ liệu của response lại và gọi hàm allDone.Set() để chỉ ra
rằng toàn bộ dữ liệu từ server trả về đã được ghi vào ResponseData.
Chú ý: Một điều đáng lưu ý là tất cả các dòng dữ liệu giữa client và mạng
bên ngoài phải được đóng lại. Nếu ta không đóng các dòng dữ liệu của các
request và các response, chương trình của ta sẽ không còn kết nối nào đến
server nữa và không thể thực hiện tiếp request nào.
using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO;
// Lớp RequestState dùng để chuyển dữ liệu qua lại giữa các
lời gọi hàm.
Chương 7. Cài đặt các chương trình client
140
public class RequestState
{
const int BufferSize = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public WebRequest Request;
public Stream ResponseStream;
//Tạo bộ giải mã tương ứng với loại mã hóa
public Decoder StreamDecode = Encoding.UTF8.GetDecoder();
public RequestState()
{
BufferRead = new byte[BufferSize];
RequestData = new StringBuilder(String.Empty);
Request = null;
ResponseStream = null;
}
}
// Lớp ClientGetAsync thực hiện 1 request không đồng bộ
class ClientGetAsync
{
public static ManualResetEvent allDone = new
ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
public static void Main(string[] args)
{
if (args.Length < 1)
{
showusage();
return;
}
// Lấy chuỗi URI từ dòng lệnh
Uri httpSite = new Uri(args[0]);
Chương 7. Cài đặt các chương trình client
141
// Tạo đối tượng dùng để gởi request
WebRequest wreq = WebRequest.Create(httpSite);
// Tạo đối tượng state
RequestState rs = new RequestState();
// Gán request vào state để cho nó có thể được
chuyển đi đến các hàm khác
rs.Request = wreq;
// Thực hiện 1 request không đồng bộ
IAsyncResult r = (IAsyncResult)
wreq.BeginGetResponse(new
AsyncCallback(RespCallback), rs);
// Chờ cho đến khi lớp ManualResetEvent được
//thiết lập sao cho ứng dụng sẽ không dừng lại
//cho đến khi hàm callback được gọi
allDone.WaitOne();
Console.WriteLine(rs.RequestData.ToString());
}
public static void showusage() {
Console.WriteLine("Nhận chuỗi URL");
Console.WriteLine("\r\nDùng cho:");
Console.WriteLine(" ClientGetAsync URL");
Console.WriteLine(" Ví dụ:");
Console.WriteLine(" ClientGetAsync
http://www.contoso.com/");
}
private static void RespCallback(IAsyncResult ar)
{
//Lấy đối tượng RequestState từ kết quả trả về
//của lời gọi request không đồng bộ.
RequestState rs = (RequestState) ar.AsyncState;
//Lấy đối tượng WebRequest từ đối tượng RequestState
WebRequest req = rs.Request;
Chương 7. Cài đặt các chương trình client
142
//Gọi hàm EndGetResponse, hàm này tạo ra 1 đối
//tượng WebResponse từ request được gởi ở trên
WebResponse resp = req.EndGetResponse(ar);
//Bắt đầu đọc dữ liệu từ dòng dữ liệu trả về
Stream ResponseStream=resp.GetResponseStream();
// Lưu dòng dữ liệu trả về trong RequestState để đọc
//dòng dữ liệu này 1 cách không đồng bộ
rs.ResponseStream = ResponseStream;
//Gởi tham số rs.BufferReader cho hàm BeginRead.
//Đọc dữ liệu vào rs.BufferRead
IAsyncResult iarRead =
ResponseStream.BeginRead(rs.BufferRead, 0,
BUFFER_SIZE, new AsyncCallback(ReadCallBack),rs);
}
private static void ReadCallBack(IAsyncResult
asyncResult)
{
// Lấy đối tượng RequestState từ đối tượng AsyncResult
RequestState rs = RequestState)asyncResult.AsyncState;
// Lấy ResponseStream khởi tạo trong hàm RespCallback
Stream responseStream = rs.ResponseStream;
// Đọc rs.BufferRead để kiểm tra xem nó có còn
//dữ liệu không
int read = responseStream.EndRead( asyncResult);
if (read > 0)
{
// Tạo 1 mảng Char để chuyển sang Unicode
Char[] charBuffer = new Char[BUFFER_SIZE];
//Chuyển từ dòng dữ liệu kiểu byte sang mảng
Char và sau đó sang String
// Biến len chứa số kí tự được chuyển sang Unicode
Chương 7. Cài đặt các chương trình client
143
int len = rs.StreamDecode.GetChars(
rs.BufferRead, 0,read, charBuffer, 0);
String str = new String(charBuffer, 0, len);
// Gắn phần dữ liệu vừa đọc được vào đối
//tượng RequestData nằm trong RequestState
rs.RequestData.Append(
Encoding.ASCII.GetString(rs.BufferRead, 0, read));
// Tiếp tục đọc dữ liệu đến khi hàm
responseStream.EndRead trả về -1
IAsyncResult ar = responseStream.BeginRead(
rs.BufferRead, 0, BUFFER_SIZE,
new AsyncCallback(ReadCallBack), rs);
}
else
{
if(rs.RequestData.Length>0)
{
//Hiển thị dữ liệu ra màn hình
string strContent;
strContent = rs.RequestData.ToString();
}
// Đóng dòng dữ liệu trả về
responseStream.Close();
//Thiết lập ManualResetEvent để cho tiểu trình
chính có thể đóng lại
}
return;
}
}
Chương 7. Cài đặt các chương trình client
144
7.2. Cài đặt chương trình OpenGisClientApplication
7.2.1. Tính năng Theo như trình bày ở trên thì chương trình OpenGISClientDemo có chức năng
chính là minh họa cách thực hiện các request của WMS và WFS chứ không phải 1
ứng dụng GIS cụ thể.
Chương trình OpenGISClientApplication là 1 ứng dụng GIS, ứng dụng này sử
dụng các request của WMS để truy vấn thông tin địa lý trên các server hỗ trợ WMS.
Ứng dụng giúp người dùng hiển thị các bản đồ do các server cung cấp, cho phép
thực hiện các chức năng phóng to, thu nhỏ, di chuyển…. và hỗ trợ lấy thông tin của
1 điểm trên bản đồ đối với các server có hỗ trợ request GetFeatureInfo.
Chương 7. Cài đặt các chương trình client
145
7.2.2. Màn hình giao diện
Hình 7.9.Màn hình giao diện chương trình OpenGISClientApplication
Chương 7. Cài đặt các chương trình client
146
Có thể lấy thông tin của một điểm trên bản đồ:
Hình 7.10.Màn hình lấy thông tin một điểm trên bản đồ
Chương8. Tổng kết
147
Chương 8. Tổng kết
8.1. Kết quả đạt được Sau hơn sáu tháng tiến hành nghiên cứu và triển khai đề tài luận văn “Tìm hiểu
về dịch vụ web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác
dịch vụ” chúng em đã gặp không ít những khó khăn song đã đạt được những kết
quả nhất định theo những mục tiêu đề ra ban đầu của đề tài.
Cụ thể, những kết quả đó là nghiên cứu thành công và tiến hành triển khai các
dịch vụ web theo hai chuẩn WMS và WFS do OGC đưa ra. Chương trình
OpenGISServer hỗ trợ đầy đủ các giao tác trong hai dịch vụ này, điều mà không
phải các server hỗ trợ GIS nào cũng được thực hiện hoàn chỉnh. Đồng thời xây
dựng thành công hai ứng dụng minh họa khai thác dịch vụ WMS và WFS. Trong
đó, chương trình OpenGISClientDemo đã minh họa đầy đủ các giao tác của hai dịch
vụ này. Còn chương trình OpenGISClientApplication được phát triển trên môi
trường WinForm đã thực hiện được các chức năng hiển thị bản đồ và truy xuất các
thong tin trên bản đồ nhằm minh họa cho việc khai thác dịch vụ WMS.
Do thời gian hạn chế nên việc xây dựng các ứng dụng minh họa vẫn chưa được
phong phú và có quy mô lớn. Song cũng đã đáp ứng được mục tiêu đặt ra ban đầu
của đề tài.
8.2. Hướng phát triển
Trong tương lai, chúng em dự kiến sẽ hoàn thiện chương trình OpenGISServer
để có thể hỗ trợ các dịch vụ trên nhiều nguồn dữ liệu khác nhau, đồng thời tận dụng
khả năng khai thác các dịch vụ khác để chương trình ngày càng được mở rộng về
quy mô.
Đồng thời, phát triển thêm một số sản phẩm GIS mang ý nghĩa thực tiễn hơn, và
các sản phẩm này khai thác các dịch vụ do OpenGISServer hỗ trợ. Chẳng hạn như
các sản phẩm về tra cứu thông tin bản đồ trực tuyến, từ điển địa lý,…
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
148
PHỤ LỤC - MySQL với phần mở rộng hỗ trợ cho OpenGIS
MySQL cài đặt các kiểu dữ liệu địa lý theo các đặc tả của tổ chức OGC. Các
kiểu dữ liệu này được cài đặt trong MySQL thành các lớp được tổ chức như
sau:
• Geometry (Lớp trừu tượng)
o Point (Lớp cụ thể)
o Curve (Lớp trừu tượng)
• LineString (Lớp cụ thể)
o Line
o LinearRing
o Surface (Lớp trừu tượng)
• Polygon (Lớp cụ thể)
o GeometryCollection (Lớp cụ thể)
• MultiPoint (Lớp cụ thể)
• MultiCurve (Lớp trừu tượng)
o MultiLineString (Lớp cụ thể)
• MultiSurface (Lớp trừu tượng)
o MultiPolygon (Lớp cụ thể)
Ta không thể tạo đối tượng cho các lớp trừu tượng mà chỉ có thể tạo đối
tượng cho các lớp cụ thể.
Mô tả cụ thể về các lớp này
Lớp Geometry
Lớp này không có đối tượng thể hiện cụ thể, các thuộc tính của lớp này
được áp dụng cho các đối tượng của các lớp kế thừa từ lớp này.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
149
Các thuộc tính của Geometry:
• Loại (type): Mỗi đối tượng thuộc về 1 trong các loại trong cấu trúc phân
cấp như trên.
• SRID (Spatial Reference Identifier): Giá trị này xác định hệ tọa độ
không gian được dùng trong việc định nghĩa các điểm của đối tượng
này. Trong MySQL thì giá trị này chỉ là 1 con số nguyên.
• Các điểm (coordinates) của đối tượng trong hệ tọa độ SRID nói trên, là
1 con số 8 byte. Một đối tượng không rỗng sẽ có ít nhất 1 cặp điểm
(X,Y) . Các đối tượng rỗng không chứa điểm nào. Hệ thống điểm có
liên quan với SRID. Chẳng hạn trong các hệ thống điểm khác nhau thì
khoảng cách giữa 2 đối tượng có thể khác nhau khi mà các điểm của các
đối tượng này giống nhau.
• Interior, boundary và exterior: Mỗi đối tượng sẽ chiếm 1 vị trí nào đó
trong không gian, thuộc tính exterior của đối tượng dùng để chỉ vùng
không gian không bị chiếm giữ bởi đối tượng. Thuộc tính interior là
vùng không gian bị chiếm giữ bởi đối tượng còn boundary là phần giao
nhau giữa interior và exterior.
MBR (Minimum Bounding Rectangle): đây là đối tượng bao bên ngoài đối
tượng này, được tạo thành bởi các điểm cực đại và cực tiểu của đối tượng
((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
• Thuộc tính simple hoặc non-simple
• Thuộc tính close hoặc not-close: cho biết các điểm của đối tượng có tạo
thành 1 vòng khép kín không.
• Thuộc tính empty hoặc not-empty: Một đối tượng có thuộc tính empty
là 1 đối tượng không chứa điểm nào. Một đối tượng empty sẽ không
được định nghĩa các thuộc tính exterior, interior và boundary.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
150
• Dimention: Thuộc tính dimention của một đối tượng có các giá trị là -1,
0, 1, 2.
o -1: Đối tượng này là 1 đối tượng rỗng
o 0: Đối tượng này không có chiều dài và không có diện tích
o 1: Đối tượng này có chiều dài khác 0 và diện tích bằng 0.
o 2: Đối tượng này có diện tích khác 0
o Đối tượng Point có dimension là 0
o Đối tượng LineString có dimension là 1
o Đối tượng Polygon có dimension là 2
o Các đối tượng MultiPoint, MultiLineString, MultiPolygon có
dimension bằng với dimension của các thành phần của nó.
Lớp Point
Point là đối tượng dùng để chỉ các địa điểm đơn giản trên hệ thống tọa độ.
Ví dụ về Point: Trong 1 bản đồ thế giới với nhiều thành phố thì 1 Point có
thể được dùng biếu diễn 1 thành phố. Trong 1 bản đồ thành phố thì Point
có thể biểu diễn 1 trạm xe buýt
Các thuộc tính của lớp Point
• Giá trị hoành độ điểm X
• Giá trị tung độ điểm Y
Lớp Curve
Thường được dùng để mô tả 1 mảng các điểm. Lớp này là lớp trừu tượng,
các lớp con của Curve định nghĩa các loại quan hệ khác nhau giữa các
điểm.
Các thuộc tính của Curve
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
151
• Mỗi Curve chứa 1 mảng các điểm
• Curve là đối tượng 1 chiều
• Một Curve thuộc loại simple nếu như nó không đi qua 1 điểm nào đó
của nó 2 lần
• Một Curve là closed nếu như điểm đầu trùng với điểm cuối
• Một Curve vừa simple và vừa closed là 1 Linearing
Lớp LineString
LineString là 1 Curve với mối quan hệ tuyến tính giữa các điểm
Ví dụ về LineString: Trong bản đồ thế giới, LineString có thể dùng để biểu
diễn các con sông. Trong bản đồ thành phố, LineString có thể dùng để biểu
diển các con đường
Thuộc tính của LineString
• Mỗi LineString gồm nhiều đoạn, mỗi đoạn là 1 cặp điểm
• Một LineString là 1 đoạn thẳng nếu nó chỉ chứa đúng 2 điểm
• Một LineString là 1 Linearing nếu như nó vừa closed, vừa simple
Lớp Surface
Surface là lớp trừu tượng, là 1 lớp 2 chiều. Lớp cài đặt cụ thể duy nhất của
lớp này là Polygon.
Lớp Polygon
Trong bản đồ thì Polygon có thể được dùng để mô tả 1 khu rừng, 1 quận
….
Boundary của 1 Polygon gồm 1 tập các Linearing
Lớp GeometryCollection
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
152
Một GeometryCollection là 1 tập gồm 1 hoặc nhiều đối tượng của bất kì
lớp nào.
Các thành phần trong 1 Geometry Collection phải có cùng 1 hệ thống
điểm.
Lớp MultiPoint
Một MultiPoint là tập hợp các Point. Các điểm này có thể được nối với
nhau theo bất kì thứ tự nào
Ví dụ về MultiPoint: Trong bản đồ thế giới, 1 MultiPoint có thể mô tả 1
tập hợp các hòn đảo nhỏ
Lớp MultiCurve: MultiCurve là 1 tập hợp các đối tượng Curve.
Lớp MultiLineString:
MultiLineString là 1 MultiCurve với các thành phần là các LineString
Ví dụ về MultiLineString: Trong bản đồ, MultiLineString có thể dùng để
biểu diễn 1 hệ thống sông ngòi hoặc 1 hệ thống đường cao tốc.
Lớp MultiSurface: MultiSurface là 1 GeometryCollection với các thành phần
là các đối tượng Surface.
Lớp MultiPolygon
MultiPolygon là 1 MultiSurface với các đối tượng là các Polygon.
Ví dụ về MultiPolygon: Trong bản đồ thì MultiPolygon có thể dùng để
biểu diễn 1 hệ thống các ao hồ.
Các Polygon của 1 MultiPolygon không được phép có các thuộc tính
interior giao nhau .
Định dạng dữ liệu không gian trong MySQL
Phần này mô tả các định dạng dữ liệu không gian được dùng để thể hiện các
đối tượng địa lý trong các câu truy vấn.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
153
Các loại định dạng này gồm:
Định dạng Well-Known Text (WKT)
Định dạng Well-Known Binary (WKB)
Các đối tượng địa lý được lưu trữ bên trong MySQL với định dạng khác với
2 loại trên.
Định dạng Well-Known Text (WKT)
Loại định dạng này được dùng để truyển các dữ liệu của đối tượng dưới dạng
các chuỗi ASCII
Ví dụ về việc sử dụng WKT để mô tả đối tượng như sau:
Một điểm: POINT(15 20)
Chú ý là không có dấu phẩy ngăn cách giữa các thành phần của 1 điếm
Một LineString gồm có 4 điểm: LINESTRING(0 0, 10 10, 20 25, 50 60)
Chú ý là giữa các điểm có dấu phẩy ngăn cách Một Polygon với 1 vòng exterior và 1 vòng interior :
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
Một MultiPoint gồm 3 điểm: MULTIPOINT(0 0, 20 20, 60 60)
Một MultiLineString với 2 thành phần LineString
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
Một MultiPolygon với 2 thành phần Polygon
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7
5,7 7,5 7, 5 5)))
Một GeometryCollection với 2 Point và 1 LineString
GEOMETRYCOLLECTION(POINT(10 10),POINT(30
30),LINESTRING(15 15,20 20))
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
154
Định dạng Well-Known Binary (WKB)
Loại định dạng này được định nghĩa trong đặc tả của OpenGIS.
Nó cũng được định nghĩa trong ISO ``SQL/MM Part 3: Spatial''
WKB được dùng để trao đổi dữ liệu của các đối tượng dưới dạng chuỗi
binary.
WKB sử dụng 1 số nguyên không dấu 1 byte, dấu nguyên không dấu 4 byte,
số thực 8 byte (theo định dạng IEEE 754).
Ví dụ như 1 giá trị WKB tương ứng với WKT POINT(1 1) gồm có 21 byte
liên tiếp như dưới đây (mỗi byte được mô tả bằng 2 con số thập lục phân):
0101000000000000000000F03F000000000000F03F
Chuỗi byte này có thể được tách ra thành các phần nhau:
Trật tự byte : 01
Loại WKB : 01000000
X : 000000000000F03F
Y : 000000000000F03F
Các thành phần này có ý nghĩa như sau:
• Trật tự byte có thể là 0 hoặc là 1 dùng để thể hiện cách lưu trữ là little-
endian hay big-endian.
• Giá trị “loại WKB” là mã dùng để chỉ loại đối tượng địa lý,gốm có các
giá trị từ 1 đến 7 tương ứng với các loại đối tượng Point,
LineString, Polygon, MultiPoint, MultiLineString,
MultiPolygon, và GeometryCollection.
• Hai thành phần X và Y là các số thập phân dùng để thể hiện 2 giá trị X
và Y của đối tượng Point.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
155
Các giá trị WKB dùng cho các đối tượng phức tạp sẽ có cấu trúc phức tạp,
theo như mô tả của OpenGIS.
Tạo 1 cơ sở dữ liệu trong MySQL dùng cho dữ liệu không gian
Phần này mô tả các loại dữ liệu được dùng để thể hiện các loại dữ liệu không
gian, và các hàm dùng cho việc tạo và truy vần dữ liệu không gian.
Các kiểu dữ liệu không gian trong MySQL:
MySQL có các kiểu dữ liệu tương ứng với các lớp trong OpenGIS. Một vài
kiểu có thể lưu trữ 1 đối tượng địa lý đơn giản
GEOMETRY
POINT
LINESTRING
POLYGON
GEOMETRY có thể lưu trữ bất cứ kiểu dữ liệu địa lý nào. Các kiểu dữ liệu
như: POINT, LINESTRING và POLYGON chỉ chứa các kiểu dữ liệu thuộc
cùng 1 loại nào đó.
Các kiểu dữ liệu khác có thể lưu tập hợp của giá trị sau:
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
GEOMETRYCOLLECTION có thể lưu tập hợp đối tượng của bất cứ kiểu dữ
liệu nào.Các loại tập hợp khác như MULTIPOINT,
MULTILINESTRING,MULTIPOLYGON và GEOMETRYCOLLECTION
chỉ lưu được các đối tượng thuộc các kiểu dữ liệu tương ứng.
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
156
Tạo các giá trị không gian
Phần này mô tả cách dùng các hàm của Well-Known Text và Well-Known
Binary để tạo ra các giá trị không gian theo chuẩn OpenGIS.
Tạo các giá trị địa lý bằng các hàm của WKT
MySQL có các hàm nhận tham số truyền vào thuộc dạng Well-Known Text
và có thể có thêm tham số SRID. Chúng trả về đối tượng địa lý tương ứng.
Hàm GeoFromText() nhận tham số đầu vào là 1 chuỗi WKT của bất kì
loại đối tượng nào.
Hàm GeomFromText(wkt[,srid]) , GeometryFromText(wkt[,srid])
Tạo đối tượng địa lý bất kì với giá trị WKT và SRID truyền vào.
Hàm LineFromText(wkt[,srid]) , LineStringFromText(wkt[,srid])
Tạo đối tượng LINESTRING với giá trị WKT và SRID truyền vào.
HàmMLineFromText(wkt[,srid]),
MultiLineStringFromText(wkt[,srid])
Tạo đối tượng MULTILINESTRING với giá trị WKT và SRID truyền vào. Hàm MPointFromText(wkt[,srid]) , MultiPointFromText(wkt[,srid])
Tạo đối tượng MULTIPOINT với giá trị WKT và SRID truyền vào. Hàm MPolyFromText(wkt[,srid]) , MultiPolygonFromText(wkt[,srid])
Tạo đối tượng MULTIPOLYGON với giá trị WKT và SRID truyền vào
Hàm PointFromText(wkt[,srid])
Tạo đối tượng POINT với giá trị WKT và SRID truyền vào Hàm PolyFromText(wkt[,srid]) , PolygonFromText(wkt[,srid])
Tạo đối tượng POLYGON với giá trị WKT và SRID truyền
Tạo đối tượng địa lý sử dụng các hàm của WKB
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
157
Hàm GeomCollFromWKB(wkb[,srid]) ,
GeometryCollectionFromWKB(wkb[,srid]). Tạo đối tượng
GEOMETRYCOLLECTION với giá trị WKT và SRID truyền vào.
Hàm GeomFromWKB(wkb[,srid]) , GeometryFromWKB(wkb[,srid]).
Tạo đối tượng địa lý bất kì với giá trị WKT và SRID truyền vào.
Hàm LineFromWKB(wkb[,srid]) , LineStringFromWKB(wkb[,srid]).
Tạo đối tượng LINESTRING với giá trị WKT và SRID truyền vào.
Hàm MLineFromWKB(wkb[,srid]) ,
MultiLineStringFromWKB(wkb[,srid]). Tạo đối tượng
MULTILINESTRING với giá trị WKT và SRID truyền vào.
Hàm MPointFromWKB(wkb[,srid]) ,
MultiPointFromWKB(wkb[,srid]).Tạo đối tượng MULTIPOINT với giá
trị WKT và SRID truyền vào.
Hàm MPolyFromWKB(wkb[,srid]) ,
MultiPolygonFromWKB(wkb[,srid]).Tạo đối tượng MULTIPOLYGON
với giá trị WKT và SRID truyền vào.
Hàm PointFromWKB(wkb[,srid]).Tạo đối tượng POINT với giá trị
WKT và SRID truyền vào.
Hàm PolyFromWKB(wkb[,srid]) , PolygonFromWKB(wkb[,srid]). Tạo
đối tượng POLYGON với giá trị WKT và SRID truyền vào.
Tạo các cột lưu dữ liệu không gian
Dùng lệnh CREATE TABLE để tạo các bảng với các cột lưu dữ liệu không
gian
mysql> CREATE TABLE geom (g GEOMETRY);
Query OK, 0 rows affected (0.02 sec)
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
158
Dùng lệnh ALTER TABLE để thêm hoặc xóa 1 cột trong 1 bảng có sẵn
mysql> ALTER TABLE geom ADD pt POINT;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE geom DROP pt;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
Thêm dữ liệu vào các cột lưu trữ thông tin không gian
Dữ liệu được lưu trữ trong các cột này dưới dạng riêng bên trong MySQL
nhưng bạn có thể tạo ra định dạng riêng này từ định dạng WKB hoặc WKT.
Các ví dụ dưới đây mô tả cách thêm dữ liệu không gian vào bảng bằng cách
chuyển từ WKT sang định dạng riêng trong MySQL.
Ta có thể thực hiện việc chuyển đổi trực tiếp bằng câu lệnh INSERT
INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (GeomFromText(@g));
Hoặc có thể thực hiện việc chuyển đổi trước khi thực hiện câu lệnh INSERT
SET @g = GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (GeomFromText(@g));
Các ví dụ dưới đây thêm các kiểu dữ liệu phức tạp hơn vào các bảng
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,
5 5))';
INSERT INTO geom VALUES (GeomFromText(@g));
SET @g ='GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2
2,3 3,4 4))';
INSERT INTO geom VALUES (GeomFromText(@g));
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
159
Các ví dụ ở trên đều sử dụng hàm GeoFromText() để tạo các đối tượng đại
lý, các ví dụ dưới đây sẽ dùng các hàm riêng biệt của từng loại.
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (PointFromText(@g));
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (LineStringFromText(@g));
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,
5 5))';
INSERT INTO geom VALUES (PolygonFromText(@g));
SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4
4))';
INSERT INTO geom VALUES (GeomCollFromText(@g));
Có thể sử dụng định dạng WKB như sau: Thêm 1 POINT(1 1) vào bảng
mysql> INSERT INTO geom VALUES
->
(GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
Lấy dữ liệu không gian
Các đối tượng địa lý được lưu trữ có thể được lấy ra bằng định dạng riêng
bên trong MySQL nhưng bạn có thể chuyển chúng sang các định dạng WKT
hoặc WKB.
Lấy dữ liệu theo định dạng WKT. Dùng hàm AsText() để chuyển từ định
dạng riêng bên trong MySQL thành định dạng WKT.
mysql> SELECT AsText(g) FROM geom;
+-------------------------+
| AsText(p1) |
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
160
+-------------------------+
| POINT(1 1) |
| LINESTRING(0 0,1 1,2 2) |
+-------------------------+
Lấy dữ liệu theo định dạng WKB
SELECT AsBinary(g) FROM geom;
Phân tích thông tin không gian
Các hàm dùng để truy vấn dữ liệu không gian có thể chia thành các 4 nhóm:
Các hàm dùng để chuyển đổi kiểu định dạng của đối tượng địa lý
Các hàm dùng để truy xuất đến các thuộc tính về chất lượng và số lượng
của đối tượng.
Các hàm mô tả quan hệ giữa 2 đối tượng địa lý.
Các hàm dùng để tạo ra đối tượng dựa trên đối tượng khác
Các hàm dùng để chuyển đổi kiểu định dạng của đối tượng địa lý
AsBinary(g): Chuyển từ định dạng riêng bên trong thành WKB và trả về kết
quả dạng binary.
AsText(g):Chuyển từ định dạng riêng bên trong thành WKT và trả về kết
quả dạng chuỗi.
mysql> SET @g = 'LineString(1 1,2 2,3 3)';
mysql> SELECT AsText(GeomFromText(@g));
+--------------------------+
| AsText(GeomFromText(@G)) |
+--------------------------+
| LINESTRING(1 1,2 2,3 3) |
+--------------------------+
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
161
GeomFromText(wkt[,srid]): Chuyển từ định dạng WKT thành định dạng
riêng bên trong và trả kết quả về
GeomFromWKB(wkb[,srid]): Chuyển từ định dạng WKT thành định dạng
riêng bên trong và trả kết quả về
Các hàm địa lý
Các hàm liệt kê dưới đây không có ràng buộc cho tham số và có thể nhận bất
kì loại đối tượng nào.
Dimension(g) :Trả về thuộc tính Dimension của đối tượng g. Giá trị trả về
có thể là -1, 0, 1, 2
mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));
+------------------------------------------------+
| Dimension(GeomFromText('LineString(1 1,2 2)')) |
+------------------------------------------------+
| 1 |
+------------------------------------------------+
Envelope(g): Trả về hình chữ nhật bao nhỏ nhất (MBR) xung quanh đối
tượng g. Giá trị trả về là 1 đối tượng Polygon.
mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2
2)')));
+-------------------------------------------------------+
| AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |
+-------------------------------------------------------+
| POLYGON((1 1,2 1,2 2,1 2,1 1)) |
+-------------------------------------------------------+
Polygon được định nghĩa bởi các điểm ở các góc của hình chữ nhật bao
POLYGON((MINX MINY,MAXX MINY,MAXX MAXY,MINX MAXY,MINX MINY))
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
162
GeometryType(g): Trả về chuỗi cho biết loại mà đối tượng này thuộc về.
Tên này tương ứng với 1 lớp con cụ thể.
mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
+------------------------------------------+
| GeometryType(GeomFromText('POINT(1 1)')) |
+------------------------------------------+
| POINT |
SRID(g): Trả về 1 số là ID của loại hệ tọa độ của đối tượng. Trong MySQL
thì SRID chỉ là 1 số liên quan đến 1 loại đối tượng
mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));
+-----------------------------------------------+
| SRID(GeomFromText('LineString(1 1,2 2)',101)) |
+-----------------------------------------------+
| 101 |
+-----------------------------------------------+
Các hàm của lớp Point
Một Point gồm 2 thành phần là X và Y, có thể lấy giá trị của 2 thành phần
này như sau:
X(p)
mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
+--------------------------------------+
| X(GeomFromText('Point(56.7 53.34)')) |
+--------------------------------------+
| 56.7 |
+--------------------------------------+
Y(p)
mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
+--------------------------------------+
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
163
| Y(GeomFromText('Point(56.7 53.34)')) |
+--------------------------------------+
| 53.34 |
+--------------------------------------+
Các hàm của lớp LineString
LineString bao gồm các Point. Bạn có thể lấy từng Point, đếm số lượng Point
hoặc lấy chiều dài của LineString này.
EndPoint(ls): Trả về Point cuối cùng của LineString ls
mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
mysql> SELECT AsText(EndPoint(GeomFromText(@ls)));
+-------------------------------------+
| AsText(EndPoint(GeomFromText(@ls))) |
+-------------------------------------+
| POINT(3 3) |
+-------------------------------------+
GLength(ls): Trả về chiều dài của LineString ls trong hệ tọa độ mà nó thuộc
về.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
mysql> SELECT GLength(GeomFromText(@ls));
+----------------------------+
| GLength(GeomFromText(@ls)) |
+----------------------------+
| 2.8284271247462 |
+----------------------------+
IsClosed(ls): Trả về 1 nếu như LineString này là closed (tức là hàm
EndPoint() và hàm StartPoint() trả về cùng 1 giá trị). Trả về 0 nếu
LineString không closed và trả về -1 nếu nó là null.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
mysql> SELECT IsClosed(GeomFromText(@ls));
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
164
+-----------------------------+
| IsClosed(GeomFromText(@ls)) |
+-----------------------------+
| 0 |
+-----------------------------+
NumPoints(ls): Trả về số lượng điểm trong LineString ls
mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
mysql> SELECT NumPoints(GeomFromText(@ls));
+------------------------------+
| NumPoints(GeomFromText(@ls)) |
+------------------------------+
| 3 |
+------------------------------+
PointN(ls,n): Trả về Point thứ n trong LineString ls, tính từ số 1.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
mysql> SELECT AsText(PointN(GeomFromText(@ls),2));
+-------------------------------------+
| AsText(PointN(GeomFromText(@ls),2)) |
+-------------------------------------+
| POINT(2 2) |
StartPoint(ls): Trả về Point đầu tiên trong LineString ls
mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
mysql> SELECT AsText(PointN(GeomFromText(@ls),2));
+-------------------------------------+
| AsText(PointN(GeomFromText(@ls),2)) |
+-------------------------------------+
| POINT(2 2) |
Các hàm của lớp MultiLineString
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
165
GLength(mls): Trả về số thập phân cho biết chiều dài của MultiLineString
này. Chiều dài này bằng tổng các chiều dài của nó.
mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
mysql> SELECT GLength(GeomFromText(@mls));
+-----------------------------+
| GLength(GeomFromText(@mls)) |
+-----------------------------+
| 4.2426406871193 |
IsClosed(mls): Trả về nếu MultiLineString này là closed.
Các hàm của lớp Polygon
Area(poly): Trả về diện tích của Polygon dưới dạng số thực, được đo trong
hệ tọa độ của đối tượng.
mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1
1))';
mysql> SELECT Area(GeomFromText(@poly));
+---------------------------+
| Area(GeomFromText(@poly)) |
+---------------------------+
| 4 |
+---------------------------+
ExteriorRing(poly): Trả về đường bao ngoài của đối tượng Polygon poly
dưới dạng 1 LineString
mysql> SET @poly =
-> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1
1))';
mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly)));
+-------------------------------------------+
| AsText(ExteriorRing(GeomFromText(@poly))) |
+-------------------------------------------+
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
166
| LINESTRING(0 0,0 3,3 3,3 0,0 0) |
+-------------------------------------------+
InteriorRingN(poly,n): Trả về đường bao trong thứ n của Polygon dưới
dạng 1 LineString, tính từ 1.
mysql> SET @poly =
-> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1
1))';
mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1));
+----------------------------------------------+
| AsText(InteriorRingN(GeomFromText(@poly),1)) |
+----------------------------------------------+
| LINESTRING(1 1,1 2,2 2,2 1,1 1) |
NumOfInteriorRings(poly): Trả về số lượng đường bao bên trong của đối
tượng
mysql> SET @poly =
-> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1
1))';
mysql> SELECT NumInteriorRings(GeomFromText(@poly));
+---------------------------------------+
| NumInteriorRings(GeomFromText(@poly)) |
+---------------------------------------+
| 1 |
+---------------------------------------+
Các hàm của đối tượng MultiPolygon
Area(mpoly): Trả về diện tích của MultiPolygon mpoly tính theo hệ tọa độ
của đối tượng.
mysql> SET @mpoly =
-> 'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1
1)))';
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
167
mysql> SELECT Area(GeomFromText(@mpoly));
+----------------------------+
| Area(GeomFromText(@mpoly)) |
+----------------------------+
| 8 |
+----------------------------+
Các hàm của lớp GeometryCollection
GeometryN(gc,n)
mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2
2, 3 3))';
mysql> SELECT AsText(GeometryN(GeomFromText(@gc),1));
+----------------------------------------+
| AsText(GeometryN(GeomFromText(@gc),1)) |
+----------------------------------------+
| POINT(1 1) |
+----------------------------------------+
NumGeometries(gc): Trả về số lượng đối tượng trong GeometryCollection
gc
mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2
2, 3 3))';
mysql> SELECT NumGeometries(GeomFromText(@gc));
+----------------------------------+
| NumGeometries(GeomFromText(@gc)) |
+----------------------------------+
| 2 |
+----------------------------------+
Các hàm dùng để tạo ra các đối tượng mới từ những đối tượng có sẵn
Các hàm tạo ra các đối tượng mới
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
168
Envelope(g)
StartPoint(ls)
EndPoint(ls)
PointN(ls,n)
ExteriorRing(poly)
InteriorRingN(poly,n)
GeometryN(gc,n)
Các hàm kiểm tra mối quan hệ giữa các đối tượng
Các hàm trong phần này nhận tham số là 2 đối tượng và trả về mối quan hệ
dựa trên hình chữ nhật bao (MBR) của chúng.
MySQL cung cấp các hàm dùng để kiểm tra quan hệ giữa các hình chữ nhật
bao của 2 đối tượng.
MBRContains(g1,g2): Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1 có
chứa hình chữ nhật bao của g2 không
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0
0))');
mysql> SET @g2 = GeomFromText('Point(1 1)');
mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
----------------------+----------------------+
| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
+----------------------+----------------------+
| 1 | 0 |
+----------------------+----------------------+
MBRDisjoint(g1,g2): Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1 và
hình chữ nhật bao của g2 có rời nhau (không giao nhau) không
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
169
MBREqual(g1,g2): Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1 và
hình chữ nhật bao của g2 là một không.
MBRIntersects(g1,g2): Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1
và hình chữ nhật bao của g2 có cắt nhau không
MBROverlaps(g1,g2): Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1 và
hình chữ nhật bao của g2 có chồng lên nhau không
MBRTouches(g1,g2): Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1 và
hình chữ nhật bao của g2 có tiếp xúc với nhau không
MBRWithin(g1,g2) : Trả về 1 hoặc 0 cho biết hình chữ nhật bao của g1 có
nằm trong hình chữ nhật bao của g2 không.
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0
0))');
mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0
0))');
mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
+--------------------+--------------------+
| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
+--------------------+--------------------+
| 1 | 0 |
Kết nối với MySQL trong .NET
Để thực hiện việc kết nối với MySQL trong .NET và thực hiện câu các truy
vấn ,ta có thể sử dụng công cụ MySQL-connector-net-1.0.4. được cung cấp
trên trang chủ của MySQL: www.mysql.com.
Sau khi cài đặt, ta sẽ có thư viện MySql.Data.dll và một file hướng dẫn sử
dụng.
Để sử dụng ta chỉ cần thêm thư viện vào Project thêm dòng khai báo sau vào
chương trình
PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS
170
using MySql.Data.MySqlClient;
Ví dụ thực hiện kết nối và truy vấn:
MySqlConnection conn = new
MySqlConnection(ConfigurationSettings.AppSettings.Get(
"server=localhost;user id=root; password=neik;
database=ogis_hcmc; pooling=false"));
conn.Open();
string sQuery = "Select ID From quan" ;
MySqlCommand myCommand = new MySqlCommand(sQuery,conn);
MySqlDataReader myReader;
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
string Name = myReader.GetString(0);
int ID = myReader.GetInt32(1);
}
myReader.Close();
conn.Close();
Để tạo 1 kết nối ta sử dụng lớp MySqlConnection
Để tạo 1 câu lệnh truy vấn ta sử dụng lớp MySqlConnection
Để lấy dữ liệu truy vấn được, ta sử dụng lớp MySqlDataReader.
Ngoài ra, còn nhiều lớp khác nữa, có thể tham khảo chi tiết trong file hướng
dẫn sử dụng.
TÀI LIỆU THAM KHẢO
171
TÀI LIỆU THAM KHẢO
[1] Agmet Sayar, OGC Compatible Geographical Information Systems Web
Services, Indiana University, 2005.
[2] Shuichi Takino, Two Technical Factors to Migrate IGS Into Web
Enviroment, GIS Research end Development Dept, 2003.
[3] Kris Kolodziej, OpenGIS Web Map Server Cookbook, ver 1.0.2, OGC
Document #03-050r1, 2004.
[4] Jeff de La Beaujardière, Web Map Service Implementation Specification, ver
1.1.1, OGC Document #01-068r3, 2002.
[5] Jeff de La Beaujardière, Web Map Service Implementation Specification –
Part 2: XML for Requests using HTTP POST, ver 1.1.1, OGC Document
#02-017r1, 2002.
[6] Panagiotis A.Vretanos, Web Feature Service Implementation Specification,
ver 1.0.0, OGC Document #02-058, 2002.
[7] Simon Cox, Paul Daisey, Ron Lake, Clemens Portele, Arlisss Whiteside,
OpenGIS Geography Markup Language (GML) Implementation
Specification, ver 3.00, OGC Document #02-023r4, 2003
[8] R.Allen Wyke, Sultan Rechman, Brad Leupen, XML Programming,
Microsoft Corporation, 2002.
[9] Mesbah Ahmed, Chris Garrett, Jeremy Faircloth, Chris Payne, ASP.Net Web
Developer’s Guide, Syngress Publishing, Inc, 2002.
[10] Bùi Quang Vinh, Tham luận Xây Dựng Hệ Thống Thông Tin Địa Lý Trong
Môi Trường Mã Nguồn Mở, Viện CNTT/ Trung tâm KHKT&CNQS/ Bộ
Quốc Phòng.
[11] OGC official web site http://www.opengeospatial.org/
[12] Webservices Technologies http://www.w3.org/2002/ws/
TÀI LIỆU THAM KHẢO
172
[13] Trang web cho download chương trình WMSViewer
http://www.wmsviewer.com/main.asp
[14] Các Forum về OpenGIS:
http://www.ogcnetwork.org/cgi-bin/discus/discus.pl
http://feature.opengeospatial.org/forumbb/
[15] Trang web cho phép thực hiện các request kiểu HTTP POST lên các server
http://www.onemap.org/pages/WFS.html
[16] OpenSource server Deegree http://deegree.sourceforge.net/
[17] OpenSource server GeoViewer
http://geoserver.sourceforge.net/html/index.php
[18] OpenSource server MapServer http://mapserver.gis.umn.edu/
[19] Trang chủ của CarbonTools www.thecarbonproject.com
[20] Trang chủ của MySQL www.mysql.com
[21] Các URL của các WFS Server:
http://regis.intergraph.com/wfs/dcmetro/request.asp?
http://www2.dmsolutions.ca/cgi-bin/mswfs_filter?
http://webservices.ionicsoft.com/unData/wfs/UN
http://www.cadcorpdev.co.uk/wfs/SisISAPI.dll
http://webservices.ionicsoft.com/worldData/wfs/WORLD
http://www.refractions.net:8080/geoserver/wfs
http://mapserv2.esrin.esa.it/ionicweb/wfs/OILSLICKS
http://www2.dmsolutions.ca/cgi-bin/mswfs_gmap
[22] Các URL của các WMS Server:
http://globe.digitalearth.gov/viz-bin/wmt.cgi?
http://www.cadcorpdev.co.uk/wms/SisISAPI.dll?
http://cgns.nrcan.gc.ca/wms/cubeserv.cgi
http://www2.dmsolutions.ca/cgi-bin/mswfs_gmap
http://www2.demis.nl/mapserver/request.asp