Chương 4. Bộ lọc (Filter)
<xsd:extension base="ogc:ComparisonOpsType">
<xsd:sequence>
<xsd:element ref="ogc:PropertyName"/>
<xsd:element ref="ogc:Literal"/>
</xsd:sequence>
type="xsd:string" use="required"/>
type="xsd:string" use="required"/>
use="required"/>
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"/>
80
Chương 4. Bộ lọc (Filter)
type="ogc:LowerBoundaryType"/>
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>
Ngồi các phép tốn so sánh chuẩn (=, >, <, >=, <=, <>), cịn có các phép tố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 khn 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ó.
81
Chương 4. Bộ lọc (Filter)
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 tốn AND sẽ có giá trị là TRUE nếu như tất cả các phép tốn kết hợp có giá trị
là TRUE. Phép tốn OR sẽ có giá trị là TRUE nếu như có ít nhất 1 phép tốn trong
số các phép tố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:
substitutionGroup="ogc:logicOps"/>
substitutionGroup="ogc:logicOps"/>
substitutionGroup="ogc:logicOps"/>
abstract="true"/>
<xsd:complexType name="LogicOpsType" abstract="true"/>
<xsd:complexType name="BinaryLogicOpType">
<xsd:complexContent>
<xsd:extension base="ogc:LogicOpsType">
maxOccurs="unbounded">
82
Chương 4. Bộ lọc (Filter)
<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>
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.
83
Chương 4. Bộ lọc (Filter)
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">
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 tốn này:
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
84
Chương 4. Bộ lọc (Filter)
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
type="ogc:BinaryOperatorType"
substitutionGroup="ogc:expression"/>
<xsd:complexType name="BinaryOperatorType">
<xsd:complexContent>
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
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 tố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 tố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 tố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.
85
Chương 4. Bộ lọc (Filter)
4.10.2.Mô tả:
Đoạn lược đồ XML dưới đây mô tả các hàm này:
type="ogc:FunctionType"
substitutionGroup="ogc:expression"/>
<xsd:complexType name="FunctionType">
<xsd:complexContent>
<xsd:extension base="ogc:ExpressionType">
<xsd:sequence>
minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
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.
86
Chương 4. Bộ lọc (Filter)
<xsd:element name="Filter_Capabilities">
<xsd:complexType>
<xsd:sequence>
type="ogc:Spatial_CapabilitiesType"/>
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 tố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>
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"/>
87
Chương 4. Bộ lọc (Filter)
<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"/>
type="ogc:Comparison_OperatorsType"/>
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.
88
Chương 4. Bộ lọc (Filter)
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 />
89
Chương 4. Bộ lọc (Filter)
</Comparison_Operators>
<Arithmetic_Operators>
<Simple_Arithmetic />
<Functions>
<Function_Names>
nArgs="1">MIN</FunctionName>
nArgs="1">MAX</FunctionName>
nArgs="1">SIN</FunctionName>
nArgs="1">COS</FunctionName>
</Function_Names>
</Functions>
</Arithmetic_Operators>
</Scalar_Capabilities>
</Filter_Capabilities>
90
Chương 5. CarbonTools
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ỉ />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.
91
Chương 5. CarbonTools
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
1
Tên thuộc tính
Kiểu dữ liệu
Ý nghĩa
Address
System.Uri
Chứa địa chỉ của server nơi mà
request được gởi đến
2
ServiceType
CarbonTools.Core.Ba Xác định loại service cần lấy
se.OGCServiceTypes
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
Chứa thông tin về việc xác
Credential
thực người dùng trên server.
Bảng 5.1. Các thuộc tính của SourceOGCCapabilities
92
Chương 5. CarbonTools
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
1
Tên thuộc tính
Kiểu dữ liệu
Ý nghĩa
ServiceType
CarbonTools.Co Xác định loại service cần lấy thơng
re.Base.OGCSer tin là WFS hay WMS
viceTypes
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
Chứa các thông tin về các request
llection
đượ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
Danh sách các loại Feature có trên
ore.OGCCapabi
server
lities.LayerItem
Bảng 5.2. Các thuộc tính quan trọng của DataOGCCapabilities
93
Chương 5. CarbonTools
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
Ý nghĩa
Source
CarbonTools.Core.OGC
Chứa các thông tin của
request cần gởi lên
Capabilities
server
CarbonTools.Core.OGC
Chứa kết quả trả về
Capabilities.DataOGCCa
2
Kiểu dữ liệu
Capabilities.SourceOGC
1
Tên thuộc tính
sau khi gởi request
Data
pabilities
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à q trình nhận dữ
liệu khơng đồng bộ
được thực hiện xong.
5
ProgressChange
EventHandler
d
Đâ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
94
Chương 5. CarbonTools
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ì q 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)
{
95
Chương 5. CarbonTools
//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 hồ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
96
Chương 5. CarbonTools
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
1
Tên thuộc tính
Kiểu dữ liệu
Ý nghĩa
BBox
CarbonTools.Core.BoundingBox
Hình chữ nhật
bao của các
Feature lấy
được
2
Features
CarbonTools.Core.Features.Item
Danh sách các
Collection
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
97