12/08/2018, 15:11

Tìm hiểu về cơ sở dữ liệu không gian [part 2]

_ Chào mọi người, trong bài viết trước mình đã khái niệm cơ bản tới mọi người về cơ sở dữ liệu không gian, về đặc trưng và về mô hình. Trong bài này mình sẽ đi vào giới thiệu các hàm thao tác với dữ liệu không gian mà chúng sẽ được áp dụng trong hầu hết các hệ quản trị cơ sở dữ liệu hiện nay. _ Một ...

_ Chào mọi người, trong bài viết trước mình đã khái niệm cơ bản tới mọi người về cơ sở dữ liệu không gian, về đặc trưng và về mô hình. Trong bài này mình sẽ đi vào giới thiệu các hàm thao tác với dữ liệu không gian mà chúng sẽ được áp dụng trong hầu hết các hệ quản trị cơ sở dữ liệu hiện nay. _ Một số chú ý về từ khóa:

  • schema_name : là tên của bảng sơ đồ.
  • Srid : phải có giá trị là một số nguyên.
  • Type : xác định kiểu hình học cho cột cần thêm, ví dụ : POLYGON, MULTILINESTRING, POINT, MULTIPOINT...
  • Dimention : xác định chiều hình học, chiều tương ứng với kiểu hình học.
  1. AddGeometryColumn() _ Cú pháp: AddGeometryColumn(varchar schema_name, varchar table_name, varchar column_name, integer srid, varchar type, integer dimension); _ Chức năng của hàm AddGeometryColumn là thêm một cột hình học vào bảng đã tồn tại. Hàm này rất quan trọng trong việc tạo bảng trong CSDL không gian. _ Ví dụ : Tạo bảng hình học có tên là my_spatial_table (id serial) và thêm cột hình học (the_geom) có kiểu POINT, trong không gian 2D : SELECT AddGeomtryColumn(‘my_schema’, ‘my_spatial_table’, ‘the_geom’, 4326, ’POINT’, 2);
  2. DropGeometryColumn() _ Cú pháp : DropGeometryColumn(varchar schema_name, varchar table_name, varchar column_name); _ Chức năng của hàm DropGeometryColumn là loại bỏ một cột hình học từ bảng không gian.
    _ Ví dụ : SELECT DropGeomtryColumn(‘my_schema’,’my_spatial_table’,’the_geom’);
  3. DropGeometryTable() _ Cú pháp : DropGeometryTable(varchar schema_name, varchar table_name); _ Chức năng của hàm DropGeometryTable() là loại bỏ bảng và tất cả những gì tham chiếu trong cột hình học. _ Ví dụ: SELECT DropGeometryTable(‘my_schema’, ‘my_spatial_table’);
  1. ST_GeometryFromText() _ Cú pháp : ST_GeometryFromText(text WKT); _ Chức năng của hàm ST_GeometryFromText là trả về giá trị được chỉ định ST_Geometry từ hiển thị WKT. _ Ví dụ: SELECT ST_GeometryFromText(‘POINT(1 0)’);
    • Chú ý : Hàm ST_GeometryFromText() cũng có thể được viết là ST_GeomFromText()
  1. ST_AsText() _ Cú pháp: text ST_AsText(geometry g); _ Chức năng của hàm ST_AsText là trả về hiển thị dạng WKT của hình. _ Ví dụ : SELECT ST_AsText(ST_Union(ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(1 2)'))); =>> kết quả trả ra sẽ là: POINT (1 2);
  1. ST_Equals() _ Cú pháp : ST_Equals(geometry A, geometry B); _ - 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. _ Ví dụ : SELECT ST_Equals(ST_GeomFromText('LINESTRING (0 0, 10 10)'), ST_GeomFromText('LINESTRING (0 0, 5 5, 10 10)'));
    • Ở trên 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)
  2. ST_Disjoint() _ Cú pháp : ST_Disjoint (geometry A, geometry B); _ 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. _ 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.
  3. ST_Intersects() _ Cú pháp: ST_Intersects(geometry A, geometry B);
    _ 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. _ Ví dụ : `SELECT ST_Intersects(POINT(0,0), ST_GeomFromText('LINESTRING(2 0, 0 2)'));
    • 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.
  4. ST_Touches() _ Cú pháp : boolean ST_Touches(geometry g1, geometry g2); _ 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.
  5. ST_Overlaps() _ Cú pháp : ST_Overlaps(geometry A, geometry B); _ 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.
  6. ST_Crosses() _ Cú pháp : ST_Crosses(geometry g1, geometry g2); _ 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.
  7. ST_Within() _ Cú pháp : ST_Within(geometry A, geometry B) _ 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)
  8. ST_Contains() _ Cú pháp : boolean ST_Contains(geometry B, geometry A); _ 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 minh họa.
  9. ST_Distance() _ Cú pháp : ST_Distance (geometry g1, geometry g2); _ 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”. 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)); => distance = 5
  10. ST_Area() _ Cú pháp : ST_Area(gemetry g1); _ 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à m 2 . _ 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;
  11. ST_Length() _ Cú pháp : ST_Length(geometry Linestring); _ 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” _ 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)); =>> 122.630744000095
  12. ST_Perimeter() _ Cú pháp : ST_Perimeter(geometry g1); _ 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. _ Ví dụ : SELECT ST_Perimeter(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416))', 2249)); =>> 122.630744000095

_ Vậy là mình đã giới thiệu rất nhiều hàm và nhóm hàm hữu ích để thao tác với cơ sở dữ liệu không gian, trong bài sau mình sẽ bổ trung thêm một số hàm nữa và đi thêm vào phần demo, ứng dụng. Hy vọng mọi người thấy nó bổ ích.

0