Chương 9. Hàm và toán tử
9.11. Hàm và toán tử hình học
Các dạng point, box, lseg, line, path, polygon và circle có một tập hợp lớn các hàm và toán tử bẩm sinh hỗ trợ, được chỉ ra trong Bảng 9-30, và Bảng 9-32.
Chú ý
Lưu ý rằng toán tử “hệt như”, ~ =, thể hiện ký hiệu bằng nhau thông thường cho các dạng the point, box, polygon và circle. Một số dạng đó cũng có một toán tử =, nhưng = so với chỉ các lĩnh vực bằng nhau. Các toán tử so sánh tuyến tính khác (<= và … ) hơn nữa so sánh các lĩnh vực cho các dạng đó.
Bảng 9-30. Các toán tử địa lý
Toán tử Mô tả Ví dụ
+ Chuyển đổi box ’((0,0),(1,1))’ + point ’(2.0,0)’
- Chuyển đổi box ’((0,0),(1,1))’ - point ’(2.0,0)’
* Co dãn / Xoay box ’((0,0),(1,1))’ * point ’(2.0,0)’
/ Co dãn / Xoay box ’((0,0),(2,2))’ / point ’(2.0,0)’
# Điểm hoặc hộp giao nhau ’((1,-1),(-1,1))’ # ’((1,1),(-1,-1))’
# Số các điểm trên đường hoặc đa giác # ’((1,0),(0,1),(-1,0))’
@-@ Chiều dài hoặc chu vi @-@ path ’((0,0),(1,0))’
@@ Tâm @@ circle ’((0,0),10)’
## Điểm gần nhất với toán hạng đầu tiên trong toán hạng
thứ 2 point ’(0,0)’ ## lseg ’((2,0),(0,2))’
<-> Khoảng giữa circle ’((0,0),1)’ <-> circle ’((5,0),1)’
Toán tử Mô tả Ví dụ
&& Chồng lấn? (Một điểm chung làm điều này thành đúng). box ’((0,0),(1,1))’ && box ’((0,0),(2,2))’
<< Nghiêm trái? circle ’((0,0),1)’ << circle ’((5,0),1)’
>> Nghiêm phải? circle ’((5,0),1)’ >> circle ’((0,0),1)’
&< Không mở rộng sang phải? box ’((0,0),(1,1))’ &< box ’((0,0),(2,2))’
&> Không mở rộng sang trái? box ’((0,0),(3,3))’ &> box ’((0,0),(2,2))’
<<| Nghiêm dưới? box ’((0,0),(3,3))’ <<| box ’((3,4),(5,5))’
|>> Nghiêm trên? box ’((3,4),(5,5))’ |>> box ’((0,0),(3,3))’
&<| Không mở rộng lên trên? box ’((0,0),(1,1))’ &<| box ’((0,0),(2,2))’
|&> Không mở rộng xuống dưới? box ’((0,0),(3,3))’ |&> box ’((0,0),(2,2))’
<^ Ở dưới (cho phép động tới)? circle ’((0,0),1)’ <^ circle ’((0,5),1)’
>^ Ở trên (cho phép động tới)? circle ’((0,5),1)’ >^ circle ’((0,0),1)’
?# Giao nhau? lseg ’((-1,0),(1,0))’ ?# box ’((-2,-2),(2,2))’
?- Nằm ngang? ?- lseg ’((-1,0),(1,0))’
?- Dóng hàng nằm ngang? point ’(1,0)’ ?- point ’(0,0)’
?| Thẳng đứng? ?| lseg ’((-1,0),(1,0))’
?| Dóng hàng thẳng đứng? point ’(0,1)’ ?| point ’(0,0)’
?-| Vuông góc? lseg ’((0,0),(0,1))’ ?-| lseg ’((0,0),(1,0))’
?|| Song song? lseg ’((-1,0),(1,0))’ ?|| lseg ’((-1,2),(1,2))’
@> Bao gồm? circle ’((0,0),2)’ @> point ’(1,1)’
<@ Nằm trong hoặc nằm trên? point ’(1,1)’ <@ circle ’((0,0),2)’
~= Hệt như? polygon ’((0,0),(1,1))’ ~= polygon ’((1,1),(0,0))’
Lưu ý: Trước PostgreSQL 8.2, các toán tử chứa @> và <@ từng được gọi một cách tương ứng là ~ và @. Các tên đó vẫn sẵn sàng, nhưng được cắt ngắn và cuối cùng sẽ bị loại bỏ.
Bảng 9-31. Các hàm địa lý
Hàm Dạng trả về Mô tả Ví dụ
area(object) double precision vùng diện tích area(box ’((0,0),(1,1))’)
center(object) point tâm center(box ’((0,0),(1,2))’)
diameter(circle) double precision đường kính vòng tròn diameter(circle ’((0,0),2.0)’) height(box) double precision kích thước chiều dọc của hộp height(box ’((0,0),(1,1))’) isclosed(path) boolean đường khép kín? isclosed(path ’((0,0),(1,1),(2,0))’) isopen(path) boolean đường mở? isopen(path ’[(0,0),(1,1),(2,0)]’) length(object) double precision độ dài length(path ’((-1,0),(1,0))’)
npoints(path) int số các điểm npoints(path ’[(0,0),(1,1),(2,0)]’)
npoints(polygon) int số các điểm npoints(polygon ’((1,1),(0,0))’)
pclose(path) path biến đổi đường thành khép kín pclose(path ’[(0,0),(1,1),(2,0)]’)
Hàm Dạng trả về Mô tả Ví dụ
popen(path) path biến đổi đường thành mở popen(path ’((0,0),(1,1),(2,0))’) radius(circle) double precision bán kính vòng tròn radius(circle ’((0,0),2.0)’) width(box) double precision kích thước nằm ngang của hộp width(box ’((0,0),(1,1))’)
Bảng 9-32. Các hàm biến đổi dạng hình học
Hàm Dạng trả về Mô tả Ví dụ
box(circle) box vòng tròn thành hộp box(circle ’((0,0),2.0)’)
box(point, point) box các điểm thành hộp box(point ’(0,0)’, point ’(1,1)’)
box(polygon) box đa giác thành hộp box(polygon ’((0,0),(1,1),(2,0))’)
circle(box) circle hộp thành vòng tròn circle(box ’((0,0),(1,1))’) circle(point, double precision) circle tâm và bán kính đường tròn circle(point ’(0,0)’, 2.0)
circle(polygon) circle đa giác thành đường tròn circle(polygon ’((0,0),(1,1),(2,0))’) lseg(box) lseg đường chéo hộp thành đoạn thẳng lseg(box ’((-1,0),(1,0))’)
lseg(point, point) lseg các điểm thành đoạn thẳng lseg(point ’(-1,0)’, point ’(1,0)’) path(polygon) path đa giác thành đường path(polygon ’((0,0),(1,1),(2,0))’) point(double precision, double
precision)
point xây dựng điểm point(23.4, -44.5)
point(box) point tâm của hộp point(box ’((-1,0),(1,0))’)
point(circle) point tâm đường tròn point(circle ’((0,0),2.0)’)
point(lseg) point tâm của đoạn thẳng point(lseg ’((-1,0),(1,0))’)
point(polygon) point tâm của đa giác point(polygon ’((0,0),(1,1),(2,0))’) polygon(box) polygon hộp thành đa giác 4 điểm polygon(box ’((0,0),(1,1))’) polygon(circle) polygon đường tròn thành đa giác 12 điểm polygon(circle ’((0,0),2.0)’) polygon(npts, circle) polygon đường tròn thành đa giác npts điểm Polygon(12, circle ’((0,0),2.0)’) polygon(path) polygon đường thành đa giác polygon(path ’((0,0),(1,1),(2,0))’)
Có khả năng truy cập 2 số thành phần của một điểm dù điểm đó từng là một mảng với các chỉ số 0 và 1. Ví dụ, nếu t.p là một cột các điểm point thì SELECT p[0] FROM t truy xuất tọa độ X và UPDATE t SET p[1] = ... thay đổi tọa độ Y. Theo cách y hệt, một giá trị dạng box hoặc lseg có thể được truy xuất như một mảng của 2 giá trị điểm point.
Hàm area làm việc cho các dạng box, circle và path. Hàm area chỉ làm việc ở dạng dữ liệu path nếu các điểm trong path là không giao nhau. Ví dụ, path ’((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))’::PATH sẽ không làm việc; tuy nhiên, path ’((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))’::PATH sẽ làm việc.
Nếu khái niệm của việc giao nhau đối lại với path không giao nhau là dễ lẫn, thì hãy vẽ cả 2 đường
path ở trên cạnh nhau trong một mẩu giấy đồ họa.