Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Sekuel kueri geospasial:temukan n titik terdekat ke suatu lokasi

Saat Anda mengelilingi sequelize.fn dengan tanda kurung, Anda juga harus menyertakan string sebagai alias:

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

Juga, coba ubah ST_Distance ke ST_Distance_Sphere . Jadi:

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

Ini sebenarnya bekerja untuk me.obs:pastikan Anda mengganti 'Pengguna' dengan model di mana Anda memiliki tipe data geometri.

Pembaruan: Jika Anda masih tidak dapat memesan menggunakan order: 'distance' , mungkin Anda harus mendeklarasikannya dalam var dan menggunakan order: distance tanpa tanda kutip, seperti ini:

    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
    }

Pembaruan tentang akurasi jarak:

Solusi yang disebutkan oleh sarikaya tampaknya lebih akurat. Berikut adalah cara melakukannya menggunakan 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. cara mendapatkan kembali UUID Java yang disimpan di DB sebagai biner

  2. tanda kutip tunggal dalam SQL Query

  3. Banyak ke Banyak di dalam Meja Banyak ke Banyak

  4. PDO menolak untuk menghapus baris data (dalam tabel tertentu)

  5. Apa Itu MySQL:Gambaran Umum