You are on page 1of 84

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

1
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

2
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

3
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 :

4
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.

5
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

6
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.

7
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.

8
+ 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

9
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)

10
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)

11
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

12
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

13
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.

14
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

15
-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 :

16
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 .

17
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

18
\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

19
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 END


CLASS

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 CREATE TABLESPACE LOCK


CLASS

ALTER OPERATOR CREATE TRIGGER MOVE

ALTER ROLE CREATE TYPE NOTIFY

20
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 SET ROLE


CLASS

COPY DROP OPERATOR SET SESSION


AUTHORIZATION

CREAT AGGREGATE DROP ROLE SET TRANSACTION

CREATE CAST DROP RULE SHOW

CREATE CONSTRAINT DROP SCHEMA START TRANSACTION

21
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;

22
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

23
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

24
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.

25
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

26
+ 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

27
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

28
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

29
----------------------+--------------------------------+-----------
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

30
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
(<schema_name>,<table_name>,<column_name>,<srid>,<type>, <dimension>)
Gii thch cc tham s ca hm :
Hm AddGeometryColumn : thm ct hnh hc vo bng tn ti.
+ <schema_name> : tn ca bng s bng.
+ <table_name> : tn ca bng cn thm ct khng gian
+ <column_name> : tn ct cn thm theo kiu khng gian

31
+ <srid_name> : 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.
+ <type>: xc nh kiu hnh hc cho ct.
+ <dimension> : thuc chiu no (0, 1, 2 hoc 3)
Nu ang s hin ti th b qua thng s <schema_name>:
AddGeometryColum (<table_name>,<column_name>,<srid>,<type>,<dimension>)
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

32
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);

33
- 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()

34
- 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);

35
- 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()

36
- 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.

37
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;

38
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.

39
- 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.

40
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()

41
- 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 <= khong cch.

Ty chn buffer_style :
+ quad_segs: s on c s dng xp x vng trn (mc nh l 8).
+ endcap= round|flat|square: kiu kt thc, mc nh l round.
+ joint=round|mitre|bevel: kiu ni, mc nh l round

42
+ 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 Quad_segs=2

SELECT ST_Buffer( SELECT ST_Buffer (


ST_GeomFromText(POINT(100, 90)), ST_GeomFromText(POINT(100,90)), 50,
50, quad_segs=8); quad_seds=2);

43
Endcap=round v join=round Endcap=bevel v join=round
SELECT ST_Buffer( SELECT ST_Buffer(
ST_GeomFromText(LINESTRING(50 50, ST_GeomFromText(LINESTRING(50 50,
150 150, 150 50)), 10, endcap=round 150 150, 150 50)), 10, endcap=square
join=round); 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)

44
- 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.

45
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.

46
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

47
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)

48
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
---------------+-----------------

49
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
------------------

50
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;

51
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.

52
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)

53
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

54
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.

55
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.

56
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 :

57
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');

58
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

59
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

60
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

61
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

62
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 <postgres.h>
#include <fmgr.h>
#include <string.h>

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 :

63
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)

64
{
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 :

65
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/

66
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

67
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;

68
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);

69
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 file c bin dch t file
//complex.c
complex_in //tn hm
LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION complex_out(complex) ETURNS cstring
AS complex.so, complex_out
LANGUAGE C IMMUTABLE STRICT;

70
c. S dng cu lnh SQL to kiu d liu
Kiu d liu ch hon ton c chp nhn sau khi lnh CREATE TYPE complex; hon
ton c h thng chp nhn, c ngha l lnh ny thc thi tr v kt qu ng.
Cu trc lnh CREATE TYPE name (
INPUT= input_function,
OUTPUT=output_function,
INTERNALLENGTH= internallength);
Tt nhin, ty chn lnh CREATE TYPE cn rt nhiu nh RECEIVE, SEND,
ANALYZE tuy nhin, ty chn cn thit cho cu trc lnh l input_function,
output_function v internallength. Cc ty chn ny cung cp cc thng tin cn thit v
ti thiu v hm u vo, hm u ra v di kiu d liu. Do , to mt kiu d
liu th khng th b qua 3 ty chn c bn ny.
Trong trng hp to ra kiu d liu Complex, cc ty chn c cung cp l, hm
u vo : complex_in, hm u ra: complex_out, di kiu d liu : 16byte, ta thc thi
lnh sau
CREATE TYPE complex (
internallength = 16,
input = complex_in,
output = complex_out
);
Cu lnh thc thi thnh cng th kiu d liu c tn Complex s c thm vo h
thng PostgreSQL vi di 16byte, kiu d liu u vo dng s thc, v kiu d liu
u ra l dng chui m t (a, b).
3.2.4. Ton t do ngi dng nh ngha.
PostgreSQL cho php ngi dng to ra cc ton t ty chn c thm vo cc
hm ty chn. i khi, ton t c gi l syntactic sugar cho hm. Ti sao li gi nh
vy? V mt k thut, ton t ch l mt c php thay th cho mt hm hin c. Do ,
trc khi to ra ton t mi chng ta cn to ra hm trc.

