Chương 5. CarbonTools

5.2.2.3. Lớp CarbonTools.Core.WFS.HandlerWFS

(cid:153) 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. Dữ liệu lấy được từ

DataFeatures server sau khi thực

hiện request

2 Source CarbonTools.Core.WFS.Source Thông tin request

WFS 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.

Đây là 1 delegate, có 5 ProgressChang EventHandler

tác dụng thông báo ed

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

(cid:153) Phương thức GetFeature(): Gởi request lên server với các thông tin chứa

98

trong Source và lấy kết quả về, lưu trong Data.

Chương 5. CarbonTools

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

{

99

(cid:153) Ví dụ thực hiện GetFeature request

Chương 5. CarbonTools

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

100

Chương 5. CarbonTools

}

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

101

Chương 5. CarbonTools

{

}

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

(cid:153) Để 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

(cid:153) Lớp này chứa các thông tin cần thiết để thực hiện 1 GetMap request.

102

(cid:153) Các thuộc tính của lớp

Chương 5. CarbonTools

STT Tên thuộc

Kiểu dữ liệu Ý nghĩa

tính

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. Vùng hình chữ nhật cần lấy hình ảnh

BoundingBox

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

(cid:153) Lớp này chứa hình ảnh được server gởi về.

(cid:153) 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

(cid:153) 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à

103

1 ảnh

Chương 5. CarbonTools

(cid:153) Các thuộc tính

STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa

1 Source CarbonTools.Core. Chứa các thông tin về request cần

WMS.SourceWMS gởi lên server

2 Data CarbonTools.Core. Chứa hình ảnh trả về

Base.DataRaster

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

(cid:153) 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.

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

