Professional Documents
Culture Documents
Huong Dan Su Dung Postgis PDF
Huong Dan Su Dung Postgis PDF
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
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 :
Xc nhn khng gian : n cho php thc hin nhng truy vn True/False.
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.
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.
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
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.
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
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.
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
-h HOSTNAME Ch ra HOSTNAME
15
-p PORT Ch ra cng kt ni CSDL. Mc nh l
5432
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
\c [DBNAME] Kt ni n c s d liu
\r Reset li truy vn
17
Bng 2-9: Nhm lnh vo / ra ca psql
\da Lit k cc hm tp hp
18
\a Cn ln
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
20
ALTER SCHEMA CREATE USER PREPARE
21
TRIGGER
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
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
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
C:\Program Files\PostgreSQL\8.2\bin\psql.exe
U postgres f bc_pubs d postgis
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) |
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.
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
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).
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 :
Quad_segs=8 Quad_segs=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);
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.
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
Bng bc_voting_areas
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
Bng bc_border
Bng bc_hospitals
48
Bng bc_municipality
2.5.2. Truy vn
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 ST_Perimeter(the_geom)
FROM bc_municipality
WHERE name = 'VANCOUVER';
st_perimeter
------------------
50
57321.7782018048
(1 row))
51
5.2.2. Nhm hm so snh
ST_Intersects( geometryA, geometryB) tr v kiu True nu cc hnh giao nhau
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;
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;
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;
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);
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
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;
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
char Char
60
Int2vector Int2vector* Postgres.h
61
Varchar varChar* Postgres.h
62
hm palloc se c tr li mt cch t ng ti cui mi giao tc, ngn chn r r
b nh.
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);
64
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
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;
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);
}
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=+);
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)
);
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);
}
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 = * );
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
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,);
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:
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