MapInfo ADO.NET Data Provider:

Một phần của tài liệu Đồ án tốt nghiệp đại học “nghiên cứu, cài đặt thuật toán giải bài toán lập hành trình người đưa thư và ứng dụng” (Trang 37 - 49)

MapXtreme 2005 cung cấp các kỹ thuật cho việc đưa ra các lệnh SQL để trả lại một tập các bản ghi từ các bảng dùng ADO.NET. Trình cung cấp dữ liệu MapInfo ADO.NET cho phép truy cập dữ liệu trong các ứng dụng .NET

Các lớp và các giao diện cho việc truy cập dữ liệu qua MapInfo ADO.NET Data Provider:

a) MIConnection:

Một đối tựơng MIConnection trình bày một kết nối tới Catalog. Sự kết nối này sẽ cung cấp một điểm bắt đầu cho việc đưa ra các lệnh SQL và thu được các kết quả. Trong hầu hết các trình cung cấp dữ liệu sự kết nối sẽ lập tức cho phép người dùng bắt đầu thực hiện các truy vấn và các lệnh khác dựa vào các bảng đã tồn tại, trình cung cấp dữ liệu MapInfo Data.NET Data Provider không khởi tạo các bảng có sẵn nào. Các bảng cần được mở hoặc được tạo trước khi chúng có thể được truy nhập. Không có chuỗi kêt nối được yêu cầu để tạo ra một sự kết nối mới.

b) MICommand:

MICommand cung câp các giao diện cần thiết cho việc thực thi các lệnh SQL dựa vào MapInfo Data Provider. Đối tượng MICommand sẽ tạo ra MIDataReader và MicrollableReader cho lấy dữ liệu qua các phương thức ExcuteReader.

Một số lệnh hỗ trợ:

SELECT < select_list >

FROM { < table_source > } [ ,...n ] [ WHERE < search_condition > ]

[ GROUP BY expression [ ,...n ] ]

[ ORDER BY {expression | column_position [ ASC | DESC ] } [ ,...n ]] < select_list > ::= { *| { table_name | table_alias }.* | { expression } [ [ AS ] column_alias ] } [ ,...n ] < table_source > ::= table_name [ [ AS ] table_alias ] Insert

INSERT [INTO] { table_name } [ ( column_list ) ]

{ VALUES ({expression | NULL}[, ...n]) | query_specification

Update

UPDATE { table_name }

SET {{ column_name } = { expression | NULL }} [, ...n]

[WHERE < search_condition > ]

Delete

DELETE [FROM] { table_name } [ WHERE < search_condition > ]

< search_condition > ::=

{ [ NOT ] < predicate > | ( < search_condition > ) }

[ { AND | OR } [ NOT ] { < predicate > | ( < search_condition > ) } [ ,...n ] ] < predicate > ::=

{

expression [ { = | < > | != | > | >= | < | <= } expression ]

| string_expression [ NOT ] LIKE string_expression [ ESCAPE

'escape_character' ] | expression [ NOT ] BETWEEN expression AND expression

| expression IS [ NOT ] NULL }

* ExcuteFeatureCollection: phương thức này trong lớp MICommand là cầu

nối giữa MapInfo ADO.NET Data Provider và các mô hinh đối tượng. Nó sẽ thực thi khối lệnh SQL dựa vào sự kết nối với nguồn dữ liệu và tạo ra một IresultSetFeatureCollection.

c) MIDataReader: MIDataReader cung cấp việc truy cập dữ liệu chỉ đọc tới dữ liệu được trả lại từ thực thi khối lệnh select SQL, để tạo ra một đối tượng MIReader, bạn phải gọi phương thức ExcuteReader của đối tượng MICommand MapInfo Data Provider cho phép sử dụng nhiều đối tượng MIDataReader trên cùng một kết nối. Tuy nhiên nếu bảng đang được truy nhập thì chỉ có một đối tượng MIDataReader được mở tại một thời điểm nhất định.

IsClose và RecordAffected là các thuộc tính mà bạn có thể gọi sau khi đối tượng MIDataReader bị đóng. (adsbygoogle = window.adsbygoogle || []).push({});

Bạn phải goi phương thức Close một cách rõ ràng khi dùng đối tượng MIDataReader.

Khi truy cập dữ liệu dữ liệu qua các giao diện IfeatureEnumerator, phương thức Close sẽ tự động được.

