.1 Kiến trúc ứng dụng

Một phần của tài liệu XÂY DỰNG THƯ VIỆN PHẦN MỀM HỖ TRỢ HỆ THỐNG THÔNG TIN ĐNA LÝ GIS 3D DỰA TRÊN CƠ SỞ DỮ LIỆU HƯỚNG ĐỐI TƯỢNG BẰNG NGÔN NGỮ C++ (Trang 89 - 117)

Ứng dụng sử dụng các hàm do thư viện GTinLibrary cung cấp như: DML API, AL

API, WORLD3D.

Để sử dụng các hàm thư viện này chúng ta cần include vào ứng dụng các file .h của

thư viện GTinLibrary vào trong chương trình: GTinDML.h

GTinAL.h World3D.h WorldMap.h

và các file thư viện của GTinLibrary sau:

GTinDML.omf.lib (hoặc GTinDML.lib – file lib theo chuNn của Miscrosoft)

GTinAL.lib GTinPL.lib

đồng thời sử dụng control của đối tượng World3D: GTinPL.bpl

Sau đó, chúng ta chỉ cần gọi các hàm API của thư viện để hiện thực chương trình ứng dụng.

Ví dụ chúng ta cần lấy handle của Tin thứ index trên cơ sở dữ liệu: HTTin GetTin(int index)

{

HTTin hTin = NULL;

HWOBJ hwTin = world3d->GetObject(OBJ_TIN,index);

if (hwTin) world3d->GetProperty(hwTin,WOBJ_TIN_HANDLE,&hTin); return hTin;

}

Đối với controls WORLD3D chúng ta cần bắt lấy những biến cố sau đây để vẽ lên

TIN.

OnCreateContext: thêm các mục vào trong menu ngữ cảnh của WORLD3D.

OnCreateObject: khi tạo mới những đối tượng điểm mốc đoạn đường vào

WORLD3D.

OnCreateObject: khi chèn một đối tượng vào WORLD3D. OnDropedObject: sau khi chúng ta di chuyển đối tượng điểm. OnPostRenderScene: khi cần vẽ lên địa hình TIN bằng OpenGL.

II.7. Nhập dữ liệu vào chương trình

Để nhập dữ liệu vào chương trình chúng ta cần xây dựng một cấu trúc dữ liệu thích

hợp để lưu trữ các thông số của con đường.

Một con đường bao gồm nhiều đoạn đường (Segment). Mỗi đoạn đường gồm có các thơng số như: điểm bắt đầu và điểm kết thúc, chiều rộng, chiều cao, độ dốc tối đa cho phép, thể tích đào (khoan), thể tích đắp.

Nhận xét rằng điểm kết thúc của đoạn đường thứ index sẽ là điểm bắt đầu của đoạn đường thứ index + 1. Do đó, chúng ta sẽ lưu trữ các điểm mốc vào một danh sách

riêng, các đoạn đường vào một danh sách riêng. Số lượng phần tử đoạn đường ít hơn số lượng phần tử điểm mốc một phần tử. Đoạn đường thứ index sẽ có điểm bắt đầu là phần tử thứ index và điểm kết thúc là phần tử thứ (index + 1) trong danh sách điểm mốc.

Hình 6-4 Cấu trúc dữ liệu lưu trữ con đường

Bên ngoài ứng dụng chỉ nhìn thấy danh sách đoạn đường nhưng bên trong chúng ta thật sự thao tác trên dữ liệu danh sách điểm mốc rồi tính tốn lại kết quả.

