sql >> Databáze >  >> RDS >> Mysql

Sequelizovat geoprostorový dotaz:najděte n nejbližších bodů k místu

Když obklopíte sequelize.fn s hranatými závorkami musíte také zahrnout řetězec jako alias:

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

Zkuste také změnit ST_Distance do ST_Distance_Sphere . Takže:

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

Ve skutečnosti to funguje pro me.obs:ujistěte se, že jste nahradili 'Uživatel' modelem, ve kterém máte typ dat geometrie.

Aktualizace: Pokud stále nemůžete objednat pomocí order: 'distance' , možná byste to měli deklarovat ve var a použít order: distance bez uvozovek, takto:

    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
    }

Aktualizace přesnosti vzdálenosti:

Řešení, které zmiňuje sarikaya se zdá být přesnější. Zde je návod, jak to udělat pomocí 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. SQLServer vs StateServer pro výkon stavu relace ASP.NET

  2. Připojte se k mysql na jiném serveru

  3. @GeneratedValue polymorfní abstraktní supertřída přes MySQL

  4. Tipy pro monitorování MySQL pro Moodle