2.4.4. Feature and Feature Collections (đối tượng và tập các đối tượng):

Mô hình đối tượng trong MapXtreme 2005 cung cấp một cách tiếp cận cơ bản không dùng ngôn ngữ truy vấn có cấu trúc(non-SQL) để truy cập và thao tác với dữ liệu. Phần này bao trùm cả lớp đối tượng và giao diện lựa chọn đối tượng(IfeatureCollection).

a) Đối tượng:

Các đối tượng được mô tả bởi các thuộc tính, khóa, nguồn dữ liệu, kiểu và geometry(đối tượng hình học thể hiện trên bản đồ) của chúng. Một đối tượng là đặc trưng cho một hàng trong bảng. Đối tượng hình học (FeatureGoemetry) có thể bao trùm một khu vực có sẵn(MultiPolygon), một vị trí điểm(Point, MultiPoints), hoặc một đường(MultiCurves,LegacyArcs). Ngoài ra các lớp Geometry tạo ra từ FeatureGeometry và được dùng cho các đối tượng trên bản đồ là FeatureGeometryCollection và LegacyText(các đối tượng: Rectangle, rounded rectangle và ellipse được bắt nguồn từ đối tượng

FeatureGeometry, nhưng chúng được dùng cho mục đích thể hiện bề ngoài). Một trong các cách dùng chính của các bản đồ số là thu thập thông tin về các đối tượng. Trong MapXtreme 2005 các đối tượng sẽ được trả về thông qua một vài phương thức trong FeatureCollection.

Bạn có thể thêm các đối tượng feature vào bảng thông qua phương thức Load(). Các thay đổi xảy ra với đối tượng sẽ không được phản xạ trong bảng cơ sở cho đến khi đối tượng được lưu lại vào bảng, điều này được thực hiện bằng cách dùng phương thức Update(), hoặc phương thức UpdateFeature hoặc phương thức InsertFeature. Bạn cũng có thể thay đổi các thao tác chỉnh sửa trên đối tượng cho đến khi nó được lư dùng phương thức DiscardEdits.

b) Tập các đối tượng (FeatureCollection):

Tập các đối tượng là một nhóm các đối tượng. Tất cả các đối tượng trong một tập chia sẻ một giản đồ(Schema) giống nhau

+ Tìm kiếm các đối tượng: một trong những ứng dụng bản đồ của Pitney Bowes MapInfo là tìm kiếm các đối tượng với một tiêu chuẩn xác định. Trong MapXtreme 2005 việc tìm kiếm các đối tượng có thể được thực hiện bằng nhiều cách: như sử dụng các công cụ tool, dùng các phương thức tìm kiếm của Catalog, hoặc dùng SQL và trình cung cấp dữ liệu MapInfo ADO.NET. với ví dụ dưới đây sẽ trình bày 2 cách để tìm kiếm một đối tượng giống nhau, đó là các thành phố trong HaNoi.

// Using SQL

command.CommandText = "Select Obj From States Where state = `NY';

FeatureGeometry nyGeom = command.ExecuteScalar() as FeatureGeometry;

command.CommandText = "SELECT * FROM Cities WHERE Obj within @HaNoi ";

command.Parameters.Add("@HaNoi", nyGeom);

MIDataReader reader = command.ExecuteReader(); // or... to get a FeatureCollection

IFeatureCollection fc =

command.ExecuteFeatureCollection();

// Using Features

Feature fNY = catalog.SearchForFeature("States", SearchInfoFactory.SearchWhere("state='NY'")); SearchInfo si = SearchInfoFactory.SearchWithinFeature(fNY, ContainsFilter.ContainsType.Centroid); IDynamicFeatureCollection dfc = catalog.Search("Cities", si) as IDynamicFeatureCollection;

Console.Out.WriteLine("There are {0} cities whose centroid is within HaNoi." dfc.Count);

+ Các phương thức tìm kiếm trong Catalog: Catalog có nhiều phương thức tìm kiếm. Các phương thức tìm kiếm nạp chồng có thể được dùng để tìm kiếm trên một hoặc nhiều bảng. Ví dụ phương thức Search cơ bản(Table, SearchInfo) sẽ tìm kiếm trên các bảng có sẵn và sẽ trả về một tập các đối tượng. Còn với phương thức tìm kiếm khác sẽ tìm kiếm trên nhiều bảng và trả về đối tượng MultiResultSetfeatureCollection.

