Trong PostgreSQL, việc xử lý dữ liệu không gian địa lý (geospatial data) được hỗ trợ mạnh mẽ thông qua phần mở rộng PostGIS. PostGIS cung cấp một tập hợp các kiểu dữ liệu và hàm cho phép bạn lưu trữ, truy vấn và phân tích dữ liệu không gian trong cơ sở dữ liệu PostgreSQL.
Trước tiên, bạn cần cài đặt phần mở rộng PostGIS. Cách cài đặt có thể khác nhau tùy thuộc vào hệ điều hành và phương thức cài đặt PostgreSQL.
sudo apt-get install postgis
sudo yum install postgis
Sau khi cài đặt, bạn cần kích hoạt PostGIS trong cơ sở dữ liệu mong muốn:
CREATE EXTENSION postgis;
PostGIS cung cấp hai kiểu dữ liệu chính để lưu trữ thông tin không gian:
POINT
: Điểm (kinh độ, vĩ độ).LINESTRING
: Đường gấp khúc (chuỗi các điểm).POLYGON
: Đa giác (vùng khép kín).MULTIPOINT
, MULTILINESTRING
, MULTIPOLYGON
: Tập hợp các điểm, đường, đa giác.Bạn có thể tạo bảng chứa các cột có kiểu dữ liệu không gian như sau:
CREATE TABLE my_locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) -- 4326 là mã SRID cho WGS 84 );
Trong ví dụ này:
geom
là cột lưu trữ dữ liệu điểm với hệ tọa độ không gian 4326 (WGS 84).Bạn có thể chèn dữ liệu vào bảng bằng cách sử dụng hàm ST_GeomFromText
hoặc ST_Point
:
INSERT INTO my_locations (name, geom) VALUES ( 'Hanoi', ST_GeomFromText('POINT(105.8342 21.0278)', 4326) );
Hoặc:
INSERT INTO my_locations (name, geom) VALUES ( 'Ho Chi Minh City', ST_SetSRID(ST_Point(106.6602, 10.7626), 4326) );
SELECT id, name, ST_AsText(geom) as geom_text FROM my_locations;
Giả sử bạn muốn tìm tất cả các địa điểm trong bán kính 50 km từ một điểm cho trước:
SELECT id, name FROM my_locations WHERE ST_DWithin( geom::geography, ST_SetSRID(ST_Point(105.8342, 21.0278), 4326)::geography, 50000 -- khoảng cách tính bằng mét );
SELECT a.name as name_a, b.name as name_b, ST_Distance(a.geom::geography, b.geom::geography) as distance_meters FROM my_locations a, my_locations b WHERE a.id b.id;
Để tăng tốc độ truy vấn không gian, bạn nên tạo chỉ mục không gian trên cột không gian:
CREATE INDEX idx_my_locations_geom ON my_locations USING GIST (geom);
ST_Distance(geom1, geom2)
: Tính khoảng cách giữa hai đối tượng hình học.ST_Area(geom)
: Tính diện tích của một đa giác.ST_Contains(geom1, geom2)
: Kiểm tra liệu geom1
có chứa geom2
hay không.ST_Intersects(geom1, geom2)
: Kiểm tra liệu hai đối tượng có giao nhau hay không.ST_Buffer(geom, radius)
: Tạo vùng đệm xung quanh một đối tượng.ST_Intersects
:SELECT a.name FROM my_locations a JOIN my_areas b ON ST_Intersects(a.geom, b.geom) WHERE b.name = 'Specific Area';
Bạn có thể nhập và xuất dữ liệu không gian ở định dạng GeoJSON hoặc Well-Known Text (WKT):
INSERT INTO my_locations (name, geom) VALUES ( 'Da Nang', ST_GeomFromGeoJSON('{"type":"Point","coordinates":[108.2022,16.0471]}') );
SELECT name, ST_AsGeoJSON(geom) as geojson FROM my_locations;
PostGIS cũng hỗ trợ dữ liệu raster (ảnh vệ tinh, bản đồ độ cao):
raster
PostGIS mở rộng khả năng của PostgreSQL, biến nó thành một hệ quản trị cơ sở dữ liệu không gian mạnh mẽ. Bạn có thể lưu trữ và xử lý dữ liệu không gian với độ chính xác cao, sử dụng các hàm và chỉ mục tối ưu hóa cho truy vấn không gian.
Lưu ý: Khi làm việc với dữ liệu không gian, việc sử dụng đúng hệ tọa độ (SRID) là rất quan trọng để đảm bảo tính chính xác của kết quả.
Tham khảo thêm: