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ụ - 9 pps

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 (761.63 KB, 18 trang )

Chương 7. Cài đặt các chương trình client

7.1.1.2.8. Màn hình minh họa thực hiện request WMS – GetMap

Hình 7.8.Màn hình minh họa thực hiện request WMS – GetMap

134


Chương 7. Cài đặt các chương trình client

7.1.2. Gởi request cho server
Sau khi xây dựng xong chuỗi request bằng Xml, ta cần phải gởi chuỗi
request này lên cho server.
Trong .NET, ta có thể thực hiện việc gởi 1 request lên cho server theo 2 cách
là: đồng bộ và bất đồng bộ
7.1.2.1. Thực hiện việc gởi request bằng phương pháp đồng bộ
Đối với phương pháp đồng bộ, sau khi thực hiện 1 request thì client phải chờ
cho đến khi nhận xong response từ server, nó mới có thể thực hiện tiếp các
tác vụ khác. Do đó, trong lúc nhận response từ server thì client khơng thể
làm được việc gì khác.
Để gởi request bằng phương pháp đồng bộ, ta sử dụng 2 lớp là
HttpWebRequest và HttpWebResponse.
7.1.2.1.1. Gởi request bằng phương pháp dồng bộ với giao thức HTTP GET
Trong trường hợp này chuỗi URL có thể chứa thêm các thơng tin khác.
Ví dụ dưới đây gởi request đến 1 server có chuỗi URL là
string sURL =
“http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVIC
E=WFS&
VERSION=1.0.0&REQUEST=GetFeature&TypeName=buudien,quan,duong”


Chuỗi URL này có thêm các tham số là SERVICE, VERSION,
REQUEST, TypeName.
Tạo đối tượng HttpWebRequest và gởi chuỗi URL
System.Net.HttpWebRequest httpRequest =
System.Net.HttpWebRequest)System.Net.WebRequest.Create(sURL);

135


Chương 7. Cài đặt các chương trình client

Nhận kết quả trả về dưới dạng 1 stream.
System.Net.WebResponse httpResponse =
httpRequest.GetResponse();
System.IO.Stream stream = httpResponse.GetResponseStream();

Sau khi nhận dịng dữ liệu này, ta có thể lấy dữ liệu trong dòng dữ liệu
dưới dạng chuỗi hoặc lưu dòng dữ liệu xuống file.
StreamReader reader = new StreamReader(stream);

Chuyển kết quả sang 1 chuỗi.
string response = reader.ReadToEnd();

Lưu dòng dữ liệu xuống file.
FileStream file = new
FileStream("c:\\xml.xml",FileMode.Create,FileAccess.Write);
int ch;
do{
ch = stream.ReadByte();
if (ch!= -1)

file.WriteByte((byte)ch);
}while (ch != -1);
file.Close();

7.1.2.1.2. Gởi request bằng phương pháp đồng bộ với giao thức HTTP POST
Trong trường hợp này nội dung cần gởi lên server được lưu trong phần body
của request.
Ví dụ dưới đây gởi 1 request dưới dạng POST lên server.
Server có địa chỉ là
sAddress=http://localhost/OpenGISServer/VNesOpenGISServer.aspx

Nội dung cần gởi lên server này được lưu trong chuỗi sPostContent.
Khi đó việc gởi request và nhận response được thực hiện như sau:

136


Chương 7. Cài đặt các chương trình client

• Tạo đối tượng HttpWebRequest và ghi nội dung của chuỗi sPostContent
vào phần body của request.
System.Net.HttpWebRequest myHttpWebRequest =
(System.Net.HttpWebRequest)System.Net.WebRequest.Creat
e(sAddress);
System.Text.ASCIIEncoding encoding=new
System.Text.ASCIIEncoding();
byte[]

byte1=encoding.GetBytes(sPostContent);