71
Ton t PostgreSQL c nh ngha c th bao gm mt vi lnh ty chn, n
thng bo cho h thng bit cc ty chn, h thng s x l ng vi mi ty chn nht
nh. Vi mi ty chn s c nhim v ring trong c php to ton t mi. S dng lnh
di y to ra mt ton t mi.
CREATE OPERATOR name (
PROCEDURE = functionname
[, LEFTARG = type1 ]
[, RIGHTARG = type2 ]
[, COMMUTATOR = commutatorop ] );
hiu r hn v tc dng ca cc ty chn trong lnh CREATE OPERATOR, chng ta
s i su vo tm hiu mc ch, tc dng v gii thch cc ty chn.
+Name : l tn ca ton t mi s c to ra. Ton t c tn Name ch c th bao
gm cc k t c chp nhn di y :
+-*/<>=~!@#%^&|`$?
+ PROCEDURE=functionname : khai bo tn ca hm s c gi trong ton t
mi. hm ny lun lun c to ra trc khi to ton t mi. C th coi, ton t mi ch
l c php thay th cho hm ny. V d, chng ta to ra hm number_add() vi mc
ch l cng hai s, tt nhin, bn trong hm s c m m nhm thc hin chc nng .
V khi mun s dng hm, chng ta c th gi trc tip hm, vic ny c th gy ra nhiu
li nh nhp khng ng tham s truyn vo c v s lng v kiu d liu. Do , vic
to ton t + thay th cho hm number_add() da trn hm number_add() s gip trnh
c nhng sai st khi s dng.
+ LEFTARG = type: ch ra kiu d liu ca bin bn tri
+ RIGHTARG=type : ch ra kiu d liu ca bin bn phi.
+ COMMUTATOR = k t ca ton t
VD: to ra ton t + hai s thc, thay th cho hm complex_add(complex, complex) c
chc nng cng hai s thc.
PG_FUNCTION_INFO_V1(complex_add);

72
Datum complex_add(PG_FUNCTION_ARGS)
{
Complex *complex1=(Complex *)PG_GETARG_P(0);
Complex *complex2=(Complex *)PG_GETARG_P(1);
Complex*complex3=(Complex *)palloc (sizeof(Complex)) ;
complex3->x=complex1->x + complex2->x ;
complex3->y=complex1->y + complex2->y ;
PG_RETURN_POINTER(complex3);
}
CREATE OPERATOR +(
LEFTARG=Complex,
RIGHTARG=Complex,
PROCEDURE=complex_add,
COMMUTATOR=+);

3.2.5. Hm tp hp cho ngi dng nh ngha


Nh bit, hm tp hp trong PostgreSQL theo chun SQL ngha l, n c tc
dng x l tt c cc hng c trong mt ct d liu, t hng u tin n hng cui cng
ca ct . V d, vi hm tnh tng theo chun SQL c tn l sum(), khi ngi dng gi
hm ny, tng ng vi vic ngi dng mun tnh tng cc gi tr tt c cc hng
trong mt ct c th no : SELECT sum (price) FROM Price;
Tng t vi cc hm tp hp theo chun SQL, hm tp hp do ngi nh ngha
m rng cho PostgreSQL cng c nhim v tng t l x l tt c cc hng c trong mt
ct d liu, t hng u tin n hng cui cng. to hm tp hp mi, s dng c
php sau :
CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
SFUNC = sfunc,
STYPE = state_data_type

73
[ , INITCOND = initial_condition ]
)
+ name : tn ca hm tp hp to ra.
+ input_data_type : kiu d liu ca tham s khi nhp vo hm.
+ sfunc : tn hm c s dng thc hin mc ch ca hm tp hp. V d, to
hm tp hp thc hin chc nng tnh tng cc d liu kiu point3d, th cn c mt hm
thc hin vic tnh tng trn kiu d liu point3d.
+ initial_condition : thit lp ban u cho gi tr trng thi. Ngha l iu kin ban u
cho kiu d liu c nhp vo hm.
VD : to hm tp hp tnh tng cc s phc
CREATE AGGREGATE sum_complex(Complex)
(
sfunc = complex_add,
Stype = Complex,
Initcond = (0,0)
);

Sau khi hm tp hp c to, n s c s dng nh nhng hm tp hp chun. Tuy


nhin, vi nhng hm tp hp chun, n c th thc thi vi mi kiu d liu chun, cn
hm tp hp do ngi dng nh ngha ch thc thi thi ngi dng truyn ng kiu d
liu cho bin khi s dng hm.
3.3. Vit hm m rng cho PostgreSQL
Bi ton 1 : To kiu d liu im trong khng gian 3 chiu c tn l point3d gm cc
thuc tnh honh (x), tung (y), cao (z).
Xy dng ton t, cng im, tr im. Xy dng hm tnh khong cch gia 2 im, so
snh gia 2 im.
Xy dng hm tp hp, tnh tng cc im c trong bng d liu. Tnh trng tm ca cc
im c trong bng d liu.