class TRoad: public TObject {

public:

class Corner: public TObject {

public:

__fastcall Corner(real x, real y, real z, TRoad* Road); virtual __fastcall ~Corner();

__fastcall operator Point3D();

Corner& __fastcall operator=(const Point3D& p); };

class Segment: public TObject {

public:

bool StraightLine;

enum { NEW, EDITING, NORMAL } state; /* 0-new object, 1-object

being edited, 2-normal*/

__fastcall Segment(real width, real height, real slope, TRoad* Road);

void __fastcall ComputeWorkVolume(bool recompute = false); bool __fastcall Validate();

void __fastcall RenderScene(int flag); virtual __fastcall ~Segment();

__property real Dag; __property real Fill; __property real MaxSlope;

__property real Width; __property real Height;

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

};

friend class Corner; friend class Segment; public:

__fastcall TRoad(TWorld3D* w3D); __fastcall ~TRoad();

bool __fastcall AddPoint(real x, real y, real z, int index=-1); int __fastcall FindPoint(void* corner);

void __fastcall DeletePoint(int index);

bool __fastcall AddPoint(const Point3D& point, int index=-1); void __fastcall DeletePoint(void* corner);

__property int PointCount;

__property Point3D Points[int index]; __property int SegmentCount;

__property TRoad::Segment* Segments[int index]; __property Point3D StartPoint[int index]; __property Point3D EndPoint[int index]; __property HWOBJ WorldTin;

};

II.8. Giao diện

Hình 6-5 Giao diện chương trình Road Computation

III. CÁCH SỬ DỤNG

T

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

CHƯƠNG 7 : TỔNG KẾT VÀ ĐÁNH GIÁ ĐỀ TÀI

I. KẾT QUẢ ĐẠT ĐƯỢC

Nhìn chung, thư viện bước đầu đem lại những kết quả nhất định, giải quyết được các bài toán căn bản trong GIS 3D như sau:

1. Xây dựng được mơ hình lưới tam giác khơng đều dùng để biểu diễn bề mặt địa hình. Từ cấu trúc của lưới tam giác khơng đều này hình thành các thuật toán để giải quyết các bài toán căn bản trong GIS 3D.

2. Cắt Tin bằng mặt phẳng bất kỳ. 3. Tính diện tích mặt cắt.

4. Tính độ dốc của bề mặt.

5. Tính diện tích và thể tích của TIN.

6. Xác định cao độ z của một điểm khi biết tọa độ x, y của điểm đó. 7. Xác định điểm M(x, y, z) có thuộc vào bề mặt địa hình hay khơng

8. Tính khoảng cách địa hình từ vị trí A đến vị trí B khi trượt theo bề mặt của TIN.

9. Xác định tính khả kiến của 2 vị trí bất kỳ trong khơng gian.

10. Chuyển đối từ mơ hình lưới tam giác khơng đều ( TIN ) sang mơ hình ma trận

độ cao.

11. Xây dựng cấu trúc tạo chỉ mục cho dữ liệu 3 chiều, góp phần khắc phục nhược

điểm trong truy vấn dữ liệu trên cơ sở dữ liệu hướng đối tượng Versant.

12. Tạo được một môi trường trực quan cho người dùng dễ dàng thao tác trên địa hình 3D.

13. Kết nối mơ hình lưới tam giác không đều với hệ cơ sở dữ liệu hướng đối tượng Versant. Xây dựng một ứng dụng thiết kế một con đường để kiểm chứng việc áp dụng kết quả của thư viện GTinLibrary vào thực tế.

So sánh với mục tiêu đã đề ra:

Mục tiêu của đề tài là xây dựng một thư viện phần mềm để sử dụng hệ thống thông tin

địa lý 3 chiều dựa trên cơ sở dữ liệu hướng đối tượng bằng ngơn ngữ C++. Do đó, thư

viện cần phải:

• Xây dựng cấu trúc dữ liệu phù hợp để lưu trữ và biểu diễn bề mặt địa hình

trong khơng gian 3 chiều.

• Lưu trữ các đối tượng xuống cơ sở dữ liệu hướng đối tượng.

• Cung cấp các phép tốn cơ bản để từ đó người dùng trung gian (các lập trình viên) sử dụng nhằm tạo các ứng dụng cho hệ thống thơng tin địa lý 3 chiều. • Cung cấp khả năng thao tác trực quan trên mơ hình GIS 3D.

Như vậy, thư viện GTinLibrary phần nào đã đáp ứng được những mục tiêu đặt ra ban

đầu.

II. Ý NGHĨA THỰC TIỄN CỦA THƯ VIỆN

Chúng ta biết rằng dữ liệu trong hệ thống thông tin địa lý 3D thuộc dạng dữ liệu phức tạp. Do đó, việc ứng dụng một hệ quản trị cơ sở dữ liệu phù hợp cho nó trở nên là một

vấn đề đáng quan tâm. Hiện nay, công nghệ cơ sở dữ liệu hướng đối tượng là một

công nghệ mới với nhiều ưu điểm nổi bật trong việc quản lý các loại dữ liệu phức tạp, hứa hẹn trở thành một giải pháp quản lý cơ sở dữ liệu mạnh mẽ và phổ biến trong tương lai gần. Từ đó cho thấy việc ứng dụng hệ quản trị cơ sở dữ liệu hướng đối tượng cho hệ thống thông tin địa lý 3D trở nên rất có ý nghĩa.

Thư viện phần mềm GTIN mở ra một tương lai mới trong việc quản lý hệ thống GIS tạo tiền đề cho việc ứng dụng để quản lý GIS 3D trong thực tế. Thư viện trở thành một công cụ giúp cho người dùng trung gian (lập trình viên) việc thiết kế các ứng dụng hỗ trợ cho quản lý GIS 3D.

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

Thư viện Tính tốn và Trình diễn Lưới tam giác khơng đều Trang 84

T

ÀII LLIIỆỆUU TTHHAMAM KKHHẢO O

[1] Nguyễn Ngô Bảo Trân. Xây dựng metadata và đặc tả các ràng buộc toàn vẹn. [2] R.G.G Cartel & Douglas Barry (1997). The Object Database Standard ODMG

2.0. Morgan Kaufmann Publishers, Inc.

[3] Dave Shreiner & Ed Angel & Vicki Shreiner (2000). An Interactive Introduction

to OpenGL Programming.

[4] Microsoft Developer Network (2001). Microsoft, Corp.

[5] Versant Developers (2002). Versant C++ Reference Manual & Versant C++

Usage Manual. Versant, Corp.

[6] Ibrahim Kamel &Christos Faloutsos (1994). Hilbert R-Tree: An improve R_Tree

using fractals. 4-9.

[7] Stefan Berchtold & Daniel A.Keim & Hans-Peter Kriegel (1996): The X-Tree: An

index structure for high-dimensional data. 1-12.

[8] Timos Sellis & Nick Roussopoulos & Christos Faloutsos. The R+_Tree: A dynamic

index for multi-dimensional objects. 1-10.

[9] Micheal F.Worboys (1995). GIS A Computing Perspective. Taylor & Francis Inc. [10] http://mcraefamily.org/MathHelp

P PHHỤ LLỤỤCC AA:: HƯỚỚNNG G DDẪN N SSỬ DDỤNNGG DDMMLL AAPPII.. #define TIN_ROOT 0 #define TIN_VERTEX 1 #define TIN_TRIANGLE 2 #define TIN_CONTAINER 3 #define TIN_FILLSTYLE 4

Database Transaction API

tinOpenDB()

HTDB tinOpenDB(LPTSTR database);

Mở CSDL có tên trong database. Nếu database là NULL, hàm sẽ tạo một database ảo trên bộ nhớ - virtual database. Các đối tượng của virtual database

không được lưu và sẽ bị mất khi process gọi kết thúc. Hàm này cần phải được gọi trước tất các các hàm API khác.

Kết quả của hàm trả về handle của database vừa mở. Bạn có thể mở cùng lúc nhiều database, nhưng chỉ có một database được hoạt động tại một thời điểm duy nhất. Nghĩa là, khi bạn mở một database mới thì database hiện tại sẽ bị deactive, khi đó việc truy cập các đối tượng thuộc database này sẽ trả về kết quả khơng xác

định trước.

Để active một database nào đó, dùng hàm tinActiveDB().

tinCloseDB()

void tinCloseDB(HTDB hDB);

Đóng database được mở trước đó bằng tinOpenDB().

tinCloseAllDB()

void tinCloseAllDB();

Đóng tất cả các database đang mở.

tinOpenedDBCount()

int tinOpenedDBCount();

Trả về số database đang được mở (kể cả virtual database)

