Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Sequelize zapytanie geoprzestrzenne:znajdź n punktów najbliższych lokalizacji

Gdy otaczasz sequelize.fn w nawiasach jako alias należy również podać ciąg:

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

Spróbuj także zmienić ST_Distance do ST_Distance_Sphere . A więc:

    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);
    })

To faktycznie działa w przypadku me.obs:upewnij się, że zastępujesz „Użytkownika” modelem, w którym masz typ danych geometrii.

Aktualizacja: Jeśli nadal nie możesz zamówić za pomocą order: 'distance' , może powinieneś zadeklarować to w var i użyć order: distance bez cudzysłowów, tak:

    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
    }

Aktualizacja dokładności odległości:

Rozwiązanie wspomniane przez sarikayę wydaje się być dokładniejsze. Oto jak to zrobić za pomocą postgresa:

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. Formatuj liczbę jako procent w MySQL

  2. Wynik czasu zapytania w MySQL z PHP

  3. Zapytanie SQL o co najmniej jedno z czegoś

  4. Czy mogę użyć przygotowanej instrukcji PDO do powiązania identyfikatora (nazwy tabeli lub pola) lub słowa kluczowego składni?

  5. Symbole wieloznaczne w nazwie kolumny dla MySQL