84
1 MC LC Chương 1. TNG QUAN VCƠ SDLIU KHÔNG GIAN ................................. 7 1.1. Tng quan vcơ sdliu không gian................................................................. 7 1.1.1. CSDL không gian ........................................................................................... 7 1.1.2. Đặc trưng ca 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. Mi quan hkhông gian là gì? .............................................................................. 9 1.3.1. Phân loi ......................................................................................................... 9 1.3.2. Kết hp hình hc vào mô hình dliu 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 vi mt shcơ squn trdliu khác .................. 12 2.1.3. Qun trcơ sdliu qua giao din ............................................................ 15 2.2. PostGIS .................................................................................................................... 23 2.2.1. Gii thiu vPostGIS................................................................................... 23 2.2.2. Công cshp2pgsql ....................................................................................... 24 2.2.3. Công cpsql ................................................................................................. 25 2.2.4. Phương pháp load dliu định dng file .sql............................................... 25 2.2.5. Phương pháp load dliu dng shape file vào CSDL ...................................... 26 2.2.6. OpenGIS Well-Know Text........................................................................... 27 2.2.7. Bng siêu dliu .......................................................................................... 28 2.2.8. Bng không gian........................................................................................... 30 2.3. Hàm trong PostGIS ................................................................................................. 32 2.3.1. Nhóm hàm điu khin ................................................................................... 32 2.3.2. Nhóm hàm khi to hình hc ........................................................................ 33 2.3.3. Hàm trvkiu hình hc đầu ra. ............................................................... 34 2.3.4. Hàm xác định mi quan hkhông gian......................................................... 34 2.3.5. Nhóm hàm đưa ra đối tượng hình mi......................................................... 40 2.3.6. Nhóm hàm thay đổi hình hc ...................................................................... 42 2.3.7. Nhóm hàm accessor ..................................................................................... 44 2.4. Chmc .................................................................................................................... 45 2.4.1. Chmc GiST ............................................................................................. 45 2.4.2. Sdng chmc ......................................................................................... 45 2.5. Truy vn trong cơ sdliu không gian............................................................. 47 2.5.1. Mô tvcơ sdliu không gian ............................................................... 47

Huongnt Dh

Embed Size (px)

DESCRIPTION

free