tinGetOpenedDB()

HTDB tinGetOpenedDB(int index);

Trả về handle của database thứ index đã được mở.

tinGetDBName()

LPSTR tinGetDBName(HTDB hDB, LPSTR name);

Lấy tên của database có handle là hDB. Nếu hDB là NULL thì trả về tên của active database.

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

tinIsPersistentDB()

bool tinIsPersistentDB(HTDB hDB);

Kiểm tra tính persistent của database. Trả về true nếu hDB là handle của một persistent database, fasle nếu ngược lại. Nếu hDB là NULL, hàm sẽ kiểm tra tính persistent của active database.

tinActiveDB()

void tinActiveDB(HTDB hDB);

Kích hoạt là một database đã bị deactive trước đó bởi hàm tinOpenDB().

tinGetActiveDB()

HTDB tinGetActiveDB();

Trả về handle của database “tích cực”.

tinBeginTransaction()

void tinBeginTransaction(HTDB hDB);

Bắt đầu một short-transaction.

tinCommit()

void tinCommit(HTDB hDB);

Kết thúc và chấp nhận những thay đổi trong transaction trước đó.

tinRollback()

void tinRollback(HTDB hDB);

Kết thúc và hủy bỏ những thay đổi trong transaction trước đó.

tinCount()

int tinCount();

Trả về số lượng TIN trong cơ sở dữ liệu active.

tinGet()

HTTin tinGet(int index);

Trả về handle của Tin thứ index trong active database.

tinGetAll()

int tinGetAll(HTTin buffer[], int bufsize);

Điền các handle của tất cả Tin trong active database vào buffer, bufsize cho biết

kích thước tối đa của buffer. Nếu bufsize nhỏ hơn số lượng Tin thì chỉ trả về handle của bufsize Tin.

Hàm trả về số lượng handle đã điền vào buffer.

tinFind()

HTTin tinFind(LPTSTR tin_name);

Trả về Tin có tên là tin_name. Nếu khơng có Tin nào thỏa, trả về NULL.

tinNextObjID()

int tinNextObjID();

Trả về giá tri nguyên xác định ID của đối tượng được tạo ra tiếp theo.

Object Manipulation API

tinNewVertex()

HTVertex tinNewVertex(real x , real y, real z);

Tạo mới một đối tượng transient đỉnh có tọa độ (x, y, z).

Để thêm đỉnh vào Tin dùng hàm tinAddVertex().

tinNewTriangle()

HTTriangle tinNewTriangle(HTVertex, HTVertex, HTVertex);

Tạo mới một đối tượng transient là tam giác có ba đỉnh xác định bởi 3 handle đến 3 đối tượng đỉnh.

tinNewTin()

HTTin tinNewTin(LPTSTR name, int persistent);

Tạo mới một Tin có tên là name. Nếu persistent = 1, đối tượng tạo ra là

persistent, ngược là transient.

tinReleaseObj()

void tinReleaseObj(HTObj hObj);

Xóa và giải phóng đối tượng có handle là hObj. Bạn khơng nên gọi hàm này để xóa các đối tượng persistent là đỉnh hay tam giác. Vì điều này có thể dẫn đến việc mất tính nhất quán dữ liệu.

Để xóa đỉnh, tam giác của một Tin nên dùng hàm tinRemoveVertex(),

tinRemoveTriangle().

tinGetProp()

bool tinGetProp(HTObj hObj, int propname, void* wparam, int lparam);

Đọc thuộc tính propname của đối tượng hObj. Hàm trả về 1 nếu thành công, 0

nếu có lỗi.

Giá trị Propname, trị trả về và kiểu của wparam, lparam được qui định theo bảng sau.

Trị xuất wparam lparam w

Propname

T_OBJID ID của đối tượng. [out] int*

T_OWNER Tin chứa đối tượng. [out] HTTin*

T_TAG giá trị tag. [out] int* 9

T_PERSISTENT persistent hay không. [out] int*

T_OBJ_TYPE loại của đối tượng. [out] int*

T_VERTEX_X tọa độ x của đỉnh. [out] float* 9

