Đề 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

pdf84 trang | Chuyên mục: Hệ Cơ Sở Dữ Liệu Không Gian | Chia sẻ: dkS00TYs | Lượt xem: 2314 | Lượt tải: 1download
Tóm tắt nội dung Đề tài Nghiên cứu và phát triển hệ quản trị cơ sở dữ liệu không gian PostgreSQL, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfĐề 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
Tài liệu liên quan