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: