Using Sequelize and geospatial queries, if I want to find the "n" closest points to a certain location, how should the Sequelize query be?
Assume I have a model that looks something like this:
sequelize.define('Point', {geo: DataTypes.GEOMETRY('POINT')});
Now let's say we input 100 random points in the db through something like:
db.Point.create({geo: {type: 'Point', coordinates: [randomLat, randomLng]}});
Imagine we have a lat
and lng
variables to define a location, and we want to find the 10 closest points to it. when I run this query I get an error:
const location = sequelize.literal(`ST_GeomFromText('POINT(${lat} ${lng})', 4326)`);
db.Point.findAll({
attributes: [['distance', sequelize.fn('ST_Distance', sequelize.col('Point'), location)]],
order: 'distance',
limit: 10
});
// -> TypeError: s.replace is not a function
Any idea what is the issue / how to fix it?
Thx!
MySQL can give an error that function
ST_Distance_Sphere
does not exist. In that case you can use this alternative solution:I hold point information separately as latitude and longitude decimals. Assume you should have a model that looks something like this:
Imagine we have a
lat
andlng
variables to define a location, and we want to find the 10 closest points to it:Update:
With Haversine Formula, distance is more accurate:
When you surround sequelize.fn with brackets, you must also include a string as an alias:
Also, try changing
ST_Distance
toST_Distance_Sphere
. So:This is actually working for me. obs: be sure you substitute 'User' with the model in which you have the geometry data type.
Update: If you still can't order using
order: 'distance'
, maybe you should declare it in a var and useorder: distance
without quotes, like this:Update on distance accuracy:
The solution mentioned by sarikaya does seem to be more accurate. Here is how to do it using postgres:
Building off @Edudjr's answer, this is what I did to get it to work in my project:
where Position is defined as:
https://gis.stackexchange.com/questions/209008/incorrect-arguments-to-st-distance-sphere-in-special-cases
https://dba.stackexchange.com/questions/33410/whats-the-difference-between-pointx-y-and-geomfromtextpointx-y