12/08/2018, 15:18

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

_ Trong bài viết trước mình giới thiệu với mọi người một số nhóm hàm và hàm để thao tác với hệ quản trị CSDL không gian như: + Nhóm hàm điều khiển + Nhóm hàm khởi tạo hình học + Nhóm hàm trả về kiểu dữ liệu hình học ở đầu ra + Nhóm hàm xác định mối quan hệ không gian -> Trong bài này mình sẽ ...

_ Trong bài viết trước mình giới thiệu với mọi người một số nhóm hàm và hàm để thao tác với hệ quản trị CSDL không gian như: + Nhóm hàm điều khiển + Nhóm hàm khởi tạo hình học + Nhóm hàm trả về kiểu dữ liệu hình học ở đầu ra + Nhóm hàm xác định mối quan hệ không gian -> Trong bài này mình sẽ tiếp tục giới thiệu những nhóm hàm và hàm mà mình biết đồng thời sẽ lấy ví dụ như thực tế mà mọi người có thể gặp phải.

_ 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. ST_Intersection() _ Cú pháp: ST_Intersection(geometry A, geometry B); _ Chức năng: hàm ST_Intersection là trả về một hình, hiển thị phần chung giữa hình A và hình B. Nếu hình A và hình B không có bất kỳ điểm chung thì trả về đối tượng hình rỗng. _ Ví dụ: SELECT ST_AsText(ST_Intersection(POINT(0,0), ST_GeomFromText('LINESTRING(2 0, 0 2)'))); => Kết quả: Empty SELECT ST_AsText(ST_Intersection(POINT(0,0), ST_GeomFromText('LINESTRING(2 0, 0 2)'))); => Kết quả: POINT(0 0)
  2. STDifference() _ Cú pháp: ST_Difference(geometry geomA, geometry geomB); _ Chức năng: hàm ST_Difference là trả về một hình hiển thị phần của hình A mà không giao với hình B. Các bạn có thể hiểu là có hai hình A và B thì sẽ lấy hình A trừ đi phần chung của A và B có dạng như sau: ST_Difference() = GeometryA – ST_Intersection(A, B). Và nếu A nằm hoàn toàn trong B thì đương nhiên ST_Difference() sẽ trả về rỗng. Hình trên mô tả phía bên phải là phần khác nhau của A(xanh lá) và B(xanh dương) _ Ví dụ: SELECT ST_AsText (ST_Difference(ST_GeomFromText('LINESTRING(50 100, 50 200)'),ST_GeomFromText('LINESTRING(50 50, 50 150)'))); => kết quả: LINESTRING(50 150,50 200)
  3. ST_Union()
    _ Cú pháp: ST_Union (geometry A, geometry B) _ Chức năng: Trả về một hình hiển thị hợp của các hình. Kiểu trả về của hàm có thể là MULTI*, hình đơn lẻ hoặc tập hợp các hình. _ Ví dụ: SELECT ST_AsText(ST_Union(ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(-2 3)'))); => Kết quả: MULTIPOINT((-2 3),(1 2)) hay: SELECT ST_AsText(ST_Union(ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(1 2)'))); => Kết quả: POINT(1 2)
  4. ST_SymDifference() _ Cú pháp: ST_SymDifference (geometry geomA, geometry geomB); _ Chức năng: hàm ST_SymDifference trả về một hình hiển thị phần của hình A và hình B không giao nhau. Nó được gọi là sự khác nhau đối xứng lý do : ST_SymDifference(A, B) = ST_SymDifference (B, A). Chúng ta có thể hiểu theo công thức sau : ST_SymDifference (A, B) = ST_Union (A, B) – ST_Intersection (A, B). _ Ví dụ: SELECT ST_AsText(ST_SymDifference(ST_GeomFromText('LINESTRING (50 100, 50 200)'),ST_GeomFromText('LINESTRING (50 50, 50 150)'))); => Kết quả: MULTILINESTRING((50 150,50 200),(50 50,50 100))
  1. ST_Buffer() _ Cú pháp: * ST_Buffer (geometry g1, float R); * ST_Buffer(geometry g1, float R, integer num_seg_quater_circle); * ST_Buffer(geometry g1, float R, text buffer_style_parameters); _ Chức năng: hàm ST_Buffer trả về môt hình hiển thị cho tất cả các điểm mà khoảng cách của chúng từ hình <= khoảng cách cho trước.
  • Tùy chọn buffer_style:
    • quad_segs: số đoạn được sử dụng để xấp xỉ ¼ vòng tròn (mặc định là 8).
    • endcap= round|flat|square: kiểu kết thúc, mặc định là round.
    • joint=round|mitre|bevel: kiểu nối, mặc định là round.
    • mitre_limit : tỉ lệ giới hạn mép Đơn vị của bán kính được đo bằng đơn vị của hệ thống tham chiếu không gian. Đầu ra của hàm có thể là POINT, MULTIPOINT, LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON và GEOMETRYCOLLECTION. _ Ví dụ:
  1. GeometryType() _ Cú pháp: GeometryType(geometry g1); _ Chức năng: hàm GeometryType là trả về kiểu của hình học dưới dạng chuỗi. Ví dụ : Linestring, Polygon, MultiPolygon… _ Ví dụ: SELECT GeometryType(ST_GeomFromText('LINESTRING(10 10, 20 20)')); => Kết quả: LINESTRING
  2. ST_GeometryType() _ Hàm này mình chạy trên mysql thì kết quả tương tự như hàm GeometryType() nhưng một số tài liệu của hệ quản trị CSDL khác thì hàm này sẽ trả về Kiểu hình học như: ST_Linestring, ST_Polygon, ST_MultiPolygon… Vì vậy nếu các bạn áp dụng cho hệ csdl khác thì có thể đọc thêm về hàm hai hàm này.
  3. ST_IsValid() _ Cú pháp: ST_IsValid(geometry g) _ hàm ST_IsValid là trả về True nếu hình đó là hợp lệ. Khái niệm hợp lệ trong trường hợp này, nghĩa là, các kiểu hình học có dạng POINT, POLYGON…và được biểu diễn hợp lý như POINT(0 0), POLYGON(0 0, 1 1, 1 2, 0 0). Trong trường hợp kiểu hình học là không hợp lệ, thì Hệ quản trị CSDL sẽ đưa ra thông báo chi tiết tại sao kiểu hình học đó lại không hợp lệ. _ Ví dụ: SELECT ST_IsValid(ST_GeomFromText('LINESTRING(0 0, 1 1)')); => Kết quả: True (1).
  • Ví dụ bây giờ mình sẽ có một bài toán: cho một danh sách các lái xe(xe taxi, xe máy ...) đang ở các vị trí khác nhau được lưu trong bảng của mysql, hãy tìm ra các xe trọng phạm vi bán kính là 2km.
    1. Danh sách xe trong thành phố _ Danh sách xe (driver) bao gồm các thông tin: tên và tên đệm, cột thứ 3 location là vị trí của lái xe có điểm kinh độ và vĩ độ. Hiện tại danh sách này các xe đều ơ trong khu vực Hà Nội và gần keangnam.
    2. Danh sách xe tìm kiếm được trong phạm vi bán kính 2.5km _ Như hình các bạn đã thấy ở hình trên mình sử dụng where với hàm ST_Within như một điều kiện lọc các bản ghi thỏa mãn điều kiện là nằm trong hình có bán kính 2.5km, hình đó có tâm là điểm point mà đã truyền vào đối số của hàm GeomFromText ở trên. Kết quả là có 2 xe được tìm thấy.
    3. Cùng với biểu thức như vậy nhưng thay đổi bán kính chỉ còn 0.55 km thì kết quả chỉ còn một xe được tìm thấy

=>> Kết hợp với part 2 và bài hôm nay mình chia sẻ thì đây là một số hàm thao tác với CSDL không gian mà mình biết ở thời điểm hiện tại, nếu tới đây mà mình có nghiên cứu và đọc thêm về nó thì sẽ lại có những bài chia sẻ nữa tới mọi người hoặc mình cũng rất mong nhận được những chia sẻ liên quan tới chủ đề này từ mọi người. Bài viết còn sơ sài hy vọng mọi người lượng thứ và cũng mong là nó sẽ giúp ích phần nào cho các bạn đang quan tâm. Thanks all!

0