1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

18 210 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 761,63 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

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

Trang 2

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

Trang 3

ƒ 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:

Trang 4

• 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

urlencoded";

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

Trang 5

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 kí 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á

Trang 6

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 nguyên 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 toà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 ngoà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

Trang 7

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

Trang 8

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

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

http://www.contoso.com/");

}

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;

Trang 9

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

Trang 10

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 trình

chính có thể đóng lại

}

return;

}

}

Trang 11

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

Trang 12

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

Trang 13

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 đồ

Trang 14

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ẽ hoà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ý,…

Trang 15

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 Line

o LinearRing

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

• Polygon (Lớp cụ thể)

o 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

Trang 16

ƒ 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

Ngày đăng: 30/07/2014, 17:20

HÌNH ẢNH LIÊN QUAN

Hình 7.8.Màn hình minh họa thực hiện request WMS – GetMap - 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
Hình 7.8. Màn hình minh họa thực hiện request WMS – GetMap (Trang 1)
Hình 7.9.Màn hình giao diện chương trình OpenGISClientApplication - 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
Hình 7.9. Màn hình giao diện chương trình OpenGISClientApplication (Trang 12)
Hình 7.10.Màn hình lấy thông tin một điểm trên bản đồ - 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
Hình 7.10. Màn hình lấy thông tin một điểm trên bản đồ (Trang 13)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm