Đầu tiên - tôi giả sử rằng lat_long là cột kiểu georaphy. Nếu đó là cột loại hình học, bạn sẽ phải sửa đổi các ví dụ của tôi thành một số EPSG khác (có thể là 3857 EPSG số liệu cho toàn thế giới). Điều này rất quan trọng vì st_dwithin kiểm tra mét cho loại địa vật lý và trong đơn vị bản đồ cho hình học (và đối với đơn vị EPSG 4326 là độ không phải là mét)
Chèn dữ liệu của bạn như thế này
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))
Tôi giải thích lý do tại sao sử dụng st_setsrid, st_makepoint, và cái quái gì là 4326.- 4326 là EPSG 4326 - nó là hệ quy chiếu tọa độ được biết đến nhiều nhất (nơi bạn có vĩ độ và độ dài theo độ).
-
st_makepoint - sẽ tạo điểm địa lý từ tọa độ vĩ độ và kinh độ của bạn. Nó sẽ trông giống như byte, nhưng đừng lo lắng, nếu bạn cần thời gian chờ và dài vì một số lý do, bạn có thể lấy chúng bằng các hàm st_x () và st_y () hoặc st_astext (). Điều tốt nhất của có geom hoặc geog (trong trường hợp này) là bạn có thể sử dụng chỉ mục ý chính. Công cụ rất mạnh mẽ giúp tăng tốc các truy vấn địa lý của bạn.
-
st_setsrid - st_makepoint sẽ tạo điểm nhưng với srid =0. Bạn phải cho POSTGIS biết trong phần EPSG nó sẽ đọc dữ liệu của bạn. Ví dụ:nếu bạn bảo anh ấy đọc nó với 4326, nó sẽ ở đúng vị trí trên bản đồ thế giới của google, nhưng nếu bạn nói ví dụ 3857, nó sẽ ở một nơi hoàn toàn khác, vì 3857 là hệ mét không độ nên nó sẽ ở khoảng 50 và 50 mét từ góc trái xuống (hoặc có thể từ trái lên, không nhớ)
Tạo chỉ mục trên geog
create index on car_wash using gist (geog);
Chúng tôi có bảng, chúng tôi có dữ liệu trong đó và lập chỉ mục trên đó. Bây giờ chúng tôi muốn kiểm tra xem điểm của bạn có gần với bất kỳ điểm rửa xe nào của bạn không.
select *
from car_wash cw
where ST_DWithin (cw.geog,ST_GeogFromtext('SRID=4326;POINT(54.21 22.54)'),1000)
AND cw.was_deleted=false
Trong ST_DWithin tham số thứ ba là khoảng cách tính bằng mét (georpahy) hoặc đơn vị bản đồ (hình học). Vì vậy, trong trường hợp này, nó sẽ hiển thị cho bạn tất cả các điểm rửa xe cách vị trí người dùng của bạn tối đa 1000 mét và không bị xóa.