Phương thức SearchForFeature sẽ trả về đối tượng Feature đầu tiên từ các kết quả tìm được. Phương thức SearchWithinGeometry sẽ trả về một đối tượng MIDataReader.

Đối tượng SearchInfo và SearchInfoFactory:

- Lớp MapInfo.Data.SearchInfo định nghĩa các truy vấn dùng trong một thao tác tìm kiếm và điều khiển bất cứ sự xử lý bổ sung nào cho kết quả tìm kiếm.

- Lớp SearchInfoFactory tạo ra các đối tượng SearchInfo. Còn lớp SearchInfoFactory chứa đựng nhiều phương thưc tìm kiếm cho phép bạn có thể tìm kiếm dùng các tham chiếu không gian tới vị trí tìm kiếm của bạn hoặc bằng các đối tượng hình học được vẽ trên màn hinh. Bảng dưới đây mô tả các phương thức tìm kiếm trong lớp SearchInfoFactory.

Các phương thức trong lớp SearchInfoFactory

Diễn giải

SearchAll Trả về tất cả các hàng. (adsbygoogle = window.adsbygoogle || []).push({});

SearchNearest Trả về hàng với các đối tượng hình học mà gần nhất với điểm cho để tìm kiếm.

SearchWhere Trả về các hàng mà thoả mãn điều kiện của mệnh đề Where.

SearchWithinDistance Trả về các hàng nơi mà các đối tượng hình học trong bản được chứa trong vòng một khoản cách nào đó của điểm, hình chữ nhật hoặc đối tượng hình học cho để tìm kiếm. Phương thức này dùng phương thức Geometry.Distance để xác định nếu một đối tượng là ở trong hoặc ở ngoài khu vực tìm kiếm.

SearchWithinGeometry Trả về các hàng nơi mà các đối tượng hình học trong bảng được chứa trong(nằm trong) đối tượng hình học tìm kiếm.

SearchWithinRect Trả về các hàng nơi mà các đối tượng hình học trong bảng cắt hình chữ nhật cho sẵn.

SearchIntersectsFeature Trả về các hàng nới mà các đối tượng hình học cắt với đối tượng hình học của các Feature.

SearchIntersectsGeometry Trả về các hàng nơi mà các đối tượng hình học trong bảng cắt với đối tượng hình học tìm kiếm.

SearchWithinScreenRadius Tạo ra một đối tượng SearchInfo trả về các hàng nơi mà đối tượng hình học của bảng cắt với hình tròn trên màn hinh.

SearchWithinScreenRect Trả về các hàng mà đối tượng hình học trong bảng cắt với hình chữ nhật cho sẵn trên màn hình.

SearchWithinFeature Trả về các hàng nới mà các đối tượng hình học trong bảng nằm trong vòng các đối tượng hình học của Feature. - MapXtreme 2005 có sẵn một ứng dụng mẫu về việc tìm kiếm, bạn có thể chạy nó và hiểu thêm về mỗi kiểu tìm kiếm trong đó. Ví dụ theo đường dẫn\MapInfo\MapXtreme\6.x\Sample\Desktop\Features\Search folder.

Phân tích dữ liệu:

Mỗi một lần dữ liệu của bạn sẵn dùng trong Catalog, bạn muốn phân tích nó để thoả mãn các mục đích kinh doanh của bạn. Catalog có một trình xử lý SQL cho phép bạn phân tích và tập hợp dữ liệu của bạn, ở đây có 2 tuỳ chọn:

+ Giao diện truy vấn đối tượng cơ bản OGC. + Giao diện cơ sở SQL trong ADO.NET

Lược đồ bên dưới trình bày mối quan hệ giữa hai đối tượng này.

+ Nhóm 1: trình bày giao diện truy vấn OGC, dùng những đối tượng này để xây dựng một truy vấn. Giao diện này cho phép bạn tạo các truy vấn để lọc các cột và các hàng miễn là thêm các điều kiện không gian và phi không gian. Những sự truy vấn này tương tác thông qua phương thức Search của các đối tượng tìm kiếm để trả về các DataReader và tập các kết quả. Dùng các đối tượng này bạn sẽ thấy thoải mái so với dùng cấu trúc SQL.