74
Thc hin :
Mc ch ca bi ton l xy dng kiu d liu im trong khng gian 3 chiu, trn kiu
d liu ny, ngi dng c th thc hin thao tc cng, tr, nhn, chia 2 im. Hn na,
ngi dng c th tm c trng tm ca cc im trong khng gian 3 chiu.
- To kiu d liu
typedef struct point3d {
float4 x;
float4 y;
float4 z;
} point3d;

- To hm nhp v hm xut
PG_FUNCTION_INFO_V1(point3d_in_test); //hm nhp
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;

75
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(point3d_out_test); //hm xut
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);
}

- To hm bng truy vn 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;
kiu d liu point3d :
CREATE TYPE
point3d(internallength=16,input=point3d_in_test,ouput=poi
nt3d_out_test);
Nh vy, kiu d liu im trong khng gian gi l point3d c nh dng u vo
thng qua hm point3d_in_test, nh dng u ra thng qua hm point3d_in_test; Sau
khi c kiu d liu point3d, thc hin cng, tr, tnh khong cch gia 2 im

76
- Cng 2 im
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 im
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;

77
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=-);
- Tnh khong cch gia 2 im
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;

78
- Hm tnh 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 = * );

- Hm tnh 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;

79
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 = / );
- To hm tp hp tnh tng cc im
CREATE AGGRAGATE sum_point3d(point3d)(sfunc=point3d_add, stype=point3d,
initcond = (0,0,0));
- Trng tm ca cc im c tnh theo cng thc
G= (pi * mi) / mi

Vi bng d liu mypoint3d (id int, a point3d, m float); th tnh trng


tm ca cc im c trong ct a theo cng thc :
SELECT sum_point3d(a * m) / sum (m) as trong_tam FROM
mypoint3d;

Bi ton 2 : To kiu d liu m t hnh cu trong khng gian (sphere) c cc thuc tnh
tm I (honh x, tung y, cao z) v bn knh r. Xy dng hm tnh th tch hnh
cu.
Thc hin : PostGIS ch h tr kiu d liu hnh hc bao gm POINT, LINESTRING,
POLYGON, nhng cha thy xut hin kiu hnh cu. Do vy mc ch ca bi ton l
to ra kiu d liu hnh cu v xy dng hm tnh th tch hnh cu.
- To kiu d liu sphere bao gm ton ca tm hnh cu I(x,y,z) v bn knh hnh
cu r c biu din :
Typedef struct sphere {
float4 x,
float4 y,

80
float4 z,
float4 r
};
- Tng t, to hm nhp v hm xut d liu c tn sphere_in() v sphere_out()
- Kiu d liu hnh cu
CREATE TYPE sphere (internallength = 16, input =
sphere_in, output = sphere_ou,);

- To hm tnh th tch hnh cu :


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 vy, kiu d liu hnh cu trong khng gian gi l sphere c to, c nh dng
u vo thng qua hm sphere_in, nh dng u ra thng qua hm sphere_out; t ,
tnh th tch hnh cu rt n gin, tnh theo cng thc :
Th_tch = 4/3 * M_PI * r3 ;

81
TNG KT
Sau mt thi gian nghin cu v tm hiu, kha lun thu c cc kt qu nh
sau:

Ci t, thao tc thnh tho vi h qun tr CSDL PostgreSQL thng qua cc kiu


giao tng tc. Ngoi ra, nm r c lch s pht trin v nhng u im ca n
so vi cc h qun tr khc.

i vi PostGIS m dun m rng cho PostgreSQL. Ti trnh by nhng kin


thc nh cch to CSDL khng gian, cch x l vi d liu khng gianc bit
l nm c tc dng v cch s dng cc hm h tr ca PostGIS v s dng
th nghim s lng ln cc hm . T , p dng cc hm vo truy vn
khng gian trong bng khng gian.

Vi phn m rng trong PostgreSQL, ti trnh by kh chi tit v cch m rng


trong PostgreSQL. T nm r c cch vit m rng, s dng cc m rng v
p dng n vo mt s bi ton c th.

Phn thc nghim ca KLTN nh ngha mt s kiu d liu khng gian m rng
v vit cc hm truy vn..
Trong kha lun ny, ti hy vng a ra nhng kin thc cn thit nht v h
qun tr CSDL PostgreSQL v PostGIS m dun m rng ca PostgreSQL. Vi kin
thc v PostGIS h tr truy vn trong CSDL PostgreSQL, ti mong rng chng s c
p dng mt cch thit thc vo i sng thc t.

82
TI LIU THAM KHO
Sch:
[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_snh_cc_h_qun_tr_c_s_d_liu_quan_h
[4] www.vi.wikipedia.org/wiki/Shapefile

83
84

You might also like