Tải bản đầy đủ (.pdf) (18 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (538.86 KB, 18 trang )

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




×