Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

183
i LI CM ƠN Chúng em xin chân thành cám ơn Khoa Công NghThông Tin, trường Đại Hc Khoa Hc TNhiên TpHCM đã to điu kin tt cho chúng em thc hin đề tài lun văn tt nghip này. Chúng em xin chân thành cám ơn Thy Lê Thy Anh đã tn tình hướng dn, chbo chúng em trong sut thi gian thc hin đề tài. Chúng em xin chân thành cám ơn quý Thy Cô trong Khoa đã tn tình ging dy, trang bcho chúng em nhng kiến thc quý báu trong nhng năm hc va qua. Chúng con xin nói lên lòng biết ơn sâu sc đối vi Ông Bà, Cha Mđã chăm sóc, nuôi dy chúng con thành người. Xin chân thành cám ơn các anh chvà bn bè đã ng h, giúp đỡ động viên chúng em trong thi gian hc tp và nghiên cu. Mc dù chúng em đã cgng hoàn thành lun văn trong phm vi và khnăng cho phép nhưng chc chn skhông tránh khi nhng thiếu sót. Chúng em kính mong nhn được scm thông và tn tình chbo ca quý Thy Cô và các bn. Nhóm sinh viên thc hin Nguyn Trung Kiên – Nguyn Nguyên Bo Tháng 07/ 2005

Transcript of Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

Page 1: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 2: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 3: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 4: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 5: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 6: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 7: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 8: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 9: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 10: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 11: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 12: 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 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

Page 13: 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 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.

Page 14: 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 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.

Page 15: 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 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ý đó.

Page 16: 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 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.

Page 17: 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 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)

Page 18: 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 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.

Page 19: 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 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ị đó (“,,”)

Page 20: 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 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.

Page 21: 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 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,...

Page 22: 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 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.

Page 23: 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 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,…

Page 24: 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 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ệ.

Page 25: 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 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”.

Page 26: 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 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

Page 27: 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 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.

Page 28: 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 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

Page 29: 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 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.

Page 30: 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 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

Page 31: 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 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

Page 32: 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 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

Page 33: 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 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.

Page 34: 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 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

Page 35: 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 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.

Page 36: 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 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.

Page 37: 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 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ụ.

Page 38: 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 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

Page 39: 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 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ệ.

Page 40: 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 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ố

Page 41: 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 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.

Page 42: 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 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

Page 43: 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 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.

Page 44: 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 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.

Page 45: 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 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.

Page 46: 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 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).

Page 47: 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 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.

Page 48: 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 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

Page 49: 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 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>

Page 50: 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 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.

Page 51: 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 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

Page 52: 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 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.

Page 53: 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 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>

Page 54: 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 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">

Page 55: 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 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>

Page 56: 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 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>

Page 57: 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 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.

Page 58: 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 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.

Page 59: 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 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

Page 60: 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 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”.

Page 61: 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 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"

Page 62: 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 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>

Page 63: 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 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&amp;typeName=ns01:TREESA_1M"/>

<import namespace=http://www.server02.com/ns02

schemaLocation="http://www.yourserver.com/wfs.cgi?

request=DescribeFeatureType&amp;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.

Page 64: 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 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"/>

Page 65: 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 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.

Page 66: 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 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>

Page 67: 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 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.

Page 68: 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 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>

Page 69: 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 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"/>

Page 70: 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 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.

Page 71: 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 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>

Page 72: 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 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"/>

Page 73: 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 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.

Page 74: 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 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

Page 75: 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 3. Web Feature Service (WFS)

64

http://www.someserver.com/wfs/cwwfs.cgi?

request=describefeaturetype&amp;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>

Page 76: 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 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"

Page 77: 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 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>

Page 78: 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 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>

Page 79: 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 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"

Page 80: 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 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"

Page 81: 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 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"/>

Page 82: 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 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>

Page 83: 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 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”.

Page 84: 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 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ệ.

Page 85: 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 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>

Page 86: 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 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"

Page 87: 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 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>

Page 88: 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 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.

Page 89: 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 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"/>

Page 90: 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 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>

Page 91: 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 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"/>

Page 92: 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 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ó.

Page 93: 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 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">

Page 94: 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 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.

Page 95: 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 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"/>

Page 96: 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 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.

Page 97: 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 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.

Page 98: 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 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"/>

Page 99: 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 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.

Page 100: 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 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 />

Page 101: 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 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>

Page 102: 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 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.

Page 103: 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 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

Page 104: 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 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

Page 105: 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 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

Page 106: 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 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)

{

Page 107: 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 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

Page 108: 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 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

Page 109: 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 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.

Page 110: 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 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)

{

Page 111: 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 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)

Page 112: 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 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)

Page 113: 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 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

Page 114: 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 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

Page 115: 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 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++)

{

Page 116: 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 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ả.

Page 117: 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 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ả.

Page 118: 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 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:

Page 119: 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 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

Page 120: 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 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

Page 121: 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 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”

Page 122: 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 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”

Page 123: 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 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”

Page 124: 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 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.

Page 125: 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 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.

Page 126: 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 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"

Page 127: 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 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”.

Page 128: 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 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”.

Page 129: 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 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.

Page 130: 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 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

……

Page 131: 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 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.

Page 132: 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 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.

Page 133: 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 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/

Page 134: 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 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.

Page 135: 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 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.

Page 136: 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 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

Page 137: 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 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.

Page 138: 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 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

Page 139: 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 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

Page 140: 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 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

Page 141: 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 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

Page 142: 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 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

Page 143: 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 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

Page 144: 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 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

Page 145: 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 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

Page 146: 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 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);

Page 147: 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 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:

Page 148: 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 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();

Page 149: 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 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á

Page 150: 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 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.

Page 151: 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 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]);

Page 152: 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 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;

Page 153: 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 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

Page 154: 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 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;

}

}

Page 155: 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 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.

Page 156: 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 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

Page 157: 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 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 đồ

Page 158: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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ý,…

Page 159: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 160: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 161: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 162: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 163: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 164: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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))

Page 165: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 166: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 167: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 168: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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)

Page 169: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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));

Page 170: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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) |

Page 171: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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) |

+--------------------------+

Page 172: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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))

Page 173: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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)'));

+--------------------------------------+

Page 174: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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));

Page 175: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 176: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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))) |

+-------------------------------------------+

Page 177: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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)))';

Page 178: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 179: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 180: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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

Page 181: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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.

Page 182: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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/

Page 183: Web cho ứng dụng gis và xây dựng ứng dụng minh họa khai thác dịch vụ

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