Hàm xác định mối quan hệ không gian

Một phần của tài liệu cơ sở dữ liệu không gian (Trang 34 - 40)

ST_Equals()

- Chức năng của hàm ST_Equals là trả về True nếu đưa ra những hình coi là “bằng nhau trong không gian”. Lưu ý, “bằng nhau trong không gian ” nghĩa là ST_Within(A, B)=True và ST_Within(B,A)=True và cũng có nghĩa là sắp xếp của các điểm có thể khác nhau nhưng cấu trúc hiển thị hình học lại giống nhau.

- Cú pháp : 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 thẳng từđiểm (0, 0)-> điểm (10, 10)

- Chức năng của hàm ST_Disjoint là trả về True nếu các hình “không giao nhau trong không gian” nếu chúng không chia sẻ bất cứ khoảng không gian nào cho nhau, hay là tách biệt hẳn với nhau. Nếu bất kỳ các hàm ST_Overlaps(), ST_Touches(), ST_Within() trả về True thì các hình đó không phải có không gian phân chia. Lưu ý, hàm ST_Disjoint() không sử dụng cơ chếđánh chỉ mục.

- Cú pháp : 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ì : điểm (0, 0) và đoạn thẳng nối 2 điểm (2, 0) và điểm (0, 2) không có bất kỳđiểm nào chung.

ST_Intersects()

- Chức năng của hàm ST_Intersects là trả về True nếu các hình gọi là “giao nhau trong không gian” và trả về False nếu chúng không có bất cứđiểm nào giao nhau. Nếu các hàm ST_Overlaps(), ST_Touches(), ST_Within() trả về true, thì những hình đó được coi là giao nhau.

- Cú pháp : 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 nói cách khác là điểm (0, 0) và đoạn thẳng (2,0) -> (0,2) không có bất kỳđiểm giao nhau nào.

ST_Touches()

- Chức năng của hàm ST_Touches là trả về True nếu các hình có ít nhất 1 điểm chung, nhưng bên trong của chúng lại không giao nhau. Quan hệ ST_Touches() áp dụng cho Vùng/Vùng, Đường/Đường, Đường/Vùng, Điểm/Vùng, Điểm/Đường nhưng không áp dụng cho cặp Điểm/Điểm.

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

Trả về giá trị True vì đoạn thẳng từ điểm (0,0)->(1,1)->(0,2) tiếp xúc với điểm (0,2) tại đầu đoạn thẳng chứ không phải điểm giữa của đoạn thẳng. Nếu xét đoạn thẳng trên với điểm

(1, 1) thì giá trị trả về là False vì chúng tiếp xúc nhau với điểm giữa của đoạn thẳng. Các minh họa về quan hệ ST_Touches() trả về giá trị True.

Hình 2-1 : Minh họa hàm ST_Touches(). • ST_Overlaps()

- Chức năng của hàm ST_Overlaps là trả về True nếu các hình có khoảng không gian chia sẻ, có cùng chiều, nhưng chúng không hoàn toàn bị chứa bởi hình khác.

- Cú pháp : boolean ST_Overlaps(geometry A, geometry B); - Ví dụ :

- Chức năng của hàm ST_Crosses là trả về True nếu đối tượng hình học thu được có chiều nhỏ hơn chiều lớn nhất của 2 đối tượng hình học ban đầu. Đối tượng thu được phải chứa các điểm bên trong của 2 đối tượng hình học ban đầu và đối tượng thu được phải không bằng một trong 2 đối tượng đầu vào. Trường hợp còn lại, trả về False.

- Cú pháp : boolean ST_Crosses(geometry g1, geometry g2);

- Ví dụ : có 2 bảng roads (id , the_geom) và highways(id, the_geom) Xác đinh danh sách road giao với highway :

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

ST_Within()

- Chức năng của hàm ST_Winthin là trả về True nếu hình A nằm hoàn toàn bên trong hình B

* Lưu ý : ST_Within(A, B)=ST_Contains(B, A)

- Cú pháp : boolean ST_Within(geometry A, geometry B) - Ví dụ : đường tròn nhỏ nằm hoàn toàn bên trong đường tròn to

Hình 2-2 : Minh họa hàm ST_Within() (adsbygoogle = window.adsbygoogle || []).push({});

ST_Contains()

- Chức năng của hàm ST_Contains là trả về True khi và chỉ khi không có điểm nào của B nằm bên ngoài A, và ít nhất 1 điểm bên trong B nằm bên trong A.

Hình 2-3 : Minh họa hàm ST_Contains() - Cú pháp : boolean ST_Contains(geometry B, geometry A); • ST_Distance()

- Chức năng : hàm ST_Distance trả về khoảng cách giữa 2 điểm, giữa điểm và đường trong không gian 2D. Đơn vị mặc định là “meter”.

- Cú pháp : float ST_Distance (geometry g1, geometry g2); - Ví dụ : Khoảng cách của 2 điểm POINT (0 0) và POINT (3 4); SELECT ST_Distance (‘POINT(0 0)’,’POINT(3 4)’);

st_distance= 5;

Khoảng cách từđiểm POINT(0 0) đến đường LINESTRING(0 3, 3 4); st_distance = 3;

ST_Length()

- Chức năng : hàm ST_Area trả về diện tích của hình nếu nó là POLYGON hoặc MULTIPOLYGON. Đơn vị mặc định là m2.

- Cú pháp : float ST_Area(gemetry g1);

- Ví dụ : Bảng dữ liệu bc_voting_area lưu trữ thông tin của các vùng tham gia bầu cử. Yêu cầu tính tổng diện tích của tất cả càc vùng có tham gia bầu cử có số người tham gia bầu 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()

- Chức năng : hàm ST_Length() trả về độ dài 2d của hình nếu chúng là LINESTRING hoặc MULTILINESTRING. Đơn vị mặc định của độ dài là “meter”

- Cú pháp : float ST_Length(geometry Linestring); - Ví dụ : Tính độ dài của 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()

- Chức năng : hàm ST_Perimeter trả về chu vi của hình nếu nó có dạng Polygon hoặc Multipolygon. Đơn vị mặc định là meter.

- Cú pháp : 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

Một phần của tài liệu cơ sở dữ liệu không gian (Trang 34 - 40)