{

104

5.3.4. Vi dụ thực hiện GetMap request

Chương 5. CarbonTools

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

(cid:153) Để 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.

(cid:153) 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

105

tự đọc hiểu tài liệu Xml này để lấy kết quả.

Chương 5. CarbonTools

(cid:153) 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ộ.

XmlDocument xml = HandlerWFS.GetFeatureSchema();

(cid:153) Thực hiện gởi DescribeFeatureType request bằng hàm

(cid:153) Sau khi hàm này thực hiện xong thì lệnh kế tiếp mới được thực hiện.

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

(cid:153) Ví dụ thực hiện DescribeFeatureType request

(cid:153) 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

HandlerWFS.SendXml(XmlDocument sentDocument, out XmlDocument

receivedDocument)

hàm:

(cid:131) 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.

(cid:131) Ta phải tự tạo sentDocument để gởi và phải tự đọc receivedDocument trả

106

về để lấy kết quả.

Chương 6. Cài đặt chương trình OpenGISServer

Chương 6. Cài đặt chương trình OpenGIS Server

6.1. Giới thiệu

(cid:153) Server được cài đặt bằng ASP.NET hỗ trợ các loại Request sau:

(cid:131) Các Request của Web Feature Service:

• GetCapabilities

• GetFeature

• DescribeFeatureType

• Transaction

• LockFeature

(cid:131) Các Request của Web Map Service:

• GetCapabilities

• GetMap

6.2. Tổ chức và lưu trữ dữ liệu

(cid:153) 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.

(cid:153) Dữ liệu trên Server là dữ liệu về địa lý thành phố Hồ Chí Minh, gồm các

107

bảng sau:

Chương 6. Cài đặt chương trình OpenGISServer

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

108

Chương 6. Cài đặt chương trình OpenGISServer

(cid:153) Mô tả chi tiết về các bảng trong cơ sở dữ liệu

(cid:131) 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

Là 1 điểm, cho biết tọa 1 geographicalshape Kiểu Point (*), được lưu trữ

độ của đối tượng trên theo định dạng riêng bên

bản đồ trong MySQL.

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

109

Chương 6. Cài đặt chương trình OpenGISServer

(cid:131) Bảng “duong”:

STT Tên cột Kiểu dữ liệu Ý nghĩa

Cho biết các điểm tạo 1 geographicalshape Kiểu MultiLineString (*),

nên con đường này. được lưu trữ theo định dạng

riêng trong MySQL

FNODE_ 2 Số thực

TNODE_ 3 Số thực

LPOLY_ 4 Số thực

RPOLY_ 5 Số thực

Chiều dài con đường LENGTH 6 Số thực

DUONG_ 7 Số thực

DUONG_ID 8 Số thực

ROAD_NAME Chuỗi Tên đường 9

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”

110

Chương 6. Cài đặt chương trình OpenGISServer

• Bảng “quan”

STT Tên cột Kiểu dữ liệu Ý nghĩa

1 geographicalshape Kiểu Polygon (*), được lưu Các điểm tạo nên

trữ theo định dạng riêng đường viền xung quanh

trong MySQL. phạm vi của quận.

DIENTICH Số thực Diện tích của quận 2

CHUVI Số thực Chu vi của quận 3

TENQUAN Chuỗi Tên quận 4

ID Số nguyên Định danh của quận, là 5

khóa chính

Bảng 6.4.Bảng “quan”

(cid:131) Bảng “song”

STT Tên cột Kiểu dữ liệu Ý nghĩa

Các điểm tạo nên 1 geographicalshape Kiểu Polygon (*), được lưu

đường viền xung quanh trữ theo định dạng riêng

phạm vi của sông trong MySQL.

DIENTICH Số thực Diện tích của sông 2

CHUVI Số thực Chu vi của sông 3

TENSONG Chuỗi Tên sông 4

ID Số nguyên Định danh của sông, là 5

khóa chính

Bảng 6.5.Bảng “song”

111

Chương 6. Cài đặt chương trình OpenGISServer

(cid:131) Bảng “tuyensinh”

STT Tên cột Kiểu dữ liệu Ý nghĩa

Là 1 điểm cho biết tọa 1 geographicalshape Kiểu Point(*), được lưu trữ

độ của đối tượng trên theo định dạng riêng trong

bản đồ MySQL.

TEN Chuỗi 2 Tên trường

THUOC Chuỗi 3 Quận mà trường này

thuộc về

DIACHI Chuỗi 4 Địa chỉ của trường.

DIENTHOAI Chuỗi 5 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”

112

Chương 6. Cài đặt chương trình OpenGISServer

(cid:131) Bảng ypagesit

STT Tên cột Kiểu dữ liệu Ý nghĩa

Là 1 điểm cho biết tọa 1 geographicalshape Kiểu Point(*), được lưu trữ

độ của công ty hoặc tổ theo định dạng riêng trong

chức trên thành phố MySQL.

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”

(cid:153) 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,

113

Song, TruongCap3, TruongDaiHoc, TuyenSinh, UBNDQuan, YPageSit.

Chương 6. Cài đặt chương trình OpenGISServer

(cid:131) 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”.

(cid:131) 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:

(cid:153) Để 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

HttpContext.Current.Request[Tên tham số]

sau:

(cid:131) Đối với chuỗi URL:

http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVICE

=WFS&VERSION=1.0.0

(cid:153) Ví dụ:

string s = HttpContext.Current.Request["SERVICE"];

Để lấy được tham số SERVICE ta viết như sau:

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

(cid:153) Đố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.

(cid:153) Trong .NET, phần dữ liệu do client gởi lên được lưu trong thuộc tính

114

InputStream của lớp Request, đây là 1 Stream.

Chương 6. Cài đặt chương trình OpenGISServer

HttpContext.Current.Request.InputStream.

(cid:153) Ví dụ dưới đây lấy dữ liệu do client gởi lên, sử dụng lớp StreamReader để

Stream stream = Request.InputStream;

StreamReader read = new StreamReader(stream);

string sPostContent = read.ReadToEnd();

đọc dữ liệu từ Stream và chuyển từ Stream sang text để xử lí:

6.3.3. Trả kết quả về cho Client

(cid:153) Để trả chuỗi kết quả về cho client, ta dùng hàm Response.Write(s).

(cid:153) 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(sResponse);

Response.End();

Response.Write(s).

6.4. Đọc dữ liệu từ chuỗi XML

(cid:153) Để đọ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

version="1.0.0"

service="WFS"

xmlns:cite="http://www.opengeospatial.net/cite"

xmlns:ogc="http://www.opengis.net/ogc"

115

(cid:153) Xét chuỗi sRequestXml có nội dung như sau: