Mysql
 sql >> база данни >  >> RDS >> Mysql

Sequelize геопространствена заявка:намерете n най-близки точки до местоположение

Когато обграждате sequelize.fn със скоби, трябва да включите и низ като псевдоним:

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

Също така опитайте да промените ST_Distance до ST_Distance_Sphere . И така:

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

Това всъщност работи за me.obs:не забравяйте да замените „Потребител“ с модела, в който имате геометричния тип данни.

Актуализация: Ако все още не можете да поръчате с помощта на order: 'distance' , може би трябва да го декларирате във var и да използвате order: distance без кавички, като това:

    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
    }

Актуализация относно точността на разстоянието:

Решението, споменато отsarikaya изглежда е по-точен. Ето как да го направите с помощта на 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. PHP:mysql v mysqli v pdo

  2. Каква е целта на character_set_connection?

  3. Проблем с изпълнението на процедурата във файла schema.sql за пролетно зареждане

  4. Не мога да създам модел на данни за обект - използвайки MySql и EF6

  5. Как мога да задам максималния брой MySQL процеси или нишки?