sql >> データベース >  >> RDS >> Mysql

地理空間クエリの続編:場所に最も近い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で機能しています。必ず「User」をジオメトリデータ型のモデルに置き換えてください。

    更新: それでもorder: 'distance'を使用して注文できない場合 、多分あなたはそれを変数で宣言し、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
        }
    

    距離の精度に関する最新情報:

    サリカヤが言及した解決策 より正確なようです。 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エラー接続が多すぎます

    2. MySQLで行をフェッチするクエリを選択します

    3. MariaDB CURRENT_DATE()の説明

    4. Sqoop:mysqlドライバーの例外を読み込めませんでした