Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sắp xếp chuỗi truy vấn không gian địa lý:tìm n điểm gần nhất với một vị trí

Khi bạn bao quanh sequize.fn với dấu ngoặc, bạn cũng phải bao gồm một chuỗi làm bí danh:

[sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location), 'ALIASNAME']

Ngoài ra, hãy thử thay đổi ST_Distance tới ST_Distance_Sphere . Vì vậy:

    const location = sequelize.literal(`ST_GeomFromText('POINT(${lng} ${lat})', 4326)`);

    User.findAll({
      attributes: [[sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location),'distance']],
      order: 'distance',
      limit: 10,
      logging: console.log
    })
    .then(function(instance){
      console.log(instance);
    })

Điều này thực sự hiệu quả với me.obs:hãy đảm bảo bạn thay thế 'Người dùng' bằng mô hình mà bạn có kiểu dữ liệu hình học.

Cập nhật: Nếu bạn vẫn không thể đặt hàng bằng order: 'distance' , có thể bạn nên khai báo nó trong một var và sử dụng order: distance không có dấu ngoặc kép, như thế này:

    var lat = parseFloat(json.lat);
    var lng = parseFloat(json.lng);
    var attributes = Object.keys(User.attributes);

    var location = sequelize.literal(`ST_GeomFromText('POINT(${lng} ${lat})')`);
    var distance = sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location);
    attributes.push([distance,'distance']);

    var query = {
      attributes: attributes,
      order: distance,
      include: {model: Address, as: 'address'},
      where: sequelize.where(distance, {$lte: maxDistance}),
      logging: console.log
    }

Cập nhật về độ chính xác của khoảng cách:

Giải pháp được đề cập bởi sarikaya dường như chính xác hơn. Đây là cách thực hiện bằng cách sử dụng postgres:

var distance = sequelize.literal("6371 * acos(cos(radians("+lat+")) * cos(radians(ST_X(location))) * cos(radians("+lng+") - radians(ST_Y(location))) + sin(radians("+lat+")) * sin(radians(ST_X(location))))");


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để ghi vào cơ sở dữ liệu nhiều tác giả trong bảng sách đơn giản?

  2. Kết nối với máy chủ MySQL từ xa bằng SSL từ PHP

  3. Nối nhiều hàng trong các hàng đơn trong MySQL

  4. Truy vấn SPARQL để lấy tất cả cha mẹ của một nút

  5. MySQL xóa tất cả các hàng có id lớn hơn số đã cho