sql >> Database >  >> RDS >> Mysql

Sequelize geospatial query:vind n punten die het dichtst bij een locatie liggen

Wanneer je sequelize.fn . omringt tussen haakjes, moet u ook een tekenreeks als alias opnemen:

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

Probeer ook ST_Distance te veranderen naar ST_Distance_Sphere . Dus:

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

Dit werkt echt voor me.obs:zorg ervoor dat je 'Gebruiker' vervangt door het model waarin je het gegevenstype geometrie hebt.

Bijwerken: Als je nog steeds niet kunt bestellen met order: 'distance' , misschien moet je het in een var declareren en order: distance gebruiken zonder aanhalingstekens, zoals dit:

    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
    }

Update over afstandsnauwkeurigheid:

De oplossing genoemd door sarikaya lijkt me nauwkeuriger. Hier is hoe het te doen met behulp van 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. MySql - eerst op tekenreekswaarde sorteren

  2. Hoe kan ik de eerste dag van een maand in SQL selecteren?

  3. Hoe een onbekend aantal kolommen te draaien en geen aggregaat in SQL Server?

  4. Probleem met tekencodering met PHP Simple HTML DOM Parser