T_VERTEX_Y tọa độ y của đỉnh. [out] float* 9

T_VERTEX_Z tọa độ z của đỉnh. [out] float* 9

T_VERTEX_COLOR giá trị màu của đỉnh. [out] int* 9

T_VERTEX_TRIANGLE tam giác qua đỉnh. [out] HTTriangle* [in] int: chỉ số tam giác (0…n)

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

T_TRI_VERTEX đỉnh của tam giác. [out] HTVertex* [in] int: chỉ số (0,1,2)

T_TRI_FILLSTYLE mẫu tô của tam giác. [out] HTFS* 9

T_TRI_FILLCOLOR màu tô của tam giác. [out] int* 9

T_TRI_LINESTYLE kiểu đường của cạnh. [out] int* [in] int: chỉ số cạnh (0,1,2). 9

T_TRI_LINECOLOR màu của đường. [out] int* [in] int: chỉ số cạnh (0,1,2). 9

T_TRI_LINEWIDTH độ rộng đường. [out] int* [in] int: chỉ số cạnh (0,1,2). 9

T_TIN_VERTEX đỉnh thuộc Tin. [out] HTVertex* [in] int: chỉ số đỉnh (0…n).

T_TIN_VERTEX_CNT số đỉnh trong Tin. [out] int*

T_TIN_TRIANGLE tam giác thuộc Tin [out] HTTriangle* [in] int: chỉ số tam giác (0…n).

T_TIN_TRIANGLE_CNT số tam giác trong Tin. [out] int*

T_TIN_NAME tên của Tin. [out] char* 9

T_TIN_MAX_EDGELEN giá trị cạnh dài nhất. [out] real*

T_FS_NAME tên của mẫu tô. [out] char* 9

T_FS_DATA dữ liệu mẫu tô. [out] int[32] 9

T_FS_DATA_AT_INDEX dữ liệu mẫu tô. [out] int* [in] int: chỉ số dữ liệu (0…31) 9

T_FS_ACTIVE kiểm tra mẫu tô hiện tại. [out] int*

W : writable – xác định thuộc tính có thể thiết lập giá trị. tinSetProp()

bool tinSetProp(HTObj tinobj, int propname, void* wparam, int

lparam);

Thiết lập giá trị cho thuộc tính writable có tên là propname. Xem hàm tinGetProp() để có các giá trị của propname.

tinCompare()

int tinCompare(HTObj hObjA, HTObj hObjB);

So sánh hai đối tượng theo nội dung của chúng. Hàm trả về 0 nếu hObjA == hObjB. Lớn hơn 0, hObjA > hObjB, và nhỏ hơn 0 khi hObjA < hObjB.

Đối với đỉnh, tam giác chỉ so sánh bằng và so sánh khác là có ý nghĩa. Hai đỉnh

bằng nhau khi chúng có trùng tọa độ. Hai tam giác bằng nhau khi chúng có cùng ba đỉnh theo cùng một thứ tự.

Đối với Tin, chúng được so sánh theo tên.

Còn với tất cả các đối tượng khác, phép so sánh là vô nghĩa.

tinIsPersistent()

bool tinIsPersistent(HTObj hObj);

Trả về true nếu hObj là handle của một đối tượng persistent. Ngược lại là false.

tinGetObjType()

int tinGetObjType(HTObj hObj);

Trả về loại đối tượng xác định bởi hObj. Có 4 loại đối tượng sau: TIN_VERTEX, TIN_TRIANGLE, TIN_CONTAINER, TIN_FILLSTYLE.

tinGetObjID()

int tinGetObjID(HTObj hObj);

Trả về ID của đối tượng xác định bởi hObj.

tinGetTag()

int tinGetTag(HTObj hObj);

Trả về giá trị nguyên 32 bit do người dùng thiết lập của đối tượng hObj.

tinSetTag()

void tinSetTag(HTObj hObj,int value);

Thiết lập giá trị tag cho đối tượng hObj thành value. Giá trị tag không được lưu

trữ nên khi đối tượng được nạp lên bộ nhớ, tag được thiết lập lại 0.

tinGetUserData()