//Chọn loại ContentType của dữ liệu cần gởi lên
myHttpWebRequest.ContentType="application/x-www-formurlencoded";
// Xác định chiều dài của chuỗi cần gởi lên
myHttpWebRequest.ContentLength=sPostContent.Text.
Length;
myHttpWebRequest.Method = "POST";
Stream newStream =

myHttpWebRequest.GetRequestStream();

newStream.Write(byte1,0,byte1.Length);
newStream.Close();
System.Net.WebResponse httpResponse =
myHttpWebRequest.GetResponse();
System.IO.Stream stream =
httpResponse.GetResponseStream();
StreamReader reader = new StreamReader(stream);
//Chuyển kết quả sang 1 chuỗi.
string response = reader.ReadToEnd();
stream.Close();
httpResponse.Close();
//Lấy kết quả trả về.
System.Net.WebResponse httpResponse =
httpRequest.GetResponse();
System.IO.Stream stream =
httpResponse.GetResponseStream();

137



Chương 7. Cài đặt các chương trình client

7.1.2.2. Gởi request bằng phương pháp không đồng bộ
Khi gởi 1 request bằng phương pháp khơng đồng bộ, ta có thể tiếp tục thực
hiện các tác vụ khác trong lúc nhận kết quả trả về bởi vì tác vụ nhận kết quả
từ server sẽ được thực hiện trong 1 tiểu trình khác.
7.1.2.2.1. Gởi request bằng phương pháp không đồng bộ với giao thức HTTP GET
Ví dụ dưới đây minh họa việc gởi request đến server bằng phương pháp
không đồng bộ với giao thức HTTP GET.
Chương trình dưới đây là 1 chương trình dưới dạng console, có chức năng
nhận 1 chuỗi URI từ dịng lệnh, yêu cầu tài nguyên từ địa chỉ đó, in dữ liệu ra
màn hình sau khi nó nhận xong dữ liệu từ server.
Chương trình định nghĩa 2 lớp là lớp RequestState, có tác dụng chuyển dữ
liệu qua lại giữa các các lời gọi không đồng bộ và lớp ClientGetAsync dùng
để tạo 1 request bằng phương pháp khơng đồng bộ


Lớp RequestState lưu trạng thái của request trong suốt quá trình gọi
các hàm để phục vụ request. Nó chứa 1 đối tượng WebRequest và 1 đối
tượng Stream, đối tượng WebRequest chứa request hiện tại đến tài
nguyên trên server và đối tượng Stream chứa dòng dữ liệu nhận được từ
response của server, và 1 đối tuợng StreamBuilder chứa toàn bộ chuỗi
response. Một đối tượng RequestState được dùng làm tham số state khi
hàm

AsyncCallback

được

đăng




với

hàmWebRequest.BeginGetResponse.
• Lớp ClientGetAsync chứa các hàm và các thuộc tính dưới đây:
o Thuộc tính allDone chứa 1 đối tượng của lớp ManualResetEvent,
dùng để báo hiệu khi request hoàn thành.
o Hàm Main() đọc thơng tin từ dịng lệnh và tạo 1 request đến 1 tài
nguyên trên internet. Nó tạo 1 đối tuợng WebRequest wreq và đối
tượng RequestState rs, gọi hàm BeginGetResponse để bắt đầu quá

138


Chương 7. Cài đặt các chương trình client

trình thực hiện request. Sau đó nó gọi hàm allDone.WaitOne() để cho
chương trình sẽ không kết thúc khi vẫn chưa nhận xong response. Sau
khi đọc được response, 1 hàm này xuất nội dung trong response ra
màn hình và chương trình kết thúc.
o Hàm RespCallBack() dùng để cài đặt 1 hàm callback không đồng
bộ đến tài nguyên trên internet. Nó tạo ra 1 đối tượng WebResponse
dùng để chứa response từ server, lấy dòng dữ liệu từ response này và
bắt đầu quá trình đọc dữ liệu từ dịng dữ liệu 1 cách khơng đồng bộ.
o Hàm ReadCallBack() dùng để cài đặt 1 hàm callback không đồng
bộ, hàm callback này có tác dụng đọc dữ liệu từ dịng dữ liệu của
chuỗi response. Nó chuyển dữ liệu nhận được tài ngun internet và
gán nó cho thuộc tính ResponseData của đối tượng RequestState,

