Đề tài Nghiên cứu và phát triển hệ quản trị cơ sở dữ liệu không gian PostgreSQL
MỤC LỤC
Chương 1. TỔNG QUAN VỀCƠSỞDỮLIỆU KHÔNG GIAN.7
1.1. Tổng quan vềcơsởdữliệu không gian.7
1.1.1. CSDL không gian.7
1.1.2. Đặc trưng của CSDL không gian .7
1.2. Mô hình.8
1.2.1. POINT .8
1.2.2. LINE.8
1.2.3. POLYGON.9
1.3. Mối quan hệkhông gian là gì? .9
1.3.1. Phân loại.9
1.3.2. Kết hợp hình học vào mô hình dữliệu DBMS.10
Chương 2. POSTGRESQL VÀ POSTGIS.12
2.1. PostgreSQL.12
2.1.1. Định nghĩa.12
2.1.2. So sánh PostgreSQL với một sốhệcơsởquản trịdữliệu khác .12
2.1.3. Quản trịcơsởdữliệu qua giao diện .15
2.2. PostGIS .23
2.2.1. Giới thiệu vềPostGIS.23
2.2.2. Công cụshp2pgsql .24
2.2.3. Công cụpsql.25
2.2.4. Phương pháp load dữliệu định dạng file .sql.25
2.2.5. Phương pháp load dữliệu dạng shape file vào CSDL .26
2.2.6. OpenGIS Well-Know Text.27
2.2.7. Bảng siêu dữliệu.28
2.2.8. Bảng không gian.30
2.3. Hàm trong PostGIS.32
2.3.1. Nhóm hàm điều khiển .32
2.3.2. Nhóm hàm khởi tạo hình học.33
2.3.3. Hàm trảvềkiểu hình học ở đầu ra. .34
2.3.4. Hàm xác định mối quan hệkhông gian.34
2.3.5. Nhóm hàm đưa ra đối tượng hình mới.40
2.3.6. Nhóm hàm thay đổi hình học .42
2.3.7. Nhóm hàm accessor .44
2.4. Chỉmục.45
2.4.1. Chỉmục GiST.45
2.4.2. Sửdụng chỉmục.45
2.5. Truy vấn trong cơsởdữliệu không gian.47
2.5.1. Mô tảvềcơsởdữliệu không gian .47
2
2.5.2. Truy vấn .49
Chương 3. MỞRỘNG TRUY VẤN KHÔNG GIAN POSTGRESQL .54
3.1. Các kiểu dữliệu trong PostgreSQL .54
3.1.1. Kiểu dữliệu cơbản .54
3.1.2. Kiểu dữliệu hỗn hợp.55
3.2. Mởrộng PostgreSQL với hàm tùy chọn.55
3.2.1. Hàm ngôn ngữtruy vấn (SQL) .55
3.2.2. Hàm sửdụng ngôn ngữlập trình C .59
3.2.3. Kiểu dữliệu do người dùng định nghĩa.67
3.2.4. Toán tửdo người dùng định nghĩa.71
3.2.5. Hàm tập hợp cho người dùng định nghĩa.73
3.3. Viết hàm mởrộng cho PostgreSQL.74
TỔNG KẾT.82
i thi người dùng truyền đúng kiểu dữ liệu cho biến khi sử dụng hàm. 3.3. Viết hàm mở rộng cho PostgreSQL Bài toán 1 : Tạo kiểu dữ liệu điểm trong không gian 3 chiều có tên là point3d gồm các thuộc tính hoành độ (x), tung độ (y), cao độ (z). Xây dựng toán tử, cộng điểm, trừ điểm. Xây dựng hàm tính khoảng cách giữa 2 điểm, so sánh giữa 2 điểm. Xây dựng hàm tập hợp, tính tổng các điểm có trong bảng dữ liệu. Tính trọng tâm của các điểm có trong bảng dữ liệu. 75 Thực hiện : Mục đích của bài toán là xây dựng kiểu dữ liệu điểm trong không gian 3 chiều, trên kiểu dữ liệu này, người dùng có thể thực hiện thao tác cộng, trừ, nhân, chia 2 điểm. Hơn nữa, người dùng có thể tìm được trọng tâm của các điểm trong không gian 3 chiều. - Tạo kiểu dữ liệu typedef struct point3d { float4 x; float4 y; float4 z; } point3d; - Tạo hàm nhập và hàm xuất PG_FUNCTION_INFO_V1(point3d_in_test); //hàm nhập Datum point3d_in_test(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); float4 x,y,z; point3d *result; if (sscanf(str, " ( %f , %f, %f )", &x, &y,&z) != 3) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for complex: \"%s\"",str))); result = (point3d *) palloc(sizeof(point3d)); result->x = x; result->y = y; result->z = z; 76 PG_RETURN_POINTER(result); } PG_FUNCTION_INFO_V1(point3d_out_test); //hàm xuất Datum point3d_out_test(PG_FUNCTION_ARGS) { point3d *point3D = (point3d *) PG_GETARG_POINTER(0); Char *result; result = (char *) palloc(100); snprintf(result, 100, "(%g %g %g)", point3D->x, point3D->y, point3D->z); PG_RETURN_CSTRING(result); } - Tạo hàm bằng truy vấn SQL CREATE FUNCTION point3d_out_test(point3d) RETURNS cstring AS 'point3d_test.so','point3d_out_test' LANGUAGE C STRICT IMMUTABLE; CREATE FUNCTION point3d_in_test(cstring) RETURNS point3d AS 'point3d_test.so','point3d_in_test' LANGUAGE C STRICT IMMUTABLE; Î kiểu dữ liệu point3d : CREATE TYPE point3d(internallength=16,input=point3d_in_test,ouput=poi nt3d_out_test); Như vậy, kiểu dữ liệu điểm trong không gian gọi là point3d có định dạng đầu vào thông qua hàm point3d_in_test, định dạng đầu ra thông qua hàm point3d_in_test; Sau khi đã có kiểu dữ liệu point3d, thực hiện công, trừ, tính khoảng cách giữa 2 điểm… 77 - Cộng 2 điểm PG_FUNCTION_INFO_V1(point3d_add); Datum point3d_add(PG_FUNCTION_ARGS) { point3d *point3d1=(point3d *)PG_GETARG_POINTER(0); point3d *point3d2=(point3d *)PG_GETARG_POINTER(1); point3d *point3d3=(point3d *)palloc(sizeof(point3d)); point3d3->x=point3d1->x+point3d2->x; point3d3->y=point3d1->y+point3d2->y; point3d3->z=point3d1->z+point3d2->z; PG_RETURN_POINTER(point3d3); } CREATE FUNCTION point3d_add(point3d, point3d) RETURNS point3d AS 'point3d_test.so', 'point3d_add' LANGUAGE C STRICT IMMUTABLE; CREATE OPERATOR + (leftarg=point3d, rigtharg=point3d, procedure=point3d_add, commutator=+); - Trừ 2 điểm PG_FUNCTION_INFO_V1(point3d_minus); Datum point3d_minus(PG_FUNCTION_ARGS) { point3d *point3d1=(point3d *)PG_GETARG_POINTER(0); point3d *point3d2=(point3d *)PG_GETARG_POINTER(1); point3d *point3d3=(point3d *)palloc(sizeof(point3d)); point3d3->x=point3d1->x-point3d2->x; point3d3->y=point3d1->y-point3d2->y; 78 point3d3->z=point3d1->z-point3d2->z; PG_RETURN_POINTER(point3d3); } CREATE FUNCTION point3d_minus(point3d,point3d) RETURNS point3d AS 'point3d_test.so', 'point3d_minus' LANGUAGE C STRICT IMMUTABLE; CREATE OPERATOR - (leftarg=point3d, rightarg=point3d, procedure=point3d_minus, commutator=-); - Tính khoảng cách giữa 2 điểm PG_FUNCTION_INFO_V1(distance_point3d); Datum distance_point3d(PG_FUNCTION_ARGS) { point3d *point3d1=(point3d *)PG_GETARG_POINTER(0); point3d *point3d2=(point3d *)PG_GETARG_POINTER(1); float4 result; float4 tmp1=(point3d1->x - point3d2->x)*(point3d1->x - point3d2->x); float4 tmp2=(point3d1->y - point3d2->y)*(point3d1->y - point3d2->y); float4 tmp3=(point3d1->z - point3d2->z)*(point3d1->z - point3d2->z); result=sqrt(tmp1+tmp2+tmp3); PG_RETURN_FLOAT4(result); } CREATE FUNCTION distance_point3d(point3d,point3d) RETURNS float AS 'point3d_test.so','point3d_add' LANGUAGE C STRICT IMMUTABLE; 79 - Hàm tính Point3d * float PG_FUNCTION_INFO_V1(point3d_multi_float); Datum point3d_multi_float(PG_FUNCTION_ARGS) { point3d *point3d1=(point3d *)PG_GETARG_POINTER(0); float8 m=PG_GETARG_FLOAT8(1); point3d *point3d2=(point3d *)palloc(sizeof(point3d)); point3d2->x=m*point3d1->x; point3d2->y=m*point3d1->y; point3d2->z=m*point3d1->z; PG_RETURN_POINTER(point3d2); } CREATE FUNCTION point3d_multi_float(point3d,float) RETURN point3d AS ‘point3d_test.so’, ‘point3d_multi_float’ LANGUAGE C STRICT IMMUTABLE; CREATE OPERATOR * (leftarg = point3d, rightarg=float, procedure = point3d_multi_float, commutator = * ); - Hàm tính Point3d / float PG_FUNCTION_INFO_V1(point3d_multi_float); Datum point3d_multi_float(PG_FUNCTION_ARGS) { point3d *point3d1=(point3d *)PG_GETARG_POINTER(0); float8 m=PG_GETARG_FLOAT8(1); point3d *point3d2=(point3d *)palloc(sizeof(point3d)); point3d2->x=point3d1->x/m; point3d2->y=point3d1->y/m; 80 point3d2->z=point3d1->z/m; PG_RETURN_POINTER(point3d2); } CREATE FUNCTION point3d_div_float(point3d,float) RETURN point3d AS ‘point3d_test.so’, ‘point3d_div_float’ LANGUAGE C STRICT IMMUTABLE; CREATE OPERATOR / (leftarg =point3d, rightarg = float, procedure=point3d_div_float, commutator = / ); - Tạo hàm tập hợp tính tổng các điểm CREATE AGGRAGATE sum_point3d(point3d)(sfunc=point3d_add, stype=point3d, initcond = ‘(0,0,0)’); - Trọng tâm của các điểm được tính theo công thức G= ∑ (pi * mi) / ∑ mi Với bảng dữ liệu mypoint3d (id int, a point3d, m float); thì tính trọng tâm của các điểm có trong cột a theo công thức : SELECT sum_point3d(a * m) / sum (m) as trong_tam FROM mypoint3d; Bài toán 2 : Tạo kiểu dữ liệu mô tả hình cầu trong không gian (sphere) có các thuộc tính tâm I (hoành độ x, tung độ y, cao độ z) và bán kính r. Xây dựng hàm tính thể tích hình cầu. Thực hiện : PostGIS chỉ hỗ trợ kiểu dữ liệu hình học bao gồm POINT, LINESTRING, POLYGON, nhưng chưa thấy xuất hiện kiểu hình cầu. Do vậy mục đích của bài toán là tạo ra kiểu dữ liệu hình cầu và xây dựng hàm tính thể tích hình cầu. - Tạo kiểu dữ liệu sphere bao gồm toạn độ của tâm hình cầu I(x,y,z) và bán kính hình cầu r được biểu diễn : Typedef struct sphere { float4 x, float4 y, 81 float4 z, float4 r }; - Tương tự, tạo hàm nhập và hàm xuất dữ liệu có tên sphere_in() và sphere_out() - Kiểu dữ liệu hình cầu CREATE TYPE sphere (internallength = 16, input = sphere_in, output = sphere_ou,); - Tạo hàm tính thể tích hình cầu : PG_FUNCTION_INFO_V1(sphere_area); Datum sphere_area(PG_FUNCTION_ARGS) { float8 tmp,result; sphere *mysphere=(sphere *)PG_GETARG_POINTER(0); tmp=(mysphere->r) * (mysphere->r) * (mysphere->r); result=4.0/3.0 * M_PI * tmp; PG_RETURN_FLOAT8(result); } CREATE FUNCTION sphere_area(sphere) returns float as ‘sphere.so’,’sphere_area’ LANGUAGE C STRICT IMMUTABLE; Như vậy, kiểu dữ liệu hình cầu trong không gian gọi là sphere đã được tạo, có định dạng đầu vào thông qua hàm sphere_in, định dạng đầu ra thông qua hàm sphere_out; từ đó, để tính thể tích hình cầu rât đơn giản, tính theo công thức : Thể_tích = 4/3 * M_PI * r3 ; 82 TỔNG KẾT Sau một thời gian nghiên cứu và tìm hiểu, khóa luận đã thu được các kết quả như sau: • Cài đặt, thao tác thành thạo với hệ quản trị CSDL PostgreSQL thông qua các kiểu giao tương tác. Ngoài ra, nắm rõ được lịch sử phát triển và những ưu điểm của nó so với các hệ quản trị khác. • Đối với PostGIS – mô dun mở rộng cho PostgreSQL. Tôi đã trình bày những kiến thức như cách tạo CSDL không gian, cách xử lý với dữ liệu không gian…đặc biệt là nắm được tác dụng và cách sử dụng các hàm hỗ trợ của PostGIS và đã sử dụng thử nghiệm số lượng lớn các hàm đó. Từ đó, áp dụng các hàm đó vào truy vấn không gian trong bảng không gian. • Với phần mở rộng trong PostgreSQL, tôi đã trình bày khá chi tiết về cách mở rộng trong PostgreSQL. Từ đó nắm rõ được cách viết mở rộng, sử dụng các mở rộng và áp dụng nó vào một số bài toán cụ thể. • Phần thực nghiệm của KLTN đã định nghĩa một số kiểu dữ liệu không gian mở rộng và viết các hàm truy vấn….. Trong khóa luận này, tôi hy vọng đã đưa ra những kiến thức cần thiết nhất về hệ quản trị CSDL PostgreSQL và PostGIS – mô dun mở rộng của PostgreSQL. Với kiến thức về PostGIS hỗ trợ truy vấn trong CSDL PostgreSQL, tôi mong rằng chúng sẽ được áp dụng một cách thiết thực vào đời sống thực tế. 83 TÀI LIỆU THAM KHẢO Sách: [1] Ewald Geschwinde and Hans-Juergen Schoening, PHP and PostgreSQL Advanced Web Programming, 2002, Sams Publishing. [2] Korry Dougla and Susan Douglas, The comprehensive guide to building programming and administering PostgreSQL database, 2nd, 2005, Sams Publishing. [3] Paul Ramsey, PostGIS Workshop, Refractions Research, Suite 300 – 1207 Douglas Street, Victoria – British Columbia, CANADA – V8W 2E7 [4] PostGIS 1.5.0 Manual [5] Ralf Hartmut Gueting, An introdution to databases system, Praktische Informatik IV, FenUniversity Hagen, Germany [6] The PostgreSQL Global Development Group, PostgreSQL 8.4 Documentation, 1996- 2009. [7] W.Jason Gilmore and Robert H.Treat, Beginning PHP and PostgreSQL 8: From Novice to Professional, Feb 2006, Kinetic Publishing Service. Web [1] www.postgis.refractions.net [2] www.postgresql.org [3] www.vi.wikipedia.org/wiki/So_sánh_các_hệ_quản_trị_cơ_sở_dữ_liệu_quan_hệ [4] www.vi.wikipedia.org/wiki/Shapefile 84
File đính kèm:
- Đề tài Nghiên cứu và phát triển hệ quản trị cơ sở dữ liệu không gian PostgreSQL.pdf