Chương 5. CarbonTools
5.2.2.3. Lớp CarbonTools.Core.WFS.HandlerWFS
Các thuộc tính
STT
Kiểu dữ liệu
Ý nghĩa
Data
CarbonTools.Core.Features.
Dữ liệu lấy được từ
DataFeatures
1
Tên thuộc tính
server sau khi thực
hiện request
2
Synchronous
CarbonTools.Core.WFS.Source
Thơng tin request
WFS
3
Source
cần gởi lên server
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à q trình
nhận dữ liệu khơng
đồng bộ được thực
hiện xong.
5
ProgressChang
EventHandler
ed
Đâ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.
98
Chương 5. CarbonTools
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)
{
99
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
Để 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
102
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
Chứa danh sách các Layer cần lấy về
ArrayList
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
1
Tên thuộc tính Kiểu dữ liệu
Ý nghĩa
Map
Chứa ảnh được server
Image
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
103
Chương 5. CarbonTools
Các thuộc tính
STT
2
Kiểu dữ liệu
Ý nghĩa
Source
CarbonTools.Core.
Chứa các thơng tin về request cần
WMS.SourceWMS
1
Tên thuộc tính
gởi lên server
CarbonTools.Core.
Chứa hình ảnh trả về
Data
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
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++)
{
104
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
Để 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ả.
105
Chương 5. CarbonTools
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ả.
106
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
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:
107
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
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
Kiểu dữ liệu
Ý nghĩa
geographicalshape
Kiểu Point (*), được lưu trữ
Là 1 điểm, cho biết tọa
theo định dạng riêng bên
độ của đối tượng trên
trong MySQL.
1
Tên cột
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
109
Chương 6. Cài đặt chương trình OpenGISServer
Bảng “duong”:
STT
Tên cột
1
geographicalshape
Kiểu dữ liệu
Ý nghĩa
Kiểu MultiLineString (*),
Cho biết các điểm tạo
được lưu trữ theo định dạng
nên con đường này.
riêng trong MySQL
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
7
DUONG_
Số thực
8
DUONG_ID
Số thực
9
ROAD_NAME
Chuỗi
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
Chiều dài con đường
Tên đường
Đị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
Kiểu dữ liệu
Ý nghĩa
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.
1
Tên cột
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ố ngun
Định danh của quận, là
khóa chính
Bảng 6.4.Bảng “quan”
Bảng “song”
STT
Kiểu dữ liệu
Ý nghĩa
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.
1
Tên cột
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ố ngun
Định danh của sơng, là
khóa chính
Bảng 6.5.Bảng “song”
111
Chương 6. Cài đặt chương trình OpenGISServer
Bảng “tuyensinh”
STT
Kiểu dữ liệu
Ý nghĩa
geographicalshape
Kiểu Point(*), được lưu trữ
Là 1 điểm cho biết tọa
theo định dạng riêng trong
độ của đối tượng trên
MySQL.
1
Tên cột
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”
112
Chương 6. Cài đặt chương trình OpenGISServer
Bảng ypagesit
STT
Tên cột
Kiểu dữ liệu
Ý nghĩa
1
geographicalshape
Kiểu Point(*), được lưu trữ
Là 1 điểm cho biết tọa
theo định dạng riêng trong
độ của công ty hoặc tổ
MySQL.
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.
113
Chương 6. Cài đặt chương trình OpenGISServer
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.
114
Chương 6. Cài đặt chương trình OpenGISServer
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" ?>
version="1.0.0"
service="WFS"
xmlns:cite=" />xmlns:ogc=" />
115