sau đó nó lại bắt đầu tiếp thao tác đọc dữ liệu khơng đồng bộ trong
dịng dữ liệu của response từ server cho đến khi không cịn dữ liệu trả
về. Sau khi tồn bộ dữ liệu đã được đọc xong, hàm ReadCallBack()
đóng dịng dữ liệu của response lại và gọi hàm allDone.Set() để chỉ ra
rằng toàn bộ dữ liệu từ server trả về đã được ghi vào ResponseData.
Chú ý: Một điều đáng lưu ý là tất cả các dịng dữ liệu giữa client và mạng
bên ngồi phải được đóng lại. Nếu ta khơng đóng các dịng dữ liệu của các
request và các response, chương trình của ta sẽ khơng cịn kết nối nào đến
server nữa và không thể thực hiện tiếp request nào.
using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO;
// Lớp RequestState dùng để chuyển dữ liệu qua lại giữa các
lời gọi hàm.

139


Chương 7. Cài đặt các chương trình client

public class RequestState
{
const int BufferSize = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public WebRequest Request;
public Stream ResponseStream;
//Tạo bộ giải mã tương ứng với loại mã hóa

public Decoder StreamDecode = Encoding.UTF8.GetDecoder();
public RequestState()
{
BufferRead = new byte[BufferSize];
RequestData = new StringBuilder(String.Empty);
Request = null;
ResponseStream = null;
}
}
// Lớp ClientGetAsync thực hiện 1 request không đồng bộ
class ClientGetAsync
{
public static ManualResetEvent allDone = new
ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
public static void Main(string[] args)
{
if (args.Length < 1)
{
showusage();
return;
}
// Lấy chuỗi URI từ dòng lệnh
Uri httpSite = new Uri(args[0]);

140


Chương 7. Cài đặt các chương trình client


// Tạo đối tượng dùng để gởi request
WebRequest wreq = WebRequest.Create(httpSite);
// Tạo đối tượng state
RequestState rs = new RequestState();
// Gán request vào state để cho nó có thể được
chuyển đi đến các hàm khác
rs.Request = wreq;
// Thực hiện 1 request không đồng bộ
IAsyncResult r = (IAsyncResult)
wreq.BeginGetResponse(new
AsyncCallback(RespCallback), rs);
// Chờ cho đến khi lớp ManualResetEvent được
//thiết lập sao cho ứng dụng sẽ không dừng lại
//cho đến khi hàm callback được gọi
allDone.WaitOne();
Console.WriteLine(rs.RequestData.ToString());
}
public static void showusage() {
Console.WriteLine("Nhận chuỗi URL");
Console.WriteLine("\r\nDùng cho:");
Console.WriteLine("

ClientGetAsync URL");

Console.WriteLine("

Ví dụ:");

Console.WriteLine(" ClientGetAsync
/>}

private static void RespCallback(IAsyncResult ar)
{
//Lấy đối tượng RequestState từ kết quả trả về
//của lời gọi request không đồng bộ.
RequestState rs = (RequestState) ar.AsyncState;
//Lấy đối tượng WebRequest từ đối tượng RequestState
WebRequest req = rs.Request;

141


Chương 7. Cài đặt các chương trình client

//Gọi hàm EndGetResponse, hàm này tạo ra 1 đối
//tượng WebResponse từ request được gởi ở trên
WebResponse resp = req.EndGetResponse(ar);
//Bắt đầu đọc dữ liệu từ dòng dữ liệu trả về
Stream ResponseStream=resp.GetResponseStream();
// Lưu dòng dữ liệu trả về trong RequestState để đọc
//dòng dữ liệu này 1 cách không đồng bộ
rs.ResponseStream = ResponseStream;
//Gởi tham số rs.BufferReader cho hàm BeginRead.
//Đọc dữ liệu vào rs.BufferRead
IAsyncResult iarRead =
ResponseStream.BeginRead(rs.BufferRead, 0,
BUFFER_SIZE, new AsyncCallback(ReadCallBack),rs);
}
private static void ReadCallBack(IAsyncResult
asyncResult)
{

// Lấy đối tượng RequestState từ đối tượng AsyncResult
RequestState rs =

RequestState)asyncResult.AsyncState;

// Lấy ResponseStream khởi tạo trong hàm RespCallback
Stream responseStream = rs.ResponseStream;
// Đọc rs.BufferRead để kiểm tra xem nó có cịn
//dữ liệu khơng
int read = responseStream.EndRead( asyncResult);
if (read > 0)
{
// Tạo 1 mảng Char để chuyển sang Unicode
Char[] charBuffer = new Char[BUFFER_SIZE];
//Chuyển từ dòng dữ liệu kiểu byte sang mảng
Char và sau đó sang String
// Biến len chứa số kí tự được chuyển sang Unicode

142


Chương 7. Cài đặt các chương trình client

int len = rs.StreamDecode.GetChars(
rs.BufferRead, 0,read, charBuffer, 0);
String str = new String(charBuffer, 0, len);
// Gắn phần dữ liệu vừa đọc được vào đối
//tượng RequestData nằm trong RequestState
rs.RequestData.Append(
Encoding.ASCII.GetString(rs.BufferRead, 0, read));

// Tiếp tục đọc dữ liệu đến khi hàm
responseStream.EndRead trả về -1
IAsyncResult ar = responseStream.BeginRead(
rs.BufferRead, 0, BUFFER_SIZE,
new AsyncCallback(ReadCallBack), rs);
}
else
{
if(rs.RequestData.Length>0)
{
//Hiển thị dữ liệu ra màn hình
string strContent;
strContent = rs.RequestData.ToString();
}
// Đóng dịng dữ liệu trả về
responseStream.Close();
//Thiết lập ManualResetEvent để cho tiểu
chính có thể đóng lại
}
return;
}
}

143

trình


Chương 7. Cài đặt các chương trình client


7.2. Cài đặt chương trình OpenGisClientApplication
7.2.1. Tính năng
Theo như trình bày ở trên thì chương trình OpenGISClientDemo có chức năng
chính là minh họa cách thực hiện các request của WMS và WFS chứ khơng phải 1
ứng dụng GIS cụ thể.
Chương trình OpenGISClientApplication là 1 ứng dụng GIS, ứng dụng này sử
dụng các request của WMS để truy vấn thông tin địa lý trên các server hỗ trợ WMS.
Ứng dụng giúp người dùng hiển thị các bản đồ do các server cung cấp, cho phép
thực hiện các chức năng phóng to, thu nhỏ, di chuyển…. và hỗ trợ lấy thông tin của
1 điểm trên bản đồ đối với các server có hỗ trợ request GetFeatureInfo.

144


Chương 7. Cài đặt các chương trình client

7.2.2. Màn hình giao diện

Hình 7.9.Màn hình giao diện chương trình OpenGISClientApplication

145


Chương 7. Cài đặt các chương trình client

Có thể lấy thơng tin của một điểm trên bản đồ:

Hình 7.10.Màn hình lấy thông tin một điểm trên bản đồ

146



Chương8. Tổng kết

Chương 8.

Tổng kết

8.1. Kết quả đạt được
Sau hơn sáu tháng tiến hành nghiên cứu và triển khai đề tài luận văn “Tìm hiểu
về dịch vụ web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác
dịch vụ” chúng em đã gặp khơng ít những khó khăn song đã đạt được những kết
quả nhất định theo những mục tiêu đề ra ban đầu của đề tài.
Cụ thể, những kết quả đó là nghiên cứu thành cơng và tiến hành triển khai các
dịch vụ web theo hai chuẩn WMS và WFS do OGC đưa ra. Chương trình
OpenGISServer hỗ trợ đầy đủ các giao tác trong hai dịch vụ này, điều mà không
phải các server hỗ trợ GIS nào cũng được thực hiện hoàn chỉnh. Đồng thời xây
dựng thành công hai ứng dụng minh họa khai thác dịch vụ WMS và WFS. Trong
đó, chương trình OpenGISClientDemo đã minh họa đầy đủ các giao tác của hai dịch
vụ này. Cịn chương trình OpenGISClientApplication được phát triển trên mơi
trường WinForm đã thực hiện được các chức năng hiển thị bản đồ và truy xuất các
thong tin trên bản đồ nhằm minh họa cho việc khai thác dịch vụ WMS.
Do thời gian hạn chế nên việc xây dựng các ứng dụng minh họa vẫn chưa được
phong phú và có quy mơ lớn. Song cũng đã đáp ứng được mục tiêu đặt ra ban đầu
của đề tài.

8.2. Hướng phát triển
Trong tương lai, chúng em dự kiến sẽ hồn thiện chương trình OpenGISServer
để có thể hỗ trợ các dịch vụ trên nhiều nguồn dữ liệu khác nhau, đồng thời tận dụng
khả năng khai thác các dịch vụ khác để chương trình ngày càng được mở rộng về

quy mô.
Đồng thời, phát triển thêm một số sản phẩm GIS mang ý nghĩa thực tiễn hơn, và
các sản phẩm này khai thác các dịch vụ do OpenGISServer hỗ trợ. Chẳng hạn như
các sản phẩm về tra cứu thông tin bản đồ trực tuyến, từ điển địa lý,…

147


PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS

PHỤ LỤC - MySQL với phần mở
rộng hỗ trợ cho OpenGIS
MySQL cài đặt các kiểu dữ liệu địa lý theo các đặc tả của tổ chức OGC. Các
kiểu dữ liệu này được cài đặt trong MySQL thành các lớp được tổ chức như
sau:


Geometry (Lớp trừu tượng)
o

Point (Lớp cụ thể)

o

Curve (Lớp trừu tượng)


LineString (Lớp cụ thể)
o
o


o

LinearRing

Surface (Lớp trừu tượng)


o

Line

Polygon (Lớp cụ thể)

GeometryCollection (Lớp cụ thể)


MultiPoint (Lớp cụ thể)



MultiCurve (Lớp trừu tượng)
o



MultiLineString (Lớp cụ thể)

MultiSurface (Lớp trừu tượng)
o


MultiPolygon (Lớp cụ thể)

Ta không thể tạo đối tượng cho các lớp trừu tượng mà chỉ có thể tạo đối
tượng cho các lớp cụ thể.
Mô tả cụ thể về các lớp này
Lớp Geometry
Lớp này khơng có đối tượng thể hiện cụ thể, các thuộc tính của lớp này
được áp dụng cho các đối tượng của các lớp kế thừa từ lớp này.

148


PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS

Các thuộc tính của Geometry:
• Loại (type): Mỗi đối tượng thuộc về 1 trong các loại trong cấu trúc phân
cấp như trên.
• SRID (Spatial Reference Identifier): Giá trị này xác định hệ tọa độ
không gian được dùng trong việc định nghĩa các điểm của đối tượng
này. Trong MySQL thì giá trị này chỉ là 1 con số nguyên.
• Các điểm (coordinates) của đối tượng trong hệ tọa độ SRID nói trên, là
1 con số 8 byte. Một đối tượng khơng rỗng sẽ có ít nhất 1 cặp điểm
(X,Y) . Các đối tượng rỗng không chứa điểm nào. Hệ thống điểm có
liên quan với SRID. Chẳng hạn trong các hệ thống điểm khác nhau thì
khoảng cách giữa 2 đối tượng có thể khác nhau khi mà các điểm của các
đối tượng này giống nhau.
• Interior, boundary và exterior: Mỗi đối tượng sẽ chiếm 1 vị trí nào đó
trong khơng gian, thuộc tính exterior của đối tượng dùng để chỉ vùng
khơng gian khơng bị chiếm giữ bởi đối tượng. Thuộc tính interior là

vùng không gian bị chiếm giữ bởi đối tượng còn boundary là phần giao
nhau giữa interior và exterior.
MBR (Minimum Bounding Rectangle): đây là đối tượng bao bên ngoài đối
tượng này, được tạo thành bởi các điểm cực đại và cực tiểu của đối tượng
((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))

• Thuộc tính simple hoặc non-simple
• Thuộc tính close hoặc not-close: cho biết các điểm của đối tượng có tạo
thành 1 vịng khép kín khơng.
• Thuộc tính empty hoặc not-empty: Một đối tượng có thuộc tính empty
là 1 đối tượng không chứa điểm nào. Một đối tượng empty sẽ khơng
được định nghĩa các thuộc tính exterior, interior và boundary.

149


PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS

• Dimention: Thuộc tính dimention của một đối tượng có các giá trị là -1,
0, 1, 2.
o -1: Đối tượng này là 1 đối tượng rỗng
o 0: Đối tượng này khơng có chiều dài và khơng có diện tích
o 1: Đối tượng này có chiều dài khác 0 và diện tích bằng 0.
o 2: Đối tượng này có diện tích khác 0
o Đối tượng Point có dimension là 0
o Đối tượng LineString có dimension là 1
o Đối tượng Polygon có dimension là 2
o Các đối tượng MultiPoint, MultiLineString, MultiPolygon có
dimension bằng với dimension của các thành phần của nó.
Lớp Point

Point là đối tượng dùng để chỉ các địa điểm đơn giản trên hệ thống tọa độ.
Ví dụ về Point: Trong 1 bản đồ thế giới với nhiều thành phố thì 1 Point có
thể được dùng biếu diễn 1 thành phố. Trong 1 bản đồ thành phố thì Point
có thể biểu diễn 1 trạm xe buýt
Các thuộc tính của lớp Point
• Giá trị hồnh độ điểm X
• Giá trị tung độ điểm Y
Lớp Curve
Thường được dùng để mô tả 1 mảng các điểm. Lớp này là lớp trừu tượng,
các lớp con của Curve định nghĩa các loại quan hệ khác nhau giữa các
điểm.
Các thuộc tính của Curve

150


PHỤ LỤC – MySQL với phần mở rộng hỗ trợ cho OpenGIS

• Mỗi Curve chứa 1 mảng các điểm
• Curve là đối tượng 1 chiều
• Một Curve thuộc loại simple nếu như nó khơng đi qua 1 điểm nào đó
của nó 2 lần
• Một Curve là closed nếu như điểm đầu trùng với điểm cuối
• Một Curve vừa simple và vừa closed là 1 Linearing
Lớp LineString
LineString là 1 Curve với mối quan hệ tuyến tính giữa các điểm
Ví dụ về LineString: Trong bản đồ thế giới, LineString có thể dùng để biểu
diễn các con sông. Trong bản đồ thành phố, LineString có thể dùng để biểu
diển các con đường
Thuộc tính của LineString

• Mỗi LineString gồm nhiều đoạn, mỗi đoạn là 1 cặp điểm
• Một LineString là 1 đoạn thẳng nếu nó chỉ chứa đúng 2 điểm
• Một LineString là 1 Linearing nếu như nó vừa closed, vừa simple
Lớp Surface
Surface là lớp trừu tượng, là 1 lớp 2 chiều. Lớp cài đặt cụ thể duy nhất của
lớp này là Polygon.
Lớp Polygon
Trong bản đồ thì Polygon có thể được dùng để mơ tả 1 khu rừng, 1 quận
….
Boundary của 1 Polygon gồm 1 tập các Linearing
Lớp GeometryCollection

151



×