Citation preview

  • 1

    MC LC Chng 1. TNG QUAN V C S D LIU KHNG GIAN.................................7

    1.1. Tng quan v c s d liu khng gian.................................................................7 1.1.1. CSDL khng gian...........................................................................................7 1.1.2. c trng ca CSDL khng gian ...................................................................7

    1.2. M hnh..................................................................................................................8 1.2.1. POINT ............................................................................................................8 1.2.2. LINE...............................................................................................................8 1.2.3. POLYGON.....................................................................................................9

    1.3. Mi quan h khng gian l g? ..............................................................................9 1.3.1. Phn loi .........................................................................................................9 1.3.2. Kt hp hnh hc vo m hnh d liu DBMS.............................................10

    Chng 2. POSTGRESQL V POSTGIS....................................................................12 2.1. PostgreSQL..............................................................................................................12

    2.1.1. nh ngha....................................................................................................12 2.1.2. So snh PostgreSQL vi mt s h c s qun tr d liu khc ..................12 2.1.3. Qun tr c s d liu qua giao din ............................................................15

    2.2. PostGIS ....................................................................................................................23 2.2.1. Gii thiu v PostGIS...................................................................................23 2.2.2. Cng c shp2pgsql .......................................................................................24 2.2.3. Cng c psql.................................................................................................25 2.2.4. Phng php load d liu nh dng file .sql...............................................25 2.2.5. Phng php load d liu dng shape file vo CSDL......................................26 2.2.6. OpenGIS Well-Know Text...........................................................................27 2.2.7. Bng siu d liu..........................................................................................28 2.2.8. Bng khng gian...........................................................................................30

    2.3. Hm trong PostGIS.................................................................................................32 2.3.1. Nhm hm iu khin ...................................................................................32 2.3.2. Nhm hm khi to hnh hc........................................................................33 2.3.3. Hm tr v kiu hnh hc u ra. ...............................................................34 2.3.4. Hm xc nh mi quan h khng gian.........................................................34 2.3.5. Nhm hm a ra i tng hnh mi.........................................................40 2.3.6. Nhm hm thay i hnh hc ......................................................................42 2.3.7. Nhm hm accessor .....................................................................................44

    2.4. Ch mc....................................................................................................................45 2.4.1. Ch mc GiST .............................................................................................45 2.4.2. S dng ch mc .........................................................................................45

    2.5. Truy vn trong c s d liu khng gian.............................................................47 2.5.1. M t v c s d liu khng gian ...............................................................47

  • 2

    2.5.2. Truy vn .......................................................................................................49 Chng 3. M RNG TRUY VN KHNG GIAN POSTGRESQL ......................54

    3.1. Cc kiu d liu trong PostgreSQL .........................................................................54 3.1.1. Kiu d liu c bn ......................................................................................54 3.1.2. Kiu d liu hn hp....................................................................................55

    3.2. M rng PostgreSQL vi hm ty chn..............................................................55 3.2.1. Hm ngn ng truy vn (SQL) ....................................................................55 3.2.2. Hm s dng ngn ng lp trnh C ..............................................................59 3.2.3. Kiu d liu do ngi dng nh ngha........................................................67 3.2.4. Ton t do ngi dng nh ngha. ..............................................................71 3.2.5. Hm tp hp cho ngi dng nh ngha.....................................................73

    3.3. Vit hm m rng cho PostgreSQL.....................................................................74 TNG KT.......................................................................................................................82

  • 3

    LI NI U

    Ngy nay, cng vi s pht trin ca x hi, ngnh CNTT cng c nhiu bc pht trin ng k v dn i vo cuc sng ca mi ngi v c s dng hu ht trong tt c cc ngnh ngh trong x hi. Vi s lng ti liu trong cc c quan, t chc tng theo cp s nhn theo tng nm, tng thi k, th vic lu tr s lng ti liu tr nn v cng kh khn, c bit khi n l nhng ti liu quan trng m li c lu tr trn cc thit b cng. Yu t thi gian, cc tc ng bn ngoi c th lm cho nhng ti liu b hng hc, kh bo qun. Do , nhu cu s dng cc phn mm h tr kh nng lu tr cc d liu m bo cc yu t an ton v tin li trong thao tc vi d liu l v cng cn thit. V nhu cu s tr nn d dng khi c s vo cuc ca CNTT, c bit l cc h qun tr c s d liu (CSDL).

    Ni n CNTT th khng th khng ni n cc h qun tr c s d liu. l phn mm hay h thng c thit k qun tr mt CSDL, n h tr kh nng lu tr, sa cha, xa v tm kim trong tin trong mt CSDL. V c rt nhiu loi h qun tr CSDL khc nhau : t phn mm nh chy trn my tnh c nhn cho n nhng h qun tr phc tp chy trn mt hoc nhiu siu my tnh. Chng ta c th k ti cc h qun tr CSDL nh: MySQL, Oracle, SQL Server, PostgreSQLv mi loi trn c nhng tnh nng, li ch ring.

    c bit, h qun tr CSDL postgreSQL c nhng tnh nng v li th hn hn cc h qun tr CSDL khc. PostgreSQL l s la chn s dng ca nhiu ngi v n c nhiu u im ni tri so vi cc h qun tr CSDL khc. Th nht, PostgreSQL l phn mm m ngun m, min ph hon ton trong s dng. Th hai, hiu sut lm vic ca PostgreSQL chnh lch so vi cc h qun tr khc trong sai s +/-10%. Th ba, y l h qun tr c tin cy cao, bng chng l qu trnh pht trin ca n. Th t, PostgreSQL cn c th chy c trn rt nhiu h iu hnh khc nhau nh Window, Linux, Unix, MacOSXV cui cng, mt tnh nng ni tri ca PostgreSQL l kh nng m rng hm, kiu d liu, ton tngi s dng c th t nh ngha hm, kiu d liu, kiu ton tv c th thm nhng kiu d liu, ton tvo h qun tr CSDL PostgreSQL.

    Ngoi ra, do ngoi nhu cu lu tr cc kiu d liu thng thng nh kiu chui, kiu s, kiu ngy thng, ngi s dng cn c thm nhu cu lu tr cc kiu d liu khng gian lu tr cc i tng nh Point, Line, Polygon. Do , PostgreSQL cn h

  • 4

    tr kiu d liu hnh hc (geometry) nh Point, Line, PolygonV PostGIS chnh l cng c c b sung cho PostgreSQL h tr hin th i tng a l. Nh PostGIS, kh nng khng gian trong PostgreSQL c kch hot, n cho php PostgreSQL s dng nh mt CSDL khng gian ph tr cho cc h thng thng tin a l.

    PostGIS l mt m ngun m, m rng khng gian cho PostgreSQL. CSDL khng gian trong PostGIS c s dng cho hiu sut s dng cao a ngi dng truy cn n tp d liu c tnh lin mch. Nu bn qun l s lng ln c/ghi d liu khng gian, th vic s dng CSDL khng gian c th ci thin c tc truy cp, d dng qun l v m bo tnh ton vn d liu. c xy dng nh phn m rng i tng cho PostgreSQL, PostGIS c chng nhn l Simple Features for SQL, tun th theo Open Geospatial Consortium. PostGIS c pht hnh ln u tin vo nm 2001, v hin ang c s dng trn khp th gii nh mt my ch hot ng vi hiu sut cao cho cc i tng khng gian.

    PostGIS cung cp vic to v thao tc trn CSDL khng gian. CSDL khng gian cng l CSDL thng thng, nhng n b sung thm cc kiu d liu khng gian v cc mi quan h gia cc kiu d liu . Mt CSDL khng gian bao gm rt nhiu bng d liu khng gian, ngoi cc thuc tnh c kiu d liu thng thng th bng khng gian cn cha mt thuc tnh c kiu d liu khng gian m t v mt i tng thc trong thc t.

    Truy vn khng gian l g? L cc cu lnh truy vn c thc hin trn bng khng gian trong CSDL tm ra mi quan h gia cc i tng trong khng gian, mi quan h c th l s giao nhau, tnh khong cch, tnh din tch, tnh chu vi, tnh chiu div cc cu lnh truy vn c vit ra d dng hn nh cc hm h tr sn ca PostGIS. PostGIS cung cp cc nhm hm h tr vic truy vn nh nhm hm xc nh mi quan h khng gian, nhm hm tr v i i tng minh , vic thc hin truy vn trong khng gian s tr nn d dng v d thao tc hn.

    Vi nhng u im ni tri , h qun tr CSDL PostgreSQL xng ng l la chn ca nhiu ngi s dng, c bit vi s h tr ca cng c m rng PostGIS, vic lu tr cc i tng khng gian khng cn kh khn na.

    Trong phm vi nghin cu ca ti, chng em tp trung vo vic nghin cu cc vn sau :

  • 5

    Th nht, nghin cu v CSDL khng gian, qua , gip chng ta c ci nhn tng quan v CSDL khng gian,

    Th hai, tm hiu tng quan v h qun tr PostgreSQL, qua , chng ta c th bit c u, nhc im ca h qun tr ny so vi cc h qun tr CSDL khc. Ngoi ra, phn gii thiu v giao din tng tc gip ch cho vic thao tc vi h qun tr PostgreSQL c d dng

    Th ba, PostGIS l cng c m rng cho PostgreSQL, n gip PostgreSQL lu tr, thao tc c vi CSDL khng gian. Chng ti c gii thiu v cch to CSDL khng gian, cch load d liu khng gian c sn vo CSDL. Ngoi ra, chng ti cn cung cp danh sch cc nhm hm m PostGIS h tr sn, lm cng c cho vic thc hin truy vn trong khng gian.

    V cui cng, chng ti c a ra ni dung v cch to m rng hm, m rng kiu d liu, m rng kiu ton t v m rng hm tp hp cho h qun tr CSDL PostgreSQL. T ngi dng bit cch to phn m rng cho PostgreSQL cho mc ch s dng ca mnh.

  • 6

    DANH SCH CC BNG Bng 2-1: So snh v h iu hnh h tr .........................................................................14 Bng 2-2: So snh v cc tnh nng c bn.......................................................................14 Bng 2-3: So snh v s h tr bng tm v khung nhn..................................................14 Bng 2-4: So snh v chc nng nh ch mc.................................................................15 Bng 2-5: So snh v cc i tng khc .........................................................................15 Bng 2-6: Danh sch cc ty chn ca psql ......................................................................16 Bng 2-7: Nhm lnh chung ca psql ...............................................................................18 Bng 2-8: Nhm lnh truy vn b m ca psql ...............................................................18 Bng 2-9: Nhm lnh vo / ra ca lnh psql .....................................................................18 Bng 2-10: Nhm lnh tr v thng tin .............................................................................18 Bng 2-11: Nhm lnh nh dng ca psql .......................................................................19 Bng 2-12: Danh sch lnh \h ...........................................................................................20 Bng 2-13: Danh sch cc ty chn ca sph2pgsql ..........................................................23 Bng 2-14: Cc v d minh ha cho hm ST_Buffer() .....................................................42 Bng 3-1: Danh sch kiu d liu trong SQL v trong C .................................................58

    DANH SCH CC HNH Hnh 1-1: M hnh i tng LINE ..................................................................................11 Hnh 1-2: M hnh i tng POLYGON ........................................................................11 Hnh 2-1: Minh ha hm ST_Touches() ...........................................................................35 Hnh 2-2: Minh ha hm ST_Within()..............................................................................36 Hnh 2-3: Minh ha hm ST_Contains()...........................................................................37 Hnh 2-4: Minh ha hm ST_Difference()........................................................................39 Hnh 2-5: Minh ha hm ST_Union() ...............................................................................40

    DANH SCH CC T VIT TT

    CSDL : C s d liu

  • 7

    Chng 1. TNG QUAN V C S D LIU KHNG GIAN

    1.1. Tng quan v c s d liu khng gian

    1.1.1. CSDL khng gian

    L mt h thng CSDL quan h :

    1). Cung cp cc kiu d liu khng gian trong m hnh d liu v cc ngn ng truy vn

    2). H tr cc kiu d liu khng gian trong vic thc thi chnh n, cung cp cc kiu nh ch mc thc thi truy vn nhanh nht t bng d liu ln.

    Gii thch :

    1). Cc kiu d liu khng gian nh Point, Line, Polygon. CSDL khng gian cung cp cung cp m hnh tru tng c bn cho cu trc ca thc th hnh hc trong khng gian cng nh mi quan h gia chng nh quan h giao nhau (intersects(a, b)), thuc tnh nh din tch, chu vi ca m hnh (area(a) hay perimeter(a)), hoc tm im giao gia 2 m hnh (intersection(a.b)).

    2). Vic nh ch mc cho d liu l v cng quan trng, n gip ch cho vic ti u ha truy vn d liu, gim thi gian truy vn, gim b nh lu tr

    1.1.2. c trng ca CSDL khng gian

    - C s d liu khng gian s ng nh ch mc khng gian tng tc hot ng ca c s d liu

    - Ngoi cc truy vn SQL in hnh nh cu lnh SELECT, CSDL khng gian c th thc thi a dng cc thao tc khng gian. V n c h tr bi OGC :

    o lng khng gian : n c kh nng tm khong cch gia cc im, cc vng Hm khng gian : v d nh, sa i cc hm hin thi to ra nhng hnh mi :

    hm tm im hay vng giao nhau

    Xc nhn khng gian : n cho php thc hin nhng truy vn True/False. Hm to : to ra cc hnh mi, nh ch ra cc im nt c th to nn ng, hay

    nu nh u v nh cui trng nhau, chng c th to nn mt a gic.

  • 8

    Hm theo di : cc cu truy vn tr v thng tin c th nh : v tr tm ca mt ng trn hay im u, im cui ca mt ng

    1.2. M hnh

    C hai i tng quan trng cn c hin th l :

    1). i tng trong khng gian : l nhng i tng trong khng gian, m t hnh hc ca ring chng

    2). Khng gian

    i tng n: i tng c bn l Point, Line, Polygon

    1.2.1. POINT

    - nh ngha : hin th mt i tng m ch c v tr ca n trong khng gian.

    VD : mt thnh ph c th c m phng nh 1 im trong m hnh m t 1 khu vc rng ln v a l.

    - c im :

    + L ta n.

    + Khng cn th hin chiu di v din tch

    + im c s dng hin th cho cc vng khi chng c hin th quy m nh.

    + Khng c php o no c p dng cho im.

    1.2.2. LINE

    - nh ngha : c xc nh nh mt tp hp dy cc im, m t i tng a l dng tuyn tnh.

    - c im :

    + L mt dy cc cp ta .

    + Bt u v kt thc l mt im.

    + Cc ng ni vi nhau hoc ct nhau ti mt im.

    + Hnh dng ca c c nh ngha bi ta ca im.

  • 9

    + Cng nh tnh nng ca im, ng cng c hin th quy m nh hin th l ng n l mt a gic.

    + C php o khong cch i vi ng.

    Hnh 1-1 : M hnh i tng LINE

    1.2.3. POLYGON

    - nh ngha : c xc nh bi ranh gii cc ng thng. Cc i tng a l c din tch v ng kn bi mt c c gi l vng.

    VD : h, cc to nh, cng vin, thnh ph

    - c im :

    + Vng c m t bng tp cc ng v im

    + Mt hoc nhiu ng l ng bao ca vng.

    + C php tnh chu vi v din tch cho a gic.

    Hnh 1-2 : M hnh i tng POLYGON

    1.3. Mi quan h khng gian l g?

    Mi quan h khng gian ch ra mi quan h gia cc i tng trong khng gian

    1.3.1. Phn loi

  • 10

    C 3 mi quan h khng gian ph bin nht l :

    Quan h topo : nh lin k, phn chiav cc php bin i topo nh php dch chuyn, php xoay

    Quan h nh hng Quan h nh hng c th phn lm 2 loi : quan h nh hng bn ngoi v quan h nh hng bn trong. Quan h nh hng bn trong ch ra mt i tng c t bn trong mt i tng tham chiu, cn quan h nh hng bn ngoi ch ra i tng c t bn ngoi mt i tng tham chiu.

    Quan h khong cch Ch ra khong cch t i tng c th n i tng tham chiu.

    1.3.2. Kt hp hnh hc vo m hnh d liu DBMS

    tng chnh ca vic kt hp cc m hnh hnh hc vo trong m hnh d liu DBMSS th hin cc i tng khng gian- cc i tng c th l dng sng, t nc, thnh phbng cc i tng hnh hc trc tin l thuc tnh ca loi d liu khng gian. V c bn, m hnh d liu DBMS lun h tr sn cc kiu d liu nh integer, string hoc c th l kiu d liu do ngi dng nh ngha. Ngoi ra, vi CSDL khng gian, m hnh d liu DBMS cn h tr mt s kiu khc nh kiu hnh hc nh kiu Point, kiu Line

    VD: M t c im ca sng, hay m t c im ca thnh ph ta c cc bng d liu:

    Rivers (rname : STRING, route : LINE)

    Cities (cname : STRING, center : POINT, ext : POLYGON, cpop : INTEGER)

    Nu 2 bng d liu cities v rivers, ngoi kiu d liu thng thng nh STRING v INTEGER, cn c kiu d liu hnh hc nh LINE, POINT, POLYGON. ng nh m t ca tng kiu i tng LINE, POINT, POLYGON.

    biu din cc i tng khng gian trong m hnh 2chiu, cch thng thng l s dng cch biu din h ta .

    VD : biu din mt im, POINT (0,0) : im nm ti ta (0,0)

  • 11

    Biu din mt ng LINE (0 0, 1 1, 1 2) : ng ni 3 im nm ln lt ti cc ta (0,0) -> (1,1) -> (1, 2)

  • 12

    Chng 2. POSTGRESQL V POSTGIS

    2.1. PostgreSQL

    2.1.1. nh ngha

    Vo nm 1986, gio s i hc California Berkeley v chuyn gia cng ngh v c s d liu Michael Stonebraker a ra vn l phi xy dng h thng c s d liu tt hn. Mc d c nhng thnh cng vi d n c s d liu trc , do INGRES nghin cu ra, Stonebraker quyt nh pht trin ln da trn nn tng c. V kt qu ca s pht trin l Postgres.

    Trong 8 nm tip , POSTGRES pht trin mt cch ph bin, c bit l trong cng ng nghin cu. Qua mt qu trnh pht trin lu di, bn PostgreSQL 6.0 c chnh thc ra i n da trn nn tng ca POSTGRES trc v thm vo cc thc thi SQL. Ngy nay, PostgreSQL l mt trong nhng d n ngun m ph bin nht trn Internet.

    PostgreSQL l h thng qun tr c s d liu quan h i tng da trn POSTGRES bn 4.2, c pht trin ti trng i hc California ti phng nghin cu my tnh Berkeley. [1]. N l mt chng trnh m ngun m xy dng trn m ngun ban u ca i hc Berkeley. N h tr mt phn rt ln cho SQL chun v cung cp nhiu tnh nng hin i nh :

    Cc truy vn phc tp Kha ngoi Trigger Khung nhn Tnh ton vn ca cc giao dch Kim tra truy cp ng thi a phin bn.

    Ngoi ra, PostgreSQL c th c m rng bi nhiu ngi dng bng nhiu cch, v d, ngi dng c th thm kiu d liu, hm, ton t, hm tp hp, phng thc nh ch mc v ngn ng th tc.

    2.1.2. So snh PostgreSQL vi mt s h c s qun tr d liu khc

  • 13

    Vic so snh h qun tr PostgreSQL vi mt s h qun tr c s d liu khc gip chng ta c ci nhn tng quan v u, nhc im ca h qun tr postgreSQL. Thng tin c a ra so snh nh : h iu hnh h tr, cc tnh nng c bn, h tr bng v khung nhn, chc nng nh ch mc, v cc i tng khc.

    a. H iu hnh h tr

    Bng 2-1 : So snh v h iu hnh h tr

    b. Cc tnh nng c bn

    Bng 2-2 : So snh v cc tnh nng c bn.

    c. H tr bng v khung nhn

    Bng 2-3 : So snh v s h tr bng tm v khung nhn

    d. Ch mc

  • 14

    Bng 2-4 : So snh v chc nng ch mc

    e. Cc i tng khc

    Bng 2-5 : So snh v cc i tng khc

    Nu theo di cc bng t 1.1.2.a->1.1.2.e so snh gia 3 h qun tr c s d liu MySQL, Oracle v PostgreSQL th thy rng, h qun tr c s d liu PostgreSQL rt mnh, n hot ng c trn hu ht cc h iu hnh, h tr rt nhiu tnh nng c bn, v h tr rt nhiu kiu nh ch mc.

    Ngy nay, PostgreSQL l mt trong nhng h qun tr c s ln nht hin c. Vi nhng tnh nng c ch ra di y, chng ta c ci nhn tng quan v PostgreSQL :

    Trong quan h i tng PostgreSQL, mi bng nh ngha nh mt lp. PostgreSQL thc thi k tha gia cc bng, hm v ton t l a hnh.

    C php chun ca PostgreSQL tun th theo chun ca SQL92 v nhiu tnh nng ca SQL99.

  • 15

    PostgreSQL cung cp nhiu kiu d liu. Bn cnh kiu d liu numeric, string thng thng, n cn cung cp kiu d liu geometry, boolean v kiu d liu c thit kt c bit dng cho cc a ch mng.

    Kh nng m rng l mt trong nhng tnh nng ca PostgreSQL l n c th c m rng. Nu vi nhng g m PostgreSQL cung cp m bn vn cha hi lng, bn c th thm vo PostgreSQL nhng g ca bn. V d, bn c th thm vo kiu d liu mi, hm v ton t mi v cc th tc mi.

    2.1.3. Qun tr c s d liu qua giao din

    psql Kiu giao din chnh thao tc c s d liu ca PostgreSQL l chng trnh dng lnh psql. Nh chng trnh dng lnh ny, ngi dng c th thc hin truy vn SQL mt cch trc tip, v thc thi chng t tp tin. Hn na, psql cn cung cp mt s lng ln cc ty chn lnh , to iu kin tt vit cc cu lnh truy vn v t ng ha nhiu nhim v.

    Cu trc lnh : psql [option...][dbname [username]]

    Bng 2-6 : Danh sch cc ty chn ca lnh psql

    Ty chn Gii thch

    -c COMMAND Thc thi 1 dng lnh n v sau thot

    -d NAME Ch ra CSDL. Mc nh l ti khon hin ti ca bn

    -f NAME Thc thi lnh nm trong tp tin xc nh l FILENAME, v sau thot

    -h HOSTNAME Ch ra HOSTNAME

    --help Lit k thc n tr gip v sau thot

    -l Lit k tt c CSDL ang sn sng v thot

  • 16

    -p PORT Ch ra cng kt ni CSDL. Mc nh l 5432

    -U NAME Ch ra username ang kt ni vi CSDL. Mc nh l user hin ti

    a. Kt ni n CSDL

    Thao tc kt ni n CSDL l thao tc u tin cn phi lm trc khi thc hin cc thao tc khc vi psql. kt ni n CSDL, yu cu bit tn CSDL, a ch host v cng ca my ch v tn ngi dng m bn mun kt ni. psql cung cp cc tham s cho vic thao tc kt ni : -d (tn CSDL), -h (a ch host), -p (a ch cng), -U (tn ngi dng). Nu khng th cung cp y cc thng tin trn, th yu cu ti thiu nht l bn cn phi cung cp thng tin v CSDL v tn ngi dng. l yu cu ti thiu kt ni n CSDL.

    V d n gin, kt ni n CSDL c tn l testdb, tn ngi dng l postgres

    %>psql d testdb U postgres

    Welcome to psql 8.1.20, the PostgreSQL interactive terminal.

    Type: \copyright for distribution terms

    \h for help with SQL commands

    \? for help with psql commands

    \g or terminate with semicolon to execute query

    \q to quit

    testdb=>

    theo di cc ty chn trn, \h lit k tt c cc cu lnh SQL m psql c h tr, ty chn \? Lit k tt c cc lnh psql, \q ngt kt ni.

    b. Lnh trong psql

    Nh ni trn, lit k tt c cc cu lnh thao tc trong psql, chng ta s dng ty chn \?. Vi ty chn \?, kt qu l mt danh sch ca hn 50 lnh v c chia thnh 6 nhm. Bn di l danh sch cc lnh v cc nhm tng ng :

  • 17

    Bng 2-7: Nhm lnh chung ca psql

    Tn lnh Chc nng s dung

    \c [DBNAME] Kt ni n c s d liu

    \cd [DIR] Thay i th mc lm vic hin ti

    \q Thot khi psql

    \h Tr gip c php lnh SQL, chn * nu mun xem tt c

    Bng 2-8: Nhm lnh truy vn b m ca psql

    Tn lnh Chc nng s dng

    \e [FILE] Chnh sa truy vn b m hoc file vi b son tho

    \p a ra ni dung ca truy vn b m ( thc hin ngay trc )

    \g [FILE] Gi truy vn b m n my ch v kt qu ra file

    \r Reset li truy vn

    \s [FILE] Hin th lch s lnh hoc lu n li vo mt file

    \w [FILE] Vit truy vn b m vo file cu lnh thc hin ngay trc .

  • 18

    Bng 2-9: Nhm lnh vo / ra ca psql

    Tn lnh Chc nng s dung

    \echo [STRING] Vit ra chui, kt qu mn hnh

    \i [FILE] Thc thi lnh t file

    \o [FILE] Gi tt c cc kt qu truy vn vo file hoc ng ng

    Bng 2-10: Nhm lnh thng tin ca psql

    Tn lnh Chc nng s dng

    \d [NAME] a ra thng tin v bng, ch mc hoc khung nhn

    \d {t | i| s | v | S} Lit k ra bng/ch mc/khung nhn/trnh t

    \da Lit k cc hm tp hp

    \db Lit k tt c cc tablespace

    \dc Lit k tt c cc conversion (qu trnh chuyn i)

    \df Lit k danh sch cc hm

    \l Lit k danh sch tt c cc c s d liu

    Bng 2-11: Nhm lnh nh dng ca psql

    Tn lnh Chc nng s dng

  • 19

    \a Cn ln

    \c [STRING] a ra tiu v chui nhp

    \f [STRING] a ra du ngn cch v chui nhp

    Tuy nhin, trong khun kh ti liu ny, chng ti ch a ra cc lnh c coi l thng xuyn s dng trong qu trnh thao tc vi psql.

    c. Kt ni n CSDL mi

    Trong sut qu trnh thao tc, c th bn cn phi lm vic vi nhiu hn mt CSDL. Do vy, thay i CSDL n CSDL mi, chng ta c th thao tc vi ty chn\connect hoc \c theo c php sau : \connect [tn c s d liu mi]

    VD : testdb=> \connect postgresdb

    d. Thc thi dng lnh c nh v trong mt file xc nh

    Vic thao tc vi nhng dng lnh nhiu ln c th gy nhm chn cho ngi dng, i khi cn gy ra li khng mong mun. C mt cch rt n gin, chng ta c th lu nhng dng lnh thng xuyn c s dng vo mt file ring bit, sau , khi mun thc hin, chng ta ch cn gi file bng ty chn \i theo c php sau :

    \i [tn file .sql]

    VD : testdb=> \i audit.sql

    e. Chnh sa file

    Cc dng file ni trn c nhim v lu nhng dng lnh thng xuyn c s dng khng phi lc no cng chnh xc vi nhng g bn mong mun. thc hin sa i file ngay ti giao din ca psql, chng ta ch cn s dng ty chn \e chnh sa file theo c php sau :

    \e [tn file .sql]

    VD : testdb=> \e audit.sql

    f. Lu kt qu truy vn vo file

  • 20

    Nu bn mun lu kt qu sau truy vn vo mt file thun li cho mc ch s dng ca bn, bn c th s dng ty chn \o theo c php sau :

    \o [tn file .sql]

    VD : testdb=> \e ouput.sql

    g. Cc cu lnh SQL c psql h tr

    Ty chn \h cho chng ta mt bng danh sch cc cu lnh SQL c psql h tr.

    Bng 2-12 : Danh sch lnh \h

    ABORT CREATE LANGUAGE DROPVIEW

    ALTER AGGREGATE CREATE OPERATOR CLASS

    END

    ALTER CONVERSION CREATE OPERATOR EXECUTE

    ALTER DATABASE CREATE ROLE EXPLAIN

    ALTER DOMAIN CREATE RULE FETCH

    ALTER FUNCTION CREATE SCHEMA GRANT

    ALTER GROUP CREATE SEQUENCE INSERT

    ALTER LANGUAGE CREATE TABLE LISTEN

    ALTER INDEX CREATE TABLE AS LOAD

    ALTER OPERATOR CLASS

    CREATE TABLESPACE LOCK

    ALTER OPERATOR CREATE TRIGGER MOVE

    ALTER ROLE CREATE TYPE NOTIFY

  • 21

    ALTER SCHEMA CREATE USER PREPARE

    ALTER TABLE DEALLOCATE REINDEX

    ALTER TABLESPACE DECLARE RELEASE SAVEPOINT

    ALTER TRIGGER DELETE RESET

    ALTER TYPE DROP AGGREGATE REVOKE

    ALTER USER DROP CAST ROLLBACK

    ANALYZE DROP CONVERSION ROLLBACK PREPARED

    BEGIN DROP DATABASE ROLLBACK TO SAVEPOINT

    CHECKPOINT DROP DOMAIN SAVEPOINT

    CLOSE DROP FUNCTION SELECT

    CLUSE DROP GROUP SELECT INTO

    COMMENT DROP INDEX SET

    COMMIT DROP LANGUAGE SET CONSTRAINTS

    COMMIT PREPARED DROP OPERATOR CLASS

    SET ROLE

    COPY DROP OPERATOR SET SESSION AUTHORIZATION

    CREAT AGGREGATE DROP ROLE SET TRANSACTION

    CREATE CAST DROP RULE SHOW

    CREATE CONSTRAINT DROP SCHEMA START TRANSACTION

  • 22

    TRIGGER

    CREATE CONVERSION DROP SEQUENCE TRUNCATE

    CREATE DATABASE DROP TABLE UNLISTEN

    CREATE DOMAIN DROP TABLESPACE UPDATE

    CREATE FUNCTION DROP TRIGGER VACUUM

    CREATE GROUP DROP TYPE

    CREATE INDEX DROP USER

    Quan st bng 2-12 ta thy rng, h thng h tr rt nhiu lnh, tuy nhin, trong khun kh kha lun ny, ti ch s dng cc lnh thng dng nh SELECT, INSERT INTO, CREATE TABLE, DROP TABLE tm hiu k hn v mt lnh c th, chng ta thc thi lnh theo c php \h [lnh]. V d, hiu hn v lnh INSERT, thc thi lnh :

    corporate=> \h INSERT

    Kt qu thu c bao gm cc thng tin : tn lnh, gii thch, v c php lnh.

    Nh bit, psql l cng c qun l v thao tc trn CSDL ch dng lnh, bi vy, tt c cc thao tc truy vn vi c s d liu nh to, xa, sa bng, chn, xa, sa d liu trong bng d liu u c psql h tr :

    Cc v d :

    Cu lnh SELECT : country=# SELECT * FROM t1;

    Cu lnh DELETE : DELETE FROM t1 WHERE num = 2;

  • 23

    Tm li, psql l cng c qun l v thao tc vi c s d liu thng qua giao din dng lnh. N h tr nhiu tnh nng, t vic to, sao lu cc cu lnh truy vn n vic chnh sa file d liu, h tr vic thao tc vi c s d liu bng vic cung cp nhiu lnh SQL.

    pgAdmin pgAdmin min ph v l cng c qun l giao din ha m ngun m cho PostgreSQL, l c s d liu m ngun m cao cp nht trn th gii. N c th dng trn Linux, FreeBSD, Solaris, Mac OSX v Window.

    pgAdmin c thit kt p ng nhu cu ca tt c ngi dng, t vic vit truy vn n gin pht trin c s d liu phc tp. Giao din ha h tr tt c cc tnh nng ca PostgreSQL v lm cho vic qun tr d dng. ng dng ny cng bao gm b son tho c php SQL, b son tho m server-side.

    2.2. PostGIS

    2.2.1. Gii thiu v PostGIS

    PostGIS l g? PostGIS c Refraction Research Inc pht trin, nh mt d n nghin cu cng

    ngh CSDL khng gian. PostGIS h tr i tng a l cho CSDL i tng quan h PostgreSQL. PostGIS kch hot kh nng khng gian cho PostgreSQL, cho php PostgreSQL s dng nh mt CSDL khng gian ph tr cho cc h thng thng tin a l (GIS).

    c im ca PostGIS : Do PostGIS c s dng nh mt CSDL khng gian, nn n bao gm tt c cc

    c im ca CSDL khng gian c nu ra mc 1.1.2. Ngoi ra, n cn c nhng c trng nh :

    + Cc kiu d hnh hc nh Point, Linestring, Polygon, Multipoint, multilinestring, Multipolygons v Geometrycollection. Cc kiu d liu hnh hc ny c lu tr nh nhng i tng hnh hc.

    + Cc ton t khng gian cho php xc nh cc php o khng gian a l nh tnh din tch, tnh khong cch, tnh di, v tnh chu vi. PostGIS h tr cc hm

  • 24

    nh : ST_Area(), ST_Length(), ST_Perimeter(), ST_Distance()cc hm ny thng thc hin chc nng kiu php o.

    + Cc ton t khng gian cho php xc nh khng gian a l. Cc thao tc nh php hp, so snh s khc nhau gia cc i tng hnh hc. Cc ton t c PostGIS h tr lm vic ny c th l : ST_Difference() : tr v phn khc nhau gia 2 i tng hnh hc hay hm ST_Buffer()

    + PostGIS cung cp vic nh ch mc khng gian tc cao s dng GisT hoc R-tree. Cng c nh ch mc khng gian m PostGIS h tr lm tng tc cho truy vn khng gian c bit l trn bng d liu ln.

    + Ch mc h tr chn lc, cung cp vic thc hin truy vn bn pha trn truy vn khng gian hoc truy vn khng c khng gian

    2.2.2. Cng c shp2pgsql

    shp2pgsql l cng c dng chuyn nh dng file t dng shape file sang nh dng file .sql. Lu , shape file l nh dng d liu khng gian a l vect ph bin cho cc phn mm GIS. Shape file trong khng gian m t cc kiu hnh hc chnh l Line, Point v Polygon. Cc kiu Point, Line, Polygon cng vi cc thuc tnh a ll c th to rt nhiu hin th vi d liu a l. Shape file cn dng lu tr v tr hnh hc v thng tin thuc tnh lin quan.

    Bng 2-13: Cc ty chn shp2pgsql

    Ty chon Gii thch

    -D S dng nh dng kit xut CSDL. Mc nh, nh dng chn c s dng, n yu cu CSDL phn tch mi dng chn. nh dng kit xut ti nhanh hn so vi mc nh

    -s S dng s SRID (h thng nh danh khng gian tham chiu) khi to bng v hnh hc. iu ny quan trng xc nh, nh bit c s SRID c yu u h tr phi hp bn trong CSDL

    -i S dng 32bit s nguyn cho tt c cc gi tr s nguyn

  • 25

    2.2.3. Cng c psql

    i vi nhng ngi thch giao din dng lnh thay th giao din ha, psql cung cp mt cch thc mnh qun l mi mt ca my ch PostgreSQL. Vi psql, bn c th to v xa CSDL, tablespacess, bng, thc thi transaction, thc thi cc truy vn thng thng nh chn bng, chn v nhiu hn th na.

    Cu trc lnh ca psql : Cu lnh thc thi psql thng c dng :

    Psql [option][dbname[username]]

    Yu cu t nht, bn phi nhp tham s dbname v username. Cc ty chn ca lnh psql, chng ta c th xem bng 2-6.

    Ngoi tc dng thc thi cc truy vn, cng c psql rt c hu ch trong PostGIS, n chnh l cng c dng thc thi ni dung file c nh dng l .sql sau khi n c chuyn t nh dng shape file.

    2.2.4. Phng php load d liu nh dng file .sql

    SQL (file .sql): d liu c th c load vo PostGIS bng cch load cc tp tin lnh SQL vo mn hnh tng tc SQL. C hai cch load file d liu nh dng file .sql. chng ta c th dng pgAdmin III, y l cng c qun l c giao din nn vic thao tc tr nn d dng. Ngoi ra, vic dng dng lnh load file d liu nh dng file.sql cng c dng ph bin trong Linux.

    i vi pgAdmin III chng ta thc hin cc bc sau:

    B1: M pgAmin III

    B2 : Kt ni c s d liu trong PostgreSQL Database Server 8.4 (localhost: 5432)

    B3 : Chn mt CSDL, sau chn SQL query.

    B4 : Trong ca s SQL Query , chn File-> Open

    B5 : Tm n file c nh dng .sql->nhn OK attack ni dung file.

    B6 : Thc thi cu lnh SQL bng cch chn Query->Execute query. Hoc nhn nt Execute query trn toolbar.

  • 26

    Cch th hai dng load file d liu dng .sql l dng giao din dng lnh psql. V c l, vic thao tc bng giao din dng lnh psql n gin v nhanh hn i vi cch thao tc ha pgAdmin III. Chng ta ch cn s dng 1 lnh :

    huongnghiem@koinoi: psql U [tn_ngi_dng] f [tn_file.sql] d [tn_CSDL]

    2.2.5. Phng php load d liu dng shape file vo CSDL

    Shapefile l g? nh dng shapefile l nh dng d liu khng gian a l vect ph bin cho cc

    phn mm GIS.

    c im ca shapefile:

    + Mt shapefile c t chc thnh cc tp tin ring r, ti thiu cn c 3 tp tin vi phn m rng l .shp, .shx, .dbf. v nh dng tp tin shapefile c phn m rng l .shp.

    + Tp tin c phn m rng dng .shp cha cc thng tin v c im, hnh dng hnh hc ca i tng. Tp tin c phn m rng dng .shx cha cc thng tin v th t ca cc i tng. V tp tin c phn m rng dng .dbf cha cc thng tin v bng d liu thuc tnh ca i tng.

    + Shapefile l mt nh dng lu tr vect s lu tr v tr hnh hc v thng tin thuc tnh lin quan.

    + Mt shapefile khi hin th trong phn mm GIS c gi l lp d liu. Mi lp th hin cho mt c tnh hnh hc khng gian ca mt lp i tng cn biu din gm : POINT, LINE, POLYGON v cc thuc tnh lin quan n cc i tng .

    + Shapefile l dng n gin v chng lu tr cc kiu d liu hnh hc ban u nh: LINE, POINT, POLYGON. Cc kiu hnh hc ban u ny c s dng gii hn m khng c bt k thuc tnh xc nh nhng g chng hin th. V vy, mt bng trong bn ghi s lu tnh cht / thuc tnh ca mi hnh dng ban u trong shapefile. Cc hnh dng (LINE, POINT, POLYGON) cng vi cc thuc tnh d liu c th to ra rt nhiu hin th vi d liu a l.

    Cc bc tin hnh

  • 27

    + Trong Window

    S dng cng c psql v cng c shp2pgsql load file d liu dng shape (.shp).

    Gi s ta cn chuyn i file bc_pubs.shp sang file dng bc_pubs.sql.

    B1 : Start -> chn Accessories -> chn Command Prompt

    B2 : Chn ng dn n th mc cha cc file nh dng .shp

    Trong v d ny, ta chn ng dn : C:\Program Files\PostgreSQL\8.4\bin bng lnh :

    cd \Program Files\PostgreSQL\8.4\bin

    B3 : S dng cng c shp2pgsql :

    C:\Program Files\PostgreSQL\8.4\bin\shp2pgsql

    -d i -s 4326 bc_pubs.shp bc_pubs > bc_pubs.sql

    B4 : Thc thi ni dung tp tin mi to c (bc_pubs.sql) bng cgn c psql

    C:\Program Files\PostgreSQL\8.2\bin\psql.exe

    U postgres f bc_pubs d postgis

    -U postgres: tn ngi dng l postgres

    -f bc_pubs : tn file cn thc thi l bc_pubs.sql

    -d postgis: tn c s d liu postgis.

    B5 : Refresh pgAdmin III, trong CSDL bn chn, s xut hin bng bc_pubs.

    + Trong Linux

    huongnghiem@koinoi:~/data$ shp2pgsql d i s 4326 bc_pubs.shp bc_pubs > bc_pubs.sql

    Shapefile type: Arc

    Postgis type: MULTIPOLYGON[2]

    huongnghiem@koinoi:~/data$ psql U huongnghiem f bc_pubs.sql d huongnghiem

    2.2.6. OpenGIS Well-Know Text

  • 28

    i tng GIS h tr bi PostGIS l mt tp ln ca Simple Features c nh ngha bi OpenGIS Consortium (OGC). c t OpenGIS nh ngha cch th hin chun ca i tng khng gian l dng Well-Know Text (WKT). WKT bao gm cc thng tin v kiu ca i tng v cc ta dng i tng.

    VD v hin th dng WKT ca i tng khng gian :

    POINT(0 0)

    LINESTRING(0 0,1 1,1 2)

    POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))

    MULTIPOINT(0 0,1 2)

    MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))

    MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)

    GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

    2.2.7. Bng siu d liu

    Vi OpenGIS Simple Features Specification for SQL nh ngha kiu i tng GIS chun, hm c yu cu vn dng chng, v mt tp cc bng siu d liu. Sau m bo d liu vn ph hp, cc thao tc nh to v xa mt ct khng gian c thc hin thng qua cc th tc c bit c nh ngha bi OpenGIS.

    Khi mt c s d liu khng gian c kch hot vi PostGIS, c 2 bng siu d liu c to ra, c ch nh bi OGC l 2 bng siu d liu c tn SPATIAL_REF_SYS v GEOMETRY_COLUMNS.

    Bng GEOMETRY_COLUMNS iu khin GEOMETRY_COLUMNS nh mt th mc v m t nhng g m

    mt bng tn ti c kch hot khng gian trong c s d liu. N khng lu tr cp nht mt cch t ng, do , cu lnh CREATE TABLE n gin bao gm mt kiu GEOMETRY, s khng thm mt mc vo bng. lm iu , hm AddGeometryColumn() c th dng thm ng thi mt ct khng gian vo bng phi

  • 29

    khng gian trong khi cp nht ct GEOMETRY COLUMNS. Hm ny s c m t chi tit phn sau.

    Cu trc ca bng GEOMETRY_COLUMNS l :

    Table "public.geometry_columns" Column | Type | Modifiers -------------------------------+-------------------------------+----------- f_table_catalog | character varying(256) | not null f_table_schema | character varying(256) | not null f_table_name | character varying(256) | not null f_geometry_column | character varying(256) | not null coord_dimension | integer | not null srid | integer | not null type | character varying(30) | not null

    M t v bng GEOMETRY_COLUMNS bng cch m t v mi ct trong bng. Mi ct khng gian c xc nh duy nht bi s kt hp ca shema/table/column. Ct COORD_DIMENSION xc nh chiu khng gian (2, 3 hoc 4 chiu) ca ct. Ct SRID m t h thng tham chiu khng gian, n l kha ngoi tham chiu n bng SPATAIL_REF_SYS. Cui cng l ct ct TYPE m t kiu hnh hc c m t trong bng, s dng mt trong cc kiu sau : POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION

    Bng SPATIAL_REF_SYS iu khin SPATIAL_REF_SYS nh mt th mc ca h thng tham chiu khng gian. Mi kiu hnh hc trong c s d liu khng gian c lin quan n s SRID hay cn gi l tham s nhn din tham chiu khng gian, v n l mt s nguyn. Mun bit c s SRID trong mt bng d liu c th, ta dng hm ST_SRID() ( bit thm chi tit v hm ny, xem thm cun PostGIS Manual).

    Cu trc ca bng SPATIAL_REF_SYS :

    Table "public.spatial_ref_sys" Column | Type | Modifiers

  • 30

    ----------------------+--------------------------------+----------- srid | integer | not null auth_name | character varying(256) | auth_srid | integer | srtext | character varying(2048) | proj4text | character varying(2048) |

    Ct SRID l nh danh duy nht (c th hiu nh kha chnh ca bng d liu). Ct AUTH_NAME m t c quan hoc t chc nh ngha v s dng h thng tham chiu. Ct AUTH_SRID l s nguyn c gn bi c quan hoc t chc, cn ct SRTEXT hin th WKT ca h thng tham chiu khng gian.

    * LU : Mc nh, bng SPATAIL_REF_SYS lun chuyn vi PostGIS c ly t h thng c s d liu tham chiu khng gian ESPG. V d nh s SRID trong bng SPATAIL_REF_TABLE v nh danh ESPG lun lun ging nhau.

    2.2.8. Bng khng gian

    Bng khng gian l g? Bng khng gian l mt bng bao gm mt hoc nhiu ct khng gian. Vic to ra

    mt bng khng gian, ngoi nhng ct c kiu d liu thng thng, cn ch ra ct no l ct khng gian trong bng . Ct khng gian ch c th chp nhn kiu d liu c yu cu bi ct khng gian. Kiu hnh hc c dng trong ct khng gian ca bng khn gian l Point, Multipoint, Linestring, MultiLinestring, Polygon, Multipolygon.

    Gi tr tham chiu khng gian, vit tt l SRID, l gi tr rt quan trng, n xc nh tnh duy nht ca h thng khng gian trong phm vi CSDL. N c yu cu ch ra khi to i tng khng gian cho vic chn vo CSDL. Thng tin ca gi tr SRID c lu tr trong bng SPATIAL_REF_SYS c to mc nh khi ci t PostGIS. SRID ca h thng tham chiu khng gian ca hnh hc c lu tr vi kiu hnh hc ca chnh n, v th, iu quan trng l bn phi chn SRID mt cch cn thn.

    To bng khng gian trong PostGIS a. Cch thng thng

  • 31

    To bng vi cu lnh CREATE TABLE, v mt thuc tnh ca bng s c kiu d liu dng geometry. V d, to bng points ( name varchar, point geometry);

    Ch : khi chn d liu vo bng khng gian cn ch n trng c kiu d liu dng geometry, d liu s gm cc i tng khng gian nh POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON v nh dng d liu nhp phi ng nh nh dng WKT;

    V d, nhp d liu cho i tng POINT c ta (0,0), chng ta dng dng POINT(0 0). Cn nhp d liu cho i tng LINESTRING ni ta (0,0) v (3, 4), chng ta dng dng LINESTRING (0 0,3 4);

    INSERT INTO points VALUES (a, POINT(0 0));

    b. Dng hm AddGeometryColumn()

    to mt bng d liu khng gian vic u tin l to ra bng d liu, tuy nhin, trong bng d liu ny s khng cha ct d liu khng gian. Sau , c c bng d liu khng gian, chng ta cn thm ct d liu khng gian bng cch s dng hm AddGeometryColumn(). Bng d liu khng gian c to ra, cng vic chn d liu vo bng cng tng t nh cch thng thng.

    B1 : To bng thng thng (khng phi bng d liu khng gian)

    CREATE TABLE ROADS_GEOM (ID int4, NAME varchar(25))

    B2 : Thm ct khng gian vo bng s dng hm AddGeometryColumn

    AddGeometryColumn (,,,,, )

    Gii thch cc tham s ca hm :

    Hm AddGeometryColumn : thm ct hnh hc vo bng tn ti.

    + : tn ca bng s bng.

    + : tn ca bng cn thm ct khng gian

    + : tn ct cn thm theo kiu khng gian

  • 32

    + : srid l mt gi tr nguyn, xc nh tnh duy nht ca h thng tham chiu khng gian trong phm vi ca CSDL. Ngha l SRID ca cc bng khc nhau trong CSDL khng gian phi hon ton khc nhau.

    + : xc nh kiu hnh hc cho ct.

    + : thuc chiu no (0, 1, 2 hoc 3)

    Nu ang s hin ti th b qua thng s :

    AddGeometryColum (,,,,)

    VD : yu cu to bng tn points (name varchar(20)) l mt bng khng gian, sau thm trng the_geom bng hm AddGeometryColumn();

    CREATE TABLE points(name varchar(20));

    SELECT AddGeometryColumn('public','points','the_geom',-1,'POINT',2);

    INSERT INTO points(name, the_geom) values('A','POINT(1 0)');

    INSERT INTO points(name, the_geom) values('B','POINT(0 1)');

    2.3. Hm trong PostGIS

    2.3.1. Nhm hm iu khin

    AddGeometryColumn() - Chc nng ca hm AddGeometryColumn l thm mt ct hnh hc vo bng tn ti. Hm ny rt quan trng trong vic to bng trong CSDL khng gian.

    - C php :

    text AddGeometryColumn(varchar table_name, varchar column_name, integer srid, varchar type, integer dimension);

    text AddGeometryColumn(varchar schema_name, varchar table_name, varchar column_name, integer srid, varchar type, integer dimension);

    * ch : schema_name : l tn ca bng s , thng mc nh khi ci t PostgreSQL

    Srid : phi c gi tr l mt s nguyn, tham chiu n bng SPATIAL_REF_SYS.

    Type : xc nh kiu hnh hc cho ct cn thm, v d : POLYGON, MULTILINESTRING, POINT, MULTIPOINT

  • 33

    Dimention : xc nh chiu hnh hc, chiu tng ng vi kiu hnh hc.

    - V d : To bng hnh hc c tn l my_spatial_table (id serial);

    Thm ct hnh hc (the_geom) c kiu POINT, trong khng gian 2D :

    SELECT AddGeomtryColumn(my_schema, my_spatial_table, the_geom, 4326, POINT, 2);

    DropGeometryColumn() - Chc nng ca hm DropGeometryColumn l loi b mt ct hnh hc t bng khng gian.

    - C php :

    text DropGeometryColumn(varchar table_name, varchar column_name);

    text DropGeometryColumn(varchar schema_name, varchar table_name, varchar column_name);

    - V d :

    SELECT DropGeomtryColumn(my_schema,my_spatial_table,the_geom);

    DropGeometryTable - Chc nng ca hm DropGeometryTable() l loi b bng v tt c nhng g tham chiu trong ct hnh hc.

    - C php :

    boolean DropGeometryTable(varchar table_name);

    boolean DropGeometryTable(varchar schema_name, varchar table_name);

    - V d : SELECT DropGeometryTable(my_schema, my_spatial_table);

    2.3.2. Nhm hm khi to hnh hc

    ST_GeometryFromText() - Chc nng ca hm ST_GeometryFromText l tr v gi tr c ch nh ST_Geometry t hin th WKT.

    - C php : geometry ST_GeometryFromText(text WKT);

  • 34

    - V d : SELECT ST_GeometryFromText(POINT(1 0));

    st_geomfromtext

    ----------------------------------------

    0101000000000000000000F03F0000000000000000

    * Ch : Hm ST_GeometryFromText() cng c th c vit l ST_GeomFromText()

    2.3.3. Hm tr v kiu hnh hc u ra.

    ST_AsText() - Chc nng ca hm ST_AsText l tr v hin th dng WKT ca hnh.

    - C php : text ST_AsText(geometry g);

    - V d : SELECT ST_AsText(ST_Union(ST_GeomFromText(POINT(1 2)), ST_GeomFromText(POINT(1 2))));

    Gi tr tr v : POINT (1 2);

    SELECT ST_AsText(0101000000000000000000F03F0000000000000000 );

    Gi tr tr v : POINT(1 0);

    2.3.4. Hm xc nh mi quan h khng gian

    ST_Equals() - Chc nng ca hm ST_Equals l tr v True nu a ra nhng hnh coi l bng nhau trong khng gian. Lu , bng nhau trong khng gian ngha l ST_Within(A, B)=True v ST_Within(B,A)=True v cng c ngha l sp xp ca cc im c th khc nhau nhng cu trc hin th hnh hc li ging nhau.

    - C php : boolean ST_Equals(geometry A, geometry B);

    - V d : SELECT ST_Equals(ST_GeoFromText(LINESTRING (0 0, 10 10)), ST_GeoFromText(LINESTRING (0 0, 5 5, 10 10));

    Gi tr tr v l True v : LINESTRING(0 0, 10 10) v LINESTRING (0 0, 5 5, 10 10) u tr v an thng t im (0, 0)-> im (10, 10)

    ST_Disjoint()

  • 35

    - Chc nng ca hm ST_Disjoint l tr v True nu cc hnh khng giao nhau trong khng gian nu chng khng chia s bt c khong khng gian no cho nhau, hay l tch bit hn vi nhau. Nu bt k cc hm ST_Overlaps(), ST_Touches(), ST_Within() tr v True th cc hnh khng phi c khng gian phn chia. Lu , hm ST_Disjoint() khng s dng c ch nh ch mc.

    - C php : boolean ST_Disjoint (geometry A, geometry B);

    - V d : SELECT ST_Disjoint(POINT (0 0)::geometry, LINESTRING (2 0, 0 2)::geometry);

    Gi tr tr v l True v : im (0, 0) v on thng ni 2 im (2, 0) v im (0, 2) khng c bt k im no chung.

    ST_Intersects() - Chc nng ca hm ST_Intersects l tr v True nu cc hnh gi l giao nhau trong khng gian v tr v False nu chng khng c bt c im no giao nhau. Nu cc hm ST_Overlaps(), ST_Touches(), ST_Within() tr v true, th nhng hnh c coi l giao nhau.

    - C php : boolean ST_Intersects(geometry A, geometry B);

    - V d : SELECT ST_Intersects(POINT(0 0)::geometry, LINESTRING (2 0, 0 2)::geometry);

    Gi tr tr v l False v : ST_Disjoint(POINT(0 0)::geometry, LINESTRING (2 0, 0 2)::geometry); tr v gi tr True, hay ni cch khc l im (0, 0) v on thng (2,0)

    -> (0,2) khng c bt k im giao nhau no.

    ST_Touches() - Chc nng ca hm ST_Touches l tr v True nu cc hnh c t nht 1 im chung, nhng bn trong ca chng li khng giao nhau. Quan h ST_Touches() p dng cho Vng/Vng, ng/ng, ng/Vng, im/Vng, im/ng nhng khng p dng cho cp im/im.

    - C php : boolean ST_Touches(geometry g1, geometry g2);

  • 36

    - V d : SELECT ST_Touches(LINESTRING(0 0, 1 1, 0 2)::geometry, POINT(0 2)::geometry);

    Tr v gi tr True v on thng t im (0,0)->(1,1)->(0,2) tip xc vi im (0,2) ti u on thng ch khng phi im gia ca on thng. Nu xt on thng trn vi im

    (1, 1) th gi tr tr v l False v chng tip xc nhau vi im gia ca on thng.

    Cc minh ha v quan h ST_Touches() tr v gi tr True.

    Hnh 2-1 : Minh ha hm ST_Touches().

    ST_Overlaps() - Chc nng ca hm ST_Overlaps l tr v True nu cc hnh c khong khng gian chia s, c cng chiu, nhng chng khng hon ton b cha bi hnh khc.

    - C php : boolean ST_Overlaps(geometry A, geometry B);

    - V d :

    ST_Crosses()

  • 37

    - Chc nng ca hm ST_Crosses l tr v True nu i tng hnh hc thu c c chiu nh hn chiu ln nht ca 2 i tng hnh hc ban u. i tng thu c phi cha cc im bn trong ca 2 i tng hnh hc ban u v i tng thu c phi khng bng mt trong 2 i tng u vo. Trng hp cn li, tr v False.

    - C php : boolean ST_Crosses(geometry g1, geometry g2);

    - V d : c 2 bng roads (id , the_geom) v highways(id, the_geom)

    Xc inh danh sch road giao vi highway :

    SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.the_geom, highways.the_geom);

    ST_Within() - Chc nng ca hm ST_Winthin l tr v True nu hnh A nm hon ton bn trong hnh B

    * Lu : ST_Within(A, B)=ST_Contains(B, A)

    - C php : boolean ST_Within(geometry A, geometry B)

    - V d : ng trn nh nm hon ton bn trong ng trn to

    Hnh 2-2 : Minh ha hm ST_Within()

    ST_Contains() - Chc nng ca hm ST_Contains l tr v True khi v ch khi khng c im no ca B nm bn ngoi A, v t nht 1 im bn trong B nm bn trong A.

  • 38

    Hnh 2-3 : Minh ha hm ST_Contains()

    - C php : boolean ST_Contains(geometry B, geometry A);

    ST_Distance() - Chc nng : hm ST_Distance tr v khong cch gia 2 im, gia im v ng trong khng gian 2D. n v mc nh l meter.

    - C php : float ST_Distance (geometry g1, geometry g2);

    - V d : Khong cch ca 2 im POINT (0 0) v POINT (3 4);

    SELECT ST_Distance (POINT(0 0),POINT(3 4));

    st_distance= 5;

    Khong cch t im POINT(0 0) n ng LINESTRING(0 3, 3 4);

    st_distance = 3;

  • 39

    ST_Length() - Chc nng : hm ST_Area tr v din tch ca hnh nu n l POLYGON hoc MULTIPOLYGON. n v mc nh l m2.

    - C php : float ST_Area(gemetry g1);

    - V d : Bng d liu bc_voting_area lu tr thng tin ca cc vng tham gia bu c. Yu cu tnh tng din tch ca tt c cc vng c tham gia bu c c s ngi tham gia bu c >100?

    SELECT Sum(ST_Area(the_geom))/10000 AS hectares FROM bc_voting_areas WHERE vtotal > 100;

    hectares ------------------ 36609425.2114911 (1 row)

    ST_Area() - Chc nng : hm ST_Length() tr v di 2d ca hnh nu chng l LINESTRING hoc MULTILINESTRING. n v mc nh ca di l meter

    - C php : float ST_Length(geometry Linestring);

    - V d : Tnh di ca Linestring sau :

    SELECT ST_Length(ST_GeomFromText(LINESTRING(743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416),2249));

    st_length

    ---------

    122.630744000095

    ST_Perimeter() - Chc nng : hm ST_Perimeter tr v chu vi ca hnh nu n c dng Polygon hoc Multipolygon. n v mc nh l meter.

  • 40

    - C php : float ST_Perimeter(geometry g1);

    - V d : SELECT ST_Perimeter(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416))', 2249));

    Gi tr tr v : st_perimeter : 122.630744000095

    2.3.5. Nhm hm a ra i tng hnh mi.

    ST_Intersection() - Chc nng ca hm ST_Intersection l tr v mt hnh, hin th phn chung gia hnh A v hnh B. Nu hnh A v hnh B khng c bt k im chung th tr v i tng hnh rng.

    - C php : geometry ST_Intersection(geometry A, geometry B);

    - V d : SELECT ST_AsText(ST_Intersection(POINT(0 0)::geometry, LINESTRING(2 0, 0 2)::geometry));

    Gi tr tr v EMTRY

    SELECT ST_AsText(ST_Intersection(POINT(0 0)::geometry, LINESTRING (0 0,0 2)::geometry));

    Gi tr tr v : POINT(0 0).

    ST_Difference() - Chc nng ca hm ST_Difference l tr v mt hnh hin th phn ca hnh A m khng giao vi hnh B. Chng ta c th hiu theo cng thc sau :

    ST_Difference() = GeometryA ST_Intersection(A, B).

    Nu A hon ton nm trong B, th A v B khng c im khc bit, ngha l, hm ST_Difference() tr v gi tr rng.

  • 41

    Hnh 2-4 : Minh ha hm ST_Difference()

    Hnh 2-4 biu din 2 ng thng A v B giao nhau.

    Hnh 2-5 biu din im khc nhau gia hai ng A v B l phn ca ng A khng giao vi ng B

    - C php : geometry ST_Difference(geometry geomA, geometry geomB);

    - V d : SELECT ST_AsText (ST_Difference(

    ST_GeomFromText(LINESTRING(50 100, 50 200)),

    ST_GeomFromText(LINESTRING(50 50, 50 150))));

    Gi tr tr v LINESTRING (50 150, 50 200).

    ST_Union() - Tr v mt hnh hin th hp ca cc hnh. Kiu tr v ca hm c th l MULTI*, hnh n l hoc tp hp cc hnh.

    - C php : geometry ST_Union (geometry g1, geometry g2)

    - V d : SELECT ST_AsText(ST_Union(ST_GeomFromText(POINT(1 2)),

    ST_GeomFromText(POINT(-2 3)) ) );

    Gi tr tr v : MULTIPOINT (-2 3, 1 2).

    SELECT ST_AsText(ST_Union(ST_GeomFromText(POINT(1 2)), ST_GeomFromText(POINT(1 2))));

    Gi tr tr v : POINT (1 2)

    ST_SymDifference()

  • 42

    - Chc nng ca hm ST_SymDifference tr v mt hnh hin th phn ca hnh A v hnh B khng giao nhau. N c gi l s khc nhau i xng l do : ST_SymDifference(A, B) = ST_SymDifference (B, A). Chng ta c th hiu theo cng thc sau :

    ST_SymDifference (A, B) = ST_Union (A, B) ST_Intersection (A, B).

    Hnh 2-5 : Minh ha hm ST_SymDifference().

    Hnh 2-7 biu din kt qu ca hm ST_SymDifference(), n tr v 1 phn ca ng A v 1 phn ca ng B m khng giao nhau.

    - C php : geometry ST_SymDifference (geometry geomA, geometry geomB);

    - V d : SELECT ST_AsText( ST_SymDifference (

    ST_GeomFromText(LINESTRING (50 100, 50 200)),

    ST_GeomFromText(LINESTRING (50 50, 50 150))));

    Gi tr tr v : MULTILINESTRING ((50 150, 50 200),(50 50, 50 100));

    2.3.6. Nhm hm thay i hnh hc

    ST_Buffer() : - Chc nng ca hm ST_Buffer tr v mt hnh hin th cho tt c cc im m khong cch ca chng t hnh

  • 43

    + mitre_limit : t l gii hn mp

    n v ca bn knh c o bng n v ca h thng tham chiu khng gian. u ra ca hm c th l POINT, MULTIPOINT, LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON v GEOMETRYCOLLECTION.

    - C php : geometry ST_Buffer (geometry g1, float R);

    Geometry ST_Buffer(geometry g1, float R, integer num_seg_quater_circle);

    Geometry ST_Buffer(geometry g1, float R, text buffer_style_parameters);

    - V d :

    Bng 2-14: Cc v d minh ha cho hm ST_Buffer()

    Quad_segs=8

    SELECT ST_Buffer( ST_GeomFromText(POINT(100, 90)), 50, quad_segs=8);

    Quad_segs=2

    SELECT ST_Buffer ( ST_GeomFromText(POINT(100,90)), 50, quad_seds=2);

  • 44

    Endcap=round v join=round

    SELECT ST_Buffer( ST_GeomFromText(LINESTRING(50 50, 150 150, 150 50)), 10, endcap=round join=round);

    Endcap=bevel v join=round

    SELECT ST_Buffer( ST_GeomFromText(LINESTRING(50 50, 150 150, 150 50)), 10, endcap=square join=round);

    2.3.7. Nhm hm accessor

    ST_GeometryType() - Chc nng ca hm ST_GeometryType l tr v kiu hnh hc di dng chui. V d : ST_Linestring, ST_Polygon, ST_MultiPolygon

    - C php : text ST_GeometryType(geometry g1);

    - V d : SELECT ST_GeometryType(ST_GeomFromText(LINESTRING(10 10, 20 20)));

    Gi tr tr v l ST_Linestring.

    GeometryType() - Chc nng ca hm GeometryType l tr v kiu ca hnh di dng chui nh : LINESTRING, POLYGON, MULTIPOINT

    - C php : text GeometryType(geometry geomA);

    - V d : SELECT GeometryType(ST_GeomFromText(LINESTRING(0 0, 1 1, 2 2)));

    Gi tr tr v : LINESTRING.

    ST_IsValid() - Chc nng ca hm ST_IsValid l tr v True nu hnh l hp l. Khi nim hp l trong trng hp ny, ngha l, cc kiu hnh hc c dng POINT, POLYGONv c biu din hp l nh POINT(0 0), POLYGON(0 0, 1 1, 1 2, 0 0). Trong trng hp kiu hnh hc l khng hp l, th PostgreSQL s a ra thng bo chi tit ti sao kiu hnh hc li khng hp l.

    - C php : boolean ST_IsValid(geometry g)

  • 45

    - V d : SELECT ST_IsValid(ST_GeomFromText(LINESTRING(0 0, 1 1)));

    Gi tr tr v l True.

    2.4. Ch mc

    Ch mc gip vic s dng mt c s d liu khng gian vi d liu ln nht c th c tr ln d dng. Nu khng c vic nh ch mc, th bt k vic tm kim no cng phi yu cu vic qut tun t tt c cc bn ghi c trong CSDL. Nh vy, gy cn tr cho vic tm kim nh yu cu thi gian qut qu ln, b nh my tnh cn phi ln. V th, vic nh ch mc c vai tr rt quan trng trong vic truy vn mt CSDL, c bit l CSDL loi ln.

    Vic nh ch mc nhm tng tc tc tm kim bng cch t chc d liu thnh cy tm kim, n c duyt mt cch nhanh chng tm mt bn ghi c th. PostgreSQL h tr 3 cch nh ch mc l : B-Tree, R-Tree, v ch mc GiST.

    2.4.1. Ch mc GiST

    Ch mc GiST l kiu ch mc m PostGIS dng. C ch nh ch mc GiST c p dng cho ct d liu kiu khng gian trong CSDL khng gian. N cng c tc dng lm tng tc tm kim trn tt c cc kiu d liu.

    C php xy dng ch mc GiST trn mt ct khng gian :

    CREATE INDEX [index_name] ON [table_name] USING GIST ([geometry_field]);

    Ch mc GiST c 2 u im hn ch mc R-Tree trong PostgreSQL ch. Th nht, ch mc GiST l Null safe, ngha l, chng c th nh ch mc cho tt c cc ct, bao gm c nhng ct c cha gi tr Null. Th hai, ch mc GiST h tr cc khi nim lossiness, n quan trng khi phn chia vi i tng GIS ln hn kch thc ca trang (8K). lossiness cho php PostgreSQL ch lu tr nhng phn quan trng ca mt i tng trong mt ch mc (p dng cho i tng GIS). Cc i tng GIS ln hn 8K s gy ra tht bi trong qu trnh x l i vi kiu ch mc R-Tree.

    2.4.2. S dng ch mc

    Nh bit, tc dng ca vic nh ch mc l tng tc tm kim d liu, v n c bit c tc dng i vi lng d liu ln.

  • 46

    Cc v d sau gip ta theo di c hiu qu tm kim trc v sau khi nh ch mc cho d liu.

    i vi bng d liu n gin, lng d liu nh bng points(name, the_geom). Vi cu lnh SELECT name, ST_AsText(the_geom) from points;

    Cu lnh nh ch mc cho ct the_geom :

    CREATE INDEX the_geom_gist ON points USING GIST (the_geom);

    Thi gian truy vn trc nh ch mc:

    Total query runtime: 31 ms. 2 rows retrieved.

    Thi gian truy vn sau khi nh ch mc cho ct the_geom

    Total query runtime: 0 ms. 2 rows retrieved.

    C th thy, tc dng ca nh ch mc, thi gian truy vn gim gp nhiu ln.

    i vi bng d liu ln bng bc_border( gid, border_id, the_geom), d liu ca bng rt ln, khong hn 5000 hng. Nu khng c c ch nh ch mc, tm kim d liu trong bng, h thng phi qut tun t t u cho n khi no tm thy d liu theo yu cu. Cho nn, thi gian dnh cho truy vn s rt ln.

    Nu thc hin cu lnh truy vn : SELECT gid, border_id, ST_AsText(the_geom) FROM bc_border;

    nh ch mc cho ct the_geom : CREATE INDEX border_the_geom_gist ON bc_border USING GIST (the_geom);

    Thi gian truy vn trc khi nh ch mc :

    Total query runtime: 2125 ms. 5199 rows retrieved.

    Thi gian truy vn sau khi nh ch mc :

    Total query runtime: 1890 ms. 5199 rows retrieved.

  • 47

    So snh tng thi gian truy vn trc v sau khi nh ch mc, thy rng, vic nh ch mc tit kim c rt nhiu thi gian truy vn. Tm li, cng c nh ch mc gip ch rt nhiu trong qu trnh thc hin truy vn ca h thng. Thi gian m h thng phi dnh ra thc hin truy vn gim i c mt lng ng k. Tuy nhin, chng ta ch nn nh ch mc i vi nhng bng, nhng ct thng xuyn c s dng cho mc ch tm kim d liu.

    2.5. Truy vn trong c s d liu khng gian

    2.5.1. M t v c s d liu khng gian

    Bng bc_pubs Column | Type | Description ---------------------+--------------------------+------------------- gid | integer | Unique ID id | integer | Unique ID name | character varying | Tn Pub address | character varying | a ch ph city | character varying | Tn thnh ph province | character varying | Qun / huyn postal | character varying | M bu in the_geom | geometry | m t hnh hc (Point)

    Bng bc_voting_areas Column | Type | Description --------------+------------------------+------------------- gid | integer | Unique ID m | character varying | m bu c id | character varying | Area ID riding | character varying | tn khu vc bu c region | character varying | tn vng number | character varying | s vng tham gia bu c ndp | integer | # of NDP Votes liberal | integer | # of Liberal Votes

  • 48

    green | integer | # of Green Votes unity | integer | # of Unity Votes vtotal | integer | tng phiu vreject | integer | # of Spoiled Ballots vregist | integer | # of Registered Voters the_geom | geometry | m t hnh hc(Polygon)

    Bng bc_roads Column | Type | Description -------------+------------------------+------------------- gid | integer | Unique ID name | character varying | Road Name the_geom | geometry | m t hnh hc (Linestring)

    Bng bc_border Column | Type | Description -------------+------------------------+------------------- gid | integer | Unique ID border_id | integer | border Name the_geom | geometry | m t hnh hc (Linestring)

    Bng bc_hospitals Column | Type | Description -------------+-------------------------+------------------- gid | integer | Unique ID

    id | integer | Unique ID authority | character varying | ngi ng u name | character varying | Hospital Name the_geom | geometry | m t hnh hc (Point)

  • 49

    Bng bc_municipality Column | Type | Description -------------+------------------------+------------------- gid | integer | Unique ID m | integer | Unique ID name | character varying | City / Town Name the_geom | geometry | Location Geometry (Polygon)

    2.5.2. Truy vn

    S dng nhm hm o lng S dng hm ST_Area() tnh din tch ca cc thnh ph c trong bng bc_municipality. Ga tr tr v ca hm ST_Area() l kiu Numeric.

    huongnghiem=>SELECT ST_Area( the_geom ) FROM bc_municipality;

    VD1 : Tnh din tch ca thnh ph PRINCE GEORGE, tnh theo n v hectar?

    SELECT ST_Area(the_geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE'; hectares ------------------ 32657.9103824927 (1 row)

    VD2: Tm ra th c din tch ln nht trong tnh?

    SELECT name, ST_Area(the_geom)/10000 AS hectares FROM bc_municipality ORDER BY hectares DESC LIMIT 1; name | hectares ---------------+-----------------

  • 50

    TUMBLER RIDGE | 155020.02556131 (1 row)

    VD3 : Tnh tng din tch tt c cc vng c tham gia bu c, tnh theo n v hectar?

    SELECT Sum(ST_Area(the_geom))/10000 AS hectares FROM bc_voting_areas; hectares ------------------ 94759319.6833071 (1 row)

    VD4 : Tng din tch ca cc vng c tham gia bu c, c s ngi tham gia bu c >100?

    SELECT Sum(ST_Area(the_geom))/10000 AS hectares FROM bc_voting_areas WHERE vtotal > 100; hectares ------------------ 36609425.2114911 (1 row)

    S dng hm ST_Perimeter() tnh chu vi ca i tng c kiu POLYGON hoc MULTIPOLYGON. p dng, tnh chu vi ca cc thnh ph lit k trong bng bc_municipality. Gi tr tr v ca hm ST_Perimeter() l kiu Numeric.

    huongnghiem=>SELECT ST_Perimeter( the_geom ) FROM bc_municipality;

    VD1 : Tnh chu vi ca th thuc VANCOUVER

    SELECT ST_Perimeter(the_geom) FROM bc_municipality WHERE name = 'VANCOUVER'; st_perimeter ------------------

  • 51

    57321.7782018048 (1 row))

    S dng hm ST_Length() tnh chiu di ca cc i tng c kiu LINESTRING, MULTILINESTRING. p dng, tnh chiu di cc con ng c lit k trong bng bc_roads. Gi tr tr v ca hm ST_Length() l kiu Numeric.

    huongnghiem=>SELECT ST_Length( the_geom ) FROM bc_roads;

    VD1 : Tnh tng di tt c cc con ng c trong tnh?

    SELECT Sum(ST_Length(the_geom))/1000 AS km_roads FROM bc_roads; km_roads ------------------ 70842.1243039643 (1 row)

    VD2 : Tnh di ca ng c tn l Douglas ST?

    SELECT Sum(ST_Length(the_geom))/1000 AS kilometers FROM bc_roads WHERE name = 'Douglas St'; kilometers ------------------ 19.8560819878386 (1 row)

    S dng hm ST_Distance() tnh khong cch gia cc i tng POINT/POINT, POINT/LINESTRING, LINESTRING/LINESTRING. p dng tnh khong cch gia hospitals v pubs c gid bng nhau:

    Huongnghiem=>SELECT ST_Distance(hos.the_geom, pub.the_geom) FROM bc_hospitals as hos, bc_pubs as pub WHERE hos.gid = pub.gid;

  • 52

    5.2.2. Nhm hm so snh

    ST_Intersects( geometryA, geometryB) tr v kiu True nu cc hnh giao nhau

    Huongnghiem=> SELECT ST_Intersects(voting.the_geom, mun.the_geom) FROM bc_voting_areas AS voting, bc_municipality AS mun WHERE mun.name=TUMBLER RIDGE;

    ST_Contains( geometryA, geometryB) tr v kiu True nu hnh A cha hnh B

    Huongnghiem=> SELECT ST_Contains(voting.the_geom, mun.the_geom) FROM bc_voting_areas AS voting, bc_municipality AS mun WHERE mun.name=TUMBLER RIDGE;

    ST_Within( geometryA, geometryB) tr v True nu hnh A bn trong hnh B vi mt khong cch xc nh :

    VD : Tm tt c cc v tr ca pub trong vng 250m so vi hospital

    Huongnghiem=> SELECT h.name, p.name FROM bc_hospitals AS h, bc_pubs AS p WHERE ST_Dwithin(h.the_geom, p.the_geom, 250);

    ST_IsValid( geometry ) tr v True nu hnh hp l

    Huongnghiem=> SELECT gid FROM bc_voting_areas WHERE NOT ST_IsValid(the_geom);

    Gi tr tr v ca gid : 4897

    ST_Relate( geometryA, geometryB ) tr v kiu Strings tn mi quan h gia hai hnh.

    S dng nhm hm tr v i tng y l nhm hm c chc nng tm ra mi quan h gia 2 i tng. Quan h l quan h giao nhau, s khc nhau gia 2 i tng, php hp 2 i tng

    VD : Tm ra giao gia cc vng c tham gia bu c (thuc bng bc_voting_areas) v cc th (thuc bng bc_municipality) thuc thnh ph PRINCE GEORGE.

  • 53

    SELECT ST_AsText(ST_Intersection(v.the_geom, m.the_geom)) AS FROM bc_voting_areas AS v, bc_municipality AS m

    WHERE ST_Intersects(v.the_geom,m.the_geom) AND m.name=PRINCE GEORGE;

    VD : to bng cha thng tin ca tt c cc vng c tham gia bu c v tn ca thnh ph tha mn yu cu l vng tham gia bu c giao vi thnh ph c tn l PRINCE GEORGE, v 2 vng ny phi giao nhau

    CREATE TABLE pg_voting_areas AS SELECT ST_Intersection(v.the_geom, m.the_geom) AS intersection_geom, ST_Area(v.the_geom) AS va_area, v.*, m.name FROM bc_voting_areas v, bc_municipality m WHERE ST_Intersects(v.the_geom, m.the_geom) AND m.name = 'PRINCE GEORGE';

    Tnh din tch ca vng giao nhau tm oc trong bng va to

    SELECT Sum(ST_Area(intersection_geom))

    FROM pg_voting_areas;

    sum ------------------ 326579103.824927 (1 row)

  • 54

    Chng 3. M RNG TRUY VN KHNG GIAN POSTGRESQL

    i vi mt h thng quan h chun, chng c th lu tr thng tin v CSDL,bng, ctv thng c gi l h thng catalog. Mt im khc bit gia Postgres v h thng quan h chun l Postgres c th lu tr c rt nhiu thng tin bn trong catalog, khng ch thng tin v bng, ct m cn thng tin v kiu d liu, hm, phng thc truy cp. Ngi dng c th sa i c bng d liu, v c s hot ng trn cc bng biu, Postgres c coi l c th m rng bi ngi dng.

    Postgres khng ging nh b qun l d liu khc. Server ca Postgres c th kt hp m do ngi dng vit vo bn trong h thng thng qua b np ng. iu c ngha l, ngi dng c th ch nh i tng m tp tin, thc thi kiu d liu hoc hm mi, v Postgres s ti n vo h thng theo yu cu.

    C th ni, PostgreSQL l mt CSDL linh hot v c tnh m rng. Mt mt, PostgreSQL c th s dng cho nhiu mc ch. Mt khc, PostgreSQL c th d dng c m rng v cung cp nhiu giao din lp trnh c thit k m rng cc tnh nng ct li ca PostgreSQL. Chng ta c th thm nhiu hm mi, nhiu ton t mi v ty chn kiu d liu cho PostgreSQL, v nhng kh nng trn l hon ton d dng lm c.

    Nh chng ta bit, PostGIS l mt modul c kt hp trong PostgreSQL cho php ngi dng lu tr cc lp d liu khng gian. Khng nhng th, n cn cho php ngi dng truy vn, x l d liu khng gian. Tuy nhin, hu ht cc h tr hm thao tc, v cc php truy vn trong PostGIS c thc hin trong h khng gian 2 chiu. Do , iu mong mun l chng ta c th vit ra cc kiu hin th i tng trong khng gian 3 chiu, vit cc hm m rng v ton t m rng c th thc hin tnh ton cc php ton trong khng gian 3 chiu. V vy, vic nghin cu tm hiu cch vit cc m rng v kiu, hm v ton t trong PostgreSQL s gip chng ta to ra cc kiu d liu, kiu hm mi phc v cho vic thao tc CSDL trong khng gian 3 chiu.

    3.1. Cc kiu d liu trong PostgreSQL

    Kiu d liu ca PostgreSQL c chia ra thnh cc kiu : kiu d liu c bn, kiu d liu hn hp.

    3.1.1. Kiu d liu c bn

  • 55

    Kiu d liu c bn nh int4, l nhng kiu d liu c bn trong PostgreSQL. Nhn chung, chng tng ng vi nhng g thng c bit n nh l kiu d liu tru tng. PostgreSQl ch c th hot ng trn cc kiu cc hm c ngi dng cung cp v ch hiu cch vn hnh ca cc kiu n mc m ngi dng m t chng.

    3.1.2. Kiu d liu hn hp

    Kiu d liu hn hp l kiu d liu c xy dng da trn cc kiu d liu c bn khc, v do , cc hm b sung lun sn sng bo cho CSDL bit kiu d liu c s dng nh th no?

    V d, xy dng mt kiu d liu hn hp c tn l employee gm cc thuc tnh : name, salary, age, room. Kiu d liu c biu din nh sau :

    CREATE TABLE employee ( Name text, Salary numeric,Age integer,Cubicl point );

    3.2. M rng PostgreSQL vi hm ty chn

    Mt h thng CSDL phc tp, quan trng hn l s tn ti ca cc quy tc v cc quy c lm cho m r rng v d hiu hn nhiu. i vi PostgreSQL, mt s quy tc c bn c a ra vic cn nhc khi thc thi hm c thm. y l yu t quan trng lm cho h thng d dng hiu hn. Trc khi chng ta gi cc quy c, hy xem cc hm s c thc thi nh th no?

    PostgreSQL cung cp hai kiu hm : hm ngn ng truy vn (hm vit bi SQL) v hm ngn ng lp trnh (hm vit bi ngn ng lp trnh c bin dch nh ngn ng lp trnh C). Mi loi hm c th dng kiu d liu c bn, kiu d liu hn hp hoc kt hp chng. Thm na, mi loi hm c th c th tr v mt kiu d liu c bn hoc mt kiu d liu hn hp. Cc hm c th c nh ngha tr v mt tp gi tr c bn hoc gi tr hn hp.

    3.2.1. Hm ngn ng truy vn (SQL)

    V PostgreSQL l phn mm rt linh hot, v ta c th d dng thm hm vo CSDL. Dng m SQL vit hm b sung cho PostgreSQL, v chng ta s thy kh nng thc thi cc hm n gin bng cch s dng m SQL thng thng. V, s dng SQL n vit hm b sung l vic d dng nh s dng bt k ngn ng lp trnh no khc.

  • 56

    Hm SQL thc thi mt danh sch cc cu lnh SQL ty , tr v kt qu truy vn cui cng trong danh sch. Trong trng hp n gin, hng u tin ca kt qu truy vn cui cng s c tr v (lu rng, hng u tin ca nhiu hng kt qu l khng nh ngha r, tr khi bn s dng mnh ORDER BY). Nu truy vn cui cng xy ra, khng tr li hng no, th gi tr null s c tr v.

    Ngoi ra, hm SQL c th c khai bo tr v mt tp, bng cch xc nh kiu tr v ca hm bng SETOF, hoc bng cch RETURN TABLE (ct). Trong trng hp ny, tt c cc hng ca kt qu truy vn cui cng c tr v.

    Thn ca mt hm SQL phi l mt danh sch cc cu lnh SQL c cch nhau bng du chm phy. Du chm phy sau cu lnh cui cng, tr khi, hm c khai bo tr v void, cu lnh cui cng phi l SELECT, INSERT, UPDATE, DELETE.

    C php : CREATE FUNCTION name ( [ argumenttype [, ...] ] ) RETURNS returntype AS 'definition' LANGUAGE 'languagename'

    Gii thch :

    - CREATE FUNCTION name ( [ argumenttype [, ...] ] ) : name l tn ca hm mi s c to ra. Bn trong hm l cc kiu d liu ca i s s c truen vo, cch nhau bi du phy. i s trong hm SQL c tham chiu trong thn hm SQL s dng c php : $n. $1 ngha l i s th nht, $2 ngha l i s th hai$n l i s th n. Nu i s thuc kiu d liu hn hp th chng ta phi khai bo theo c php: $1.name, khi , c th truy cp thuc tnh ca i s. Chng ta c th trng bn trong hm nu hm khng yu cu nhp i s.

    - RETURNS returntype : kiu d liu tr v l kiu d liu duy nht ca gi tr m n c tr v bi hm.

    - AS definition : ni dung ca hm.

    - LANGUAGE language_name : tn ngn ng dng vit hm.

  • 57

    V d Hm SQL vi kiu d liu c bn : Cc kiu d liu c bn thng dng nh integer, float, text, chng thng c dng khai bo kiu cho i s i vi nhng hm c i s truyn vo, hoc dng khai bo kiu cho gi tr tr v ca hm c hoc khng c i s.

    Vit hm tnh tng ca 2 s nguyn, hm c tn l add_em(integer, integer), c 2 i s kiu integer c truyn vo, gi tr tr v ca hm l kiu integer.

    CREATE FUNCTION add_em(integer, integer) RETURNS integer AS SELECT $1 + $2 LANGUAGE sql;

    Truy vn : SELECT add_em(1,2) AS answer; Kt qu truy vn : answer=3;

    Hm SQL s dng kiu d liu hn hp : l kiu d liu do ngi dng nh ngha, n cng bao hm vic s dng cc kiu d liu c bn cho vic khai bo cc thuc tnh ca kiu d liu hn hp. Ngha l, khng ch nh ra i s m cn phi ch ra thuc tnh ca i s .

    Vit hm tnh lng gp i ca nhn vin. Hm double_salary(employee) : i s truyn vo c kiu d liu hn hp employee(name, salary, age, room) (c nh ngha phn 1.2), gi tr tr v c kiu numeric.

    CREATE FUNCTION double_salary(employee) RETURNS numeric AS SELECT $1.salary * 2 AS salary; LANGUAGE sql;

    Truy vn : SELECT name, double_salary(employee.*) FROM employee

    WHERE employee.room = point (2,1); Ch : c php $1.salary . $1 l i s u tin cng l duy nht ca hm double_salary(employee) v $1.salary l ly thuc tnh salary ca i s truyn vo.

    Hm SQL s dng tham s u ra: nu theo c php to hm bng cu lnh SQL c cha t kha RETURNS dng tr v kiu d liu ca hm. Nhng thay vo s dng t kha RETURNS chng ta s dng tham s u ra. Theo di v d :

  • 58

    CREATE FUNCTION add_em(IN x int, INT y int , OUT sum int) AS SELECT $1+$2 LANGUAGE SQL;

    CREATE FUNCTION add_em(int x, int y) RETURNS int AS SELECT $1+$2 LANGUAGE SQL; 2 hm ny c chc nng tng t nhau l tnh tng 2 s nguyn, tuy nhin cch to hm th nht s dng t kha RETURNS tr li kt qu ca hm, cn cch to th hai th li dng tham s u ra. Khi s dng hm cng ging nhau, tc l cng c 2 tham s kiu int c truyn vo. Tuy nhin, khi chng ta thc hin xa hm th cn phi phn bit:

    DROP FUNCTION add_em(x int, y int, OUT sum int); DROP FUNCTION add_em(int, int); Hm SQL s dng gi tr mc nh cho i s: hm c th c nh ngha vi gi tr mc nh cho mt s hoc tt c cc i s truyn vo. Gi tr mc nh c chn vo khi hm c gi truyn thiu tham s, tt nhin, ch c th thiu tham s gn gi tr mc nh, nu thiu cc tham s khc th h thng s bo li do bn truyn khng tham s. Nu hm c truyn tham s th gi tr mc nh s khng c s dng. V d:

    CREATE FUNCTION foo(a int, a int DEFAULT 2, c int DEFAULT 3) RETURN int LANGUAGE SQL AS SELECT $1+$2+$3;

    SELECT foo(10,20,30); Kt qu tr v l 60 SELECT foo(10,20); Kt qu tr v l 33 SELECT foo(10); Kt qu tr v l 15 Hm SQL truy vn t bng : tt c cc hm SQL c th c s dng trong mnh FROM ca mt truy vn, nhng n c bit c tc dng cho hm tr v kiu d liu hn hp. Nu hm c nh ngha tr v kiu d liu c bn th bng tr v s l mt ct, cn nu hm c nh ngha tr v kiu d liu hn hp th bng tr v s bao gm nhiu ct, mi ct l mt thuc tnh ca kiu hn hp. V d : CREATE TABLE foo (fooid int, foosubid int, fooname text);

    INSERT INTO foo VALUES (1, 1, 'Joe'); INSERT INTO foo VALUES (1, 2, 'Ed');

  • 59

    INSERT INTO foo VALUES (2, 1, 'Mary'); CREATE FUNCTION getfoo(int) RETURNS foo AS $$ SELECT * FROM foo WHERE fooid = $1; $$ LANGUAGE SQL; SELECT *, upper(fooname) FROM getfoo(1) AS t1; fooid | foosubid | fooname | upper -------+----------+---------+------- 1 | 1 | Joe | JOE Hm SQL tr v mt tp: khi mt hm SQL c a ra kiu tr v SETOF, kt qu truy vn cui cng ca hm c hon thnh th mi hng u ra ca n s c tr li nh yu t ca tp kt qu.

    CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$ SELECT * FROM foo WHERE fooid = $1; $$ LANGUAGE SQL; SELECT * FROM getfoo(1) AS t1; fooid | foosubid | fooname -------+----------+--------- 1 | 1 | Joe 1 | 2 | Ed

    (2 rows)

    3.2.2. Hm s dng ngn ng lp trnh C

    Vic thc thi phn m rng PostgreSQL thc s nhanh hn kh c th t c bng cch s dng bt c iu g khc hn C. V PostgreSQL c vit hon ton bng ngn

  • 60

    ng C, iu ny c v hp l. Vit m bng ngn ng C c th khng phi l cch nhanh nht ca vic thc thi cc tnh nng, nhng vic thc hin cc hm s khng b nh hng nhiu m cc ngn ng lp trnh khc gy ra.

    Hm do ngi dng nh ngha c th vit bng ngn ng lp trnh C hoc ngn ng lp trnh cao cp hn C nh C++. Thng thng, hm do ngi dng nh ngha c thm vo PostgreSQL bng cch s dng b np i tng (th vin chia s). Cc th vin chia s c np ti thi im chy (khi hm c gi ln u tin) v li trong b nh cho phn cn li ca phin lm vic. Nhng hiu bit ny thc s quan trng cho mc ch g li. Nu bn mun kim tra m rng ca bn vi s gip ca psql, cn kt ni li vi CSDL trc khi bin dch li v b sung module vo CSDL ca bn. Nu khng, cc i tng c vn cn trong b nh.

    Bng di ch ra kiu trong C tng ng vi kiu trong SQL khi vit hm bng ngn ng C s dng tch hp kiu ca PostgreSQL.

    Bng 3-1 : Danh sch kiu d liu trong SQL v trong C

    Kiu SQL Kiu C Th vin khai bo trong PostgreSQL

    Abstime AbsoluteTime Utils/nabstime.h

    Boolean Bool Postgres.h

    Box BOX* Utils/geo_decls.h

    Bytea Bytea* Postgres.h

    char Char

    Character BpChar* Postgres.h

    cid CommandId Postgres.h

    Date DateADT Utils/date.h

    Smallint(int2) Int2 or int16 Postgres.h

  • 61

    Int2vector Int2vector* Postgres.h

    Integer(int4) Int4 or int32 Postgres.h

    Real(float4) Float4* Postgres.h

    Doubl precision (float8) Float8* Postgres.h

    Interval Interval* Utils/timestamp.h

    Lseg LSEG* Utils/geo_decls.h

    Name Name Postgres.h

    Oid Oid Postgres.h

    Oidvector Oidvector* Postgres.h

    Path PATH* Utils/geo_decls.h

    Point POINT* Utils/geo_decls.h

    Regproc Regproc Postgres.h

    Reltime relaticeTiem Utils/nabstime.h

    Text Text* Postgres.h

    Tid ItemPointer Storage/itemptr.h

    Time timeADT Utils/date.h

    Time with time zone TimeTzADT Utils/date.h

    Timestamp Timestamps* Utils/timestamp.h

    Tinterval timeInterval Utils/nabstime.h

  • 62

    Varchar varChar* Postgres.h

    Xid TransactionId Postgres.h

    S c hai giai on phi lm thm hm m rng vo PostgreSQl. u tn, chng ta vit hm m rng bng ngn ng mnh chn, chng ta chn ngn ng C, sau bin dch chng vo b np i tng (file .dll nu trong Window v file .so nu trong Linux/Unix). Tip theo, hy cho postgreSQL bit v hm m rng, s dng lnh CREATE FUNCTION thm hm vo trong c s d liu. N l hai giai on chnh chng ta c th thm hm m rng vo PostgreSQL, chi tit cc giai on s c tm hiu k hn cc phn tip theo.

    a. Cch vit hm bng ngn ng C

    C mt s bc cn thit vit mt hm m rng cho PostgreSQL bng ngn ng C. Khi chng ta gi mt hm trong chng trnh C c bn, chng ta cn phi bit ti thi im no m chng trnh s lm th no gi hm . Chng ta cn bit bao nhiu i s c yu cu v bit c kiu d liu ca mi i s . Nu chng ta cung cp s lng i s khng chnh xc hoc khng ng kiu d liu, khi chng trnh ca chng ta s khng th thc thi.

    Ngoi ra, phin bn ca PostgreSQL cng nh hng rt ln n qu trnh vit m chng trnh. PostgreSQL tn ti 2 phin bn l Version 0 v Version 1. Trong phm vi ca kha lun, ti ch a ra bn bc vi Version 1.

    vit v thc thi mt hm m rng cho PostgreSQL c vit bng ngn ng C hot ng tt th chng ta cn ch mt s quy tc vit. C th ni, y l nhng quy tc c bn nht m ngi lp trnh vit hm m rng cn bit. N s gip ch rt ln cho vic vit v xy dng hm C. Nhng quy tc c bn l :

    S dng pg_config includedir-server tm kim cc tp tin tiu ca PostgreSQL c ci t trn h thng.

    Khi phn b b nh, s dng cc hm trong PostgresSQL l palloc v pfree thay v th vin hm trong C tng ng l malloc v free. B nh c phn b bi

  • 63

    hm palloc se c tr li mt cch t ng ti cui mi giao tc, ngn chn r r b nh.

    Hu ht cc kiu bn trong PostgreSQL u c khai bo trong tp tin postgres.h, cn cc hm qun l giao din c khai bo trong tp tin fmgr.h, v vy, chng ta cn phi dng n t nht hai tp tin .

    Tn bin, cc k hiu bn trong tp tin khng c trng nhau hoc khng c trng vi cc k hiu, tn c nh ngha trong postgreSQL. Khi , bn cn phi i tn hm hoc bin nu h thng a ra li trong trng hp ny.

    Version 1

    Trong c 2 phin bn ca PostgreSQL th, phn khai bo cc th vin hm l vic khng th thiu trong khi vit m.

    #include #include #include Vic khai bo cc th vin hm m bo l khi bin dch tp tin trong c s

    dng cc kiu, cc hm h tr ca PostgreSQL th h thng c th d dng xc nh c cc kiu, cc hm h tr u m c. V d, s dng hm PG_FUNCTION_ARGS th chng ta cn phi khai bo th vin hm c tn fmgr.h. V c bn, khi vit hm m rng cho postgreSQL bng ngn ng C, th trong hm lun lun cn khai bo hai th vin hm postgres.h v fmgr.h. Tt nhin, postgreSQL cn c nhiu th vin hm khc, nhng bn ch nn khai bo khi bn thc s cn n n, chng hn l pht trin m m phc tp hn.

    Version 1 h tr c vic gi cc quy c, v Version 1 h tr nhiu tnh nng v hot ng linh hot hn. C hai h qu quan trng i vi Version 1. u tin, tt c cc hm trong Version 1 u tr v kiu d liu ging nhau l : Datum. Mt Datum l kiu d liu ph bin. Bt k kiu d liu trong PostgreSQL u c th c truy cp thng qua Datum. PostgreSQL cung cp mt tp ln cc macro n c d dng lm vic vi Datum. Th hai, hm trong Version 1 s dng tp cc macro truy cp cc i s ca hm. Mi hm trong Version 1 c khai bo theo cch sau :

  • 64

    Datum function-name (PG_FUNCTION_ARGS); Mt khi :

    PG_FUNCTION_INFO_V1(function_name); PG_FUNCTION_INFO_V1 l hm qun l nhng thay i gn y c xy dng vi trnh bin dch ngn ng a dng. N cn c s dng trong tt c cc tp tin. Tuy n khng cn thit cho cc hm bn trong postgreSQL nhng n cn c khai bo s dng cho cc hm b np ng.

    Mi i s c th c ly ra bng cch s dng hm PG_GETARG_xxx() tng ng vi kiu d liu ca mi i s . Vi xxx l kiu d liu c th c lit k trong bngcc tham s u vo ca hm PG_GETARG_xxx() c tnh bt u t s 0. Lu rng, tham s truyn vo phi m bo khng phi l gi tr NULL.

    VD : int32 arg = PG_GETARG_INT32(0); text *t = PG_GETARG_TEXT_P(0); Hu t _P ngha l mt con tr.

    Khai bo kiu int23 cho nhiu bin :

    int32 arg1 = PG_GETARG_INT32(0); int32 arg2 = PG_GETARG_INT32(1); Ngoi ra, hm PG_GETARG_xxx_COPY() m bo vic sao chp i s c ch nh c an ton trong vic ghi chp vo .

    tnh gi tr tr v ca cc i s chng ta s dng hm PG_RETURN_xxx(). Tng t vi hm PG_GETARG_xxx() th xxx cng l kiu d liu c lit k trong bng. Trong trng hp, hm tr v gi tr NULL, chng ta s dng hm PG_RETURN_NULL(). Ch , khi chng ta s dng ng thi hai hm PG_GETARG_xxx() v PG_RETURN_xxx() th kiu xxx bt buc phi trng nhau. Gi s chng ta c hm add_one() vi mc ch l cng 1 n v cho i s truyn vo, i s ny c kiu d liu l int32. V th, hm PG_GETARG_INT32() v hm PG_RETURN_INT32() c cng kiu d liu l int32:

    Datum add_one(PG_FUNCTION_ARGS)

  • 65

    { int32 arg = PG_GETARG_INT32(0); PG_RETURN_INT32(arg + 1);

    } kim tra i s truyn vo c phi l ga tr NULL hay khng, chng ta s dng hm PG_ARGISNULL(n). Nu n=0 ngha l PG_ARGISNULL(0) tr v ng.

    Cc k hiu VARDATA, VARSIZE, VARHDRSZ, VARATT_xxx c nh ngha trong file postgres.h c s dng truy cp cc yu t ca cc kiu bin d liu cu trc v d nh kiu TEXT. K hiu VARHDRSZ l hng s cha kch thc mt phn c nh ca kiu d liu cu trc. VARSIZE() tr v kch thc ca ton b kiu d liu cu trc. VARDATA() th tr v mt con tr n byte u tin ca gi tr TEXT. Chiu di ca gi tr TEXT s l VARSIZE() VARHDRSZ.

    cp pht b nh hoc tr b nh bin ta s dng hm palloc() v pfree(). Palloc() c chc nng tng t nh malloc() : n dng cp pht s lng byte c yu cu v tr v con tr n khong khng mi. Hm palloc() c dng nhiu do n ngn chn c s r r ca b nh, tc l sau khi cp pht b nh cho bin, bin s dng xong b nh PostgreSQL c th t ng thu hi li b nh, m bo b nh khng b lng ph. Do vy, chng ta nn s dng hm palloc() v pfree() khi vit hm m rng hn l s dng hm malloc() v hm free().khng

    b. Thao tc bin dch file

    Cng vic v cng cn thit theo sau vic vit m C l cng vic bin dch file. Nh bit, s dng c file vit bng ngn ng C th chng ta cn bin dch chng thnh file c m rng l .dll nu thao tc trong mi trng Window cn file c m rng l .so nu thao tc file trong mi trng Linux/Unix. PostgreSQL cung cp vic xy dng c s cho phn m rng, c gi l PGXS, v th, modul m rng n gin c th xy dng li mt cch n gin vic ci t server . Lu rng, c s ny khng c dng cho vic xy dng h thng framework m c th s dng xy dng tt c cc phn mm giao din cho PostgreSQL;

    lm bin dch t file .c sang file .so trong mi trng Linux/Unix chng ta cn thc hin cc bc sau :

  • 66

    B1 : to file c tn l Makefile vi ni dung sau :

    MODULES = file_name PGXS := $(shell pg_config --pgxs) Include $(PGXS) Gii thch :

    MODULES : lit k cc i tng chia s c xy dng t tp tin ngun tng t.

    PG_CONFIG : ng dn n chng trnh pg_config cho vic ci t postgreSQL xy dng li.

    File_name : l tn file cn bin dch (khng bao gm phn m rng)

    B2 : chy lnh make, sau chy lnh make install

    Sau khi thc hin xong hai bc trn, file .c s c bin dch sang dng file .so.

    Mc inh, hm m rng c bin dch v ci t cho postgreSQL tng ng vi chng trnh pg_config u tin c tm thy trong ng dn ca bn.

    c. Thao tc to v s dng hm.

    Sau khi bin dch file .c thnh file .so, n y to v s dng hm m rng khng cn l vic kh khn. Vic to v s dng hm m rng c thao tc bng ngn ng SQL. Nh gii thiu phn trn, to hm m rng chng ta dng lnh CREATE FUNCTION

    VD: CREATE FUNCTION add_one(integer) RETURNS integer AS funcs.so,add_one LANGUAGE C ; C php lnh :

    CREATE FUNCTION [tn hm] RETURNS [kiu tr v] AS [file .so],[tn hm s dng] LANGUAGE [ngn ng] Hm m rng c to sau cu lnh trn, cui cng l vic s dng hm. Vic

    xy dng hm m rng trong postgreSQL c thc hin mt ln, nhng s c s dng trong bt c ln khc bi v, sau khi bin dch dng file .so lun tn ti trong th mc /usr/lib/pgsql/

  • 67

    3.2.3. Kiu d liu do ngi dng nh ngha

    Kiu d liu do ngi dng nh ngha lun lun xut hin u vo v u ra ca hm. Nhng hm xc nh kiu d liu s xut hin nh th no trong chui (u vo hoc u ra) v kiu d liu c t chc nh th no trong b nh.

    biu din kiu d liu, chng ta s dng cu trc trong ngn ng C :

    VD : typedef struct point3d { Float4 x; Float4 y; Float4 z; }point3d;

    a. nh ngha hm input v output trong C

    nh dng bn trong, nh dng bn ngoi l gi? Trc khi tm hiu v cch nh ngha hm nhp v xut trong C, chng ta cn c

    nhng hiu bit v nh dng bn trong v nh dng bn ngoi ca gi tr cn nhp.

    nh dng bn ngoi ca mt kiu d liu nh ngha xem ngi dng s nhp d liu nh th no? V gi tr c hin th cho ngi dng bit l g? V c th ni nh dng ny c s dng tng tc vi ngi dng.

    nh dng bn trong ca kiu d liu nh ngha xem gi tr s c hin th bn trong CSDL nh th no? V d, khi bn nhp vo mt gi tr s : 7218942 th nh dng ny s c chuyn i t dng chui sang dng 4Byte c gi tr 00 6E 26 FE, v trong CSDL, gi tr s s c lu dng 4byte . V vy, nh dng bn trong ca kiu d liu c nh dng bn trong CSDL.

    Nhng ti sao li c hai nh dng ny? Nh bit, mi ngn ng lp trnh s cung cp nhng kiu d liu ring, v ngi lp trnh cng ch hiu v s dng nhng kiu d liu thng qua dng hin th bn ngoi (c th hiu l nh dng bn ngoi). V d, trong ngn ng lp trnh C c nh ngha kiu d liu Int, n c th lu tr s nguyn c min xc nh trong b bin dch ca ngn ng ny. Khi s dng kiu d liu int, ngi lp trnh ch c ci nhn v kiu d

  • 68

    liu ny nh : phm vi biu din l [-32768, 32767] v kch thc l 2byte. V khi nhp d liu kiu int cho cc thao tc nh cng, tr, nhn, chia, ngi lp trnh ch cn nhp dng s nh 2+3 m khng cn quan tm b bin dch C s x l th no i vi nhng s nhp vo. Mt khc b bin dch C cng c th hiu c cc php thao tc nh cng, tr, nhn, chia cc gi tr s nguyn. Tuy nhin, cng vic ca b bin dch C l cn a ra cc m cn thit thc hin cc php tnh s hc , v cc m c th coi l nh dng bn trong ca gi tr.

    Sau khi nh ngha kiu d liu, vic cn lm l nh ngha hm u vo v hm u ra trong C. Mc ch ca cng vic ny chnh l xc nh nh dng bn ngoi ca kiu d liu s nh th no?

    V d nh, nh ngha kiu d liu Complex theo c php :

    Typedef struct Complex { Double x; Double y;

    } Complex; Ta c, chui hin th bn ngoi ca kiu d liu dng (x,y).

    c c dng hin th bn ngoi nh trn, chng ta cn to ra hm u vo v u ra cho kiu Complex. Cc hm u vo v u ra thng thng khng kh vit, c bit l hm u ra. Nhng, khi nh ngha chui hin th bn ngoi ca kiu d liu, bn cn phi xc nh v phn tch c php c a ra trong hm u vo.

    Theo di hm u vo :

    PG_FUNCTION_INFO_V1(complex_in); Datum complex_in(PG_FUNCTION_ARGS) {

    char *str = PG_GETARG_CSTRING(0); double x, y; Complex *result;

  • 69

    if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),

    errmsg("invalid input syntax for complex: \"%s\"",str))); result = (Complex *) palloc(sizeof(Complex)); result->x = x; result->y = y; PG_RETURN_POINTER(result);

    } i vi hm u vo, chng ta cn quan tm n s thuc tnh ca kiu d liu

    nh ngha. V d, i vi kiu Complex nh ngha trn, chng c 2 thuc tnh x v y. V vy, s thuc tnh c nhp trong chui bt buc phi l 2 mi hp l. Do , c lnh kim tra s thuc tnh c nhp trong chui c bng 2 hay khng?

    if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2) //qutchui, //a ra s thuc tnh nhp v kim tra s thuc tnh ereport(ERROR,(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for complex: \"%s\"",str))); V kiu tr v ca hm u vo l kiu Complex.

    Theo di hm u ra :

    PG_FUNCTION_INFO_V1(complex_out); Datum complex_out(PG_FUNCTION_ARGS) { Complex *complex = (Complex *) PG_GETARG_POINTER(0); char *result; result = (char *) palloc(100); snprintf(result, 100, "(%g,%g)", complex->x, complex->y);

  • 70

    PG_RETURN_CSTRING(result); } i vi hm u ra, kiu tr v ca hm l kiu chui, c nhim v ch ra cch hin th ca kiu d liu i vi ngi dng. V d, hin th ca kiu Complex vi ngi dng s c dng (a, b).

    Tm li, vic to ra hm u vo v u ra cho kiu d liu rt quan trng trong vic hin th nh dng ca chng ra bn ngoi vi ngi dng. Nh vo chng m ngi dng c th d dng hiu c kiu d liu cn phi c cc yu t no v c hin th nh th no?

    b. S dng cu lnh SQL to hm

    Nu nh phn trc chng ta c cp n cch m rng hm s dng ngn ng truy vn SQL v c php lnh c dng l CREATE FUNCTION. Th trong phn ny, c php lnh cng s c dng to hm. Sau khi bin dch file .c thnh dng file .so, h thng c th nhn bit v np hm th cn thit c bc to hm theo c php :

    CREATE FUNCTION [tn_hm] RETURNS [kiu_d_liu] AS [tn_file](thng thng s l file c nh dng .so), [tn_hm](thng l trng vi tn hm khai bo trc) LANGUAGE C IMUMTABLE STRICT; VD : to ra 2 hm complex_in v complex_out

    CREATE FUNCTION complex_in(cstring) RETURNS complex AS complex.so, //tn fi