int tinGetUserData(HTObj hObj);

Đọc giá trị nguyên 32 bit chứa dữ liệu người dùng định nghĩa. Giá trị này là thuộc

tính transient.

tinSetUserData()

void tinSetUserData(HTObj hObj,int value);

Thiết lập giá trị chứa dữ liệu người dùng cho đối tượing hObj.

tinGetOwner()

HTTin tinGetOwner(HTObj hObj);

Trả về handle đối tượng Tin chứa đối tượng hObj. NULL nếu hObj không thuộc Tin nào.

tinGetMBR()

realptr tinGetMBR(HTObj hObj, realptr mbr);

Trả về vùng không gian nhỏ nhất bao đối tượng hObj (Minimum Bounding Region).

mbr là con trỏ đến mảng 6 phần tử kiểu real được điền giá trị theo thứ tự xmin,

ymin, zmin, xmaz, ymax, zmax. Hàm trả về mbr.

tinIsTriangle()

bool tinIsTriangle(HTObj hObj);

Trả về true nếu hObj là đối tượng tam giác.

tinIsVertex()

bool tinIsVertex(HTObj hObj);

Trả về true nếu hObj là đối tượng đỉnh.

tinIsTin()

bool tinIsTin(HTObj hObj);

Trả về true nếu hObj là đối tượng Tin.

tinIsObj()

bool tinIsObj(HTObj hObj);

Trả về true nếu hObj là đối tượng hợp lệ.

tinFindObj()

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

Trả về handle của đối tượng có ID chỉ định trong objID. NULL nếu tìm thất bại. Hàm này chỉ dùng cho CSDL persistent.

tinCreateFillStyle()

HTFS tinCreateFillStyle(LPTSTR StyleName);

Tạo mới một mẫu tơ có tên trong StyleName. Tên các mẫu tô không được trùng nhau. Hàm trả về handle của mẫu tô nếu thành cơng.

tinDeleteFillStyle()

void tinDeleteFillStyle(HTFS hStyle);

Xóa mẫu tơ hSyle. Bạn khơng thể xóa mẫu tơ mặc định. Xem tinGetDefaultFillStyle() để lấy mẫu tô mặc định.

tinGetDefaultFillStyle()

HTFS tinGetDefaultFillStyle(HTTin hTin);

Trả về handle của mẫu tô mặc định của đối tượng hTin. Mẫu tô mặc định là mẫu tô được áp dụng cho các tam giác trong Tin mà chưa được thiết lập mẫu tô mới.

tinGetFillStyle()

HTFS tinGetFillStyle(LPTSTR StyleName);

Trả về handle của mẫu tơ có tên là StyleName. NULL nếu tìm thất bại.

tinGetFSName()

LPTSTR tinGetFSName(HTFS hStyle, LPTSTR name);

Hàm lấy tên của mẫu tô. Name là con trỏ đến vùng đệm. Kích thước của vùng đệm phải đủ lớn để chứa tên mẫu tô.

Hàm trả về name.

tinSetFSName()

void tinSetFSName(HTFS hStyle, LPTSTR newName);

Thiết lập tên cho mẫu tô hStyle.

tinGetFSPattern()

LPSTR tinGetFSPattern(HTFS hStyle, LPSTR pattern);

Lấy 32 byte dữ liệu của mẫu tô.

tinSetFSPattern()

void tinSetFSPattern(HTFS hStyle, LPSTR newPattern);

Thiết lập 32 byte của mẫu tô.

tinGetFillStyleCount()

int tinGetFillStyleCount();

Trả về tổng số kiểu tô trong CSDL.

tinGetFillSyles()

void tinGetFillStyles(HTFS* styles);

Một phần của tài liệu XÂY DỰNG THƯ VIỆN PHẦN MỀM HỖ TRỢ HỆ THỐNG THÔNG TIN ĐNA LÝ GIS 3D DỰA TRÊN CƠ SỞ DỮ LIỆU HƯỚNG ĐỐI TƯỢNG BẰNG NGÔN NGỮ C++ (Trang 89 - 117)

Tải bản đầy đủ (PDF)

(117 trang)