+ Nhóm 2, dúng mô hình ADO.NET cho phép truy nhập qua ngôn ngữ MapInfo SQL. Các giao diện dùng cấu trúc SQL và gán nó tới đối tượng MICommand. Những đối tượng này dùng lệnh Execute để trả về một DataReader và một tập kết quả.

Cách thức của OGC query-based lẫn ADO.NET command-based đều dùng Catalog để tổ chức dữ liệu nguồn. Object-based query API sẽ tạo ra các câu lệnh SQL và thông qua đó truy cập tới Catalog để xử lý. Trong một vài trường hợp bạn có thể tạo ra SQL một cách thủ công nhưng hiệu quả hơn với điều kiện các đối tượng là hoàn toàn xác định. Nếu bạn thành thạo ngôn ngữ SQL thì dùng các phương thức trong ADO.NET có lẽ sẽ cảm thấy tiện lợi hơn, ngược lại nếu bạn không dùng quen với SQL thì dùng OGC để làm việc cũng tốt.

DataReader, MemTable và ResultSets:

Các phương thức truy cập dữ liệu sẽ trả về một bộ kết quả hoặc dữ liệu được đọc ra(datareader) cho phép truy cập một cách tuần tự và không lưu các

bản sao của dữ liệu. Nó lấy lại dữ liệu từ dữ liệu nguồn ngoại trừ trường hợp nơi để dữ liệu bị giấu kín. Các bộ kết quả (ResultSet) là một tập các khoá. Những khoá này cho phép bạn truy cập trở lại các bảng gốc và cũng không tạo ra các bản sao của dữ liệu.

Một đối tượng MemTable cũng cho phép bạn lưu dữ liệu từ các nguồn khác nhau vào trong một bảng. Và kiểu bảng này lưu dữ liệu bằng cách kết hợp các mảng bộ nhớ và khu lưu trữ tạm trên đĩa. Khi dữ liệu được thêm vào MemTable sẽ tạo ra một bản sao của dữ liệu và không có khóa hoặc con trỏ tham chiếu lại bảng gốc.

ResultSets là một công cụ mạnh khi bạn cần truy cập một tập các hàng được định nghĩa và khi bạn cần lấy dữ liệu từ nguồn. Nếu nguồn dữ liệu chẳng may thay đổi trong suốt phiên làm việc của bạn thì phương thức này cho phép bạn xem xét các kết quả với điều kiện là dữ liệu nguồn hỗ trợ thao tác truy cập xảy ra cùng một lúc.

MemTable chỉ là các bản sao của dữ liệu, chúng là bộ các hàng dữ liệu tĩnh và sẽ không phản xạ các thay đổi dữ liệu gốc.

CHƯƠNG 3: BÀI TOÁN NGƯỜI ĐƯA THƯ3.1. Mô tả bài toán người đưa thư: 3.1. Mô tả bài toán người đưa thư:

Một vấn đề hết sức cần thiết hiện nay là thiết kế chương trình tìm lộ trình cho các hệ thống phục vụ như người đưa thư, hay người bán hàng sao cho: người đó phải đi qua tất cả các địa điểm được phân công trong một khu vực cụ thể và đường đi đó là nhỏ nhất. Trong tất cả những bài toán đưa ra chưa có thuật toán giải tối ưu, hiện nay có những thuật toán để giải các bài toán này nhưng độ phức tạp thuật toán lớn, thời gian chạy chương trình rất lớn. Các bài toán chỉ đưa ra được cách giải cho kết quả gần đúng.

•Yêu cầu bài toán: Một ngừơi đưa thư xuất phát từ bưu điện hàng ngày phải đi qua tất cả các địa điểm(như: cơ quan, công ty, xí nghiêp…) được phân công trong thành phố để phát thư, báo... Yêu cầu đặt ra là tìm lộ trình đường đi ngắn nhất, nghĩa là tổng khoản cách người đưa thư phải đi là ngắn nhất.

Để giải bài toán này ta coi mạng đường đi trong thành phố là đồ thị vô hướng G(N,A). Thực chất đây là bài toán tìm chu trình Hamiton của n đỉnh của đồ thị, mỗi đỉnh qua đúng một lần sao cho tổng độ dài đường đi là nhỏ nhất.

Một phần của tài liệu Đồ án tốt nghiệp đại học “nghiên cứu, cài đặt thuật toán giải bài toán lập hành trình người đưa thư và ứng dụng” (Trang 37 - 49)