Javascript 如何使用sequelize.js和PostGIS通过接近度正确查找对象?
我正在尝试使用sequelize.js和PostGIS执行一个简单的搜索。 在我的数据库中,我有3个感兴趣的表:用户、邻居和地址。所有地理数据都存储在addresses表中,该表引用了用户和社区Javascript 如何使用sequelize.js和PostGIS通过接近度正确查找对象?,javascript,express,postgis,sequelize.js,Javascript,Express,Postgis,Sequelize.js,我正在尝试使用sequelize.js和PostGIS执行一个简单的搜索。 在我的数据库中,我有3个感兴趣的表:用户、邻居和地址。所有地理数据都存储在addresses表中,该表引用了用户和社区 return Neighborhood.findById(id).then(neighborhood => { return neighborhood.getAddress().then(address => { return Address.findAll({ wh
return Neighborhood.findById(id).then(neighborhood => {
return neighborhood.getAddress().then(address => {
return Address.findAll({
where: sequelize.where(
sequelize.fn(
'ST_DWithin',
sequelize.fn(
'ST_Transform',
address.position,
26986),
sequelize.fn('ST_Transform',
sequelize.col('position'),
26986),
distance),
true
)
})
})
}).catch(err => new Error(err));
首先我得到一个邻居的地址,然后使用sequelize.fn使用PostGIS ST_DWithin函数进行查询。但是,这会抛出一个错误TypeError:val.replace不是一个函数
。我相信这是一个带有行地址.位置的东西。表中的列位置
地址
存储类型为geometry和srid 4326的几何点
如果不使用address.position
I硬编码类似于sequelize.fn('ST_geomefromtext','POINT(39.807222-76.984722)'4326)
在我的例子中,几何体(POINT)属性在用户实体中。这就是我的工作:
var lat = parseFloat(json.lat);
var lng = parseFloat(json.lng);
var attributes = Object.keys(User.attributes);
var distanceAttribute =
sequelize.fn('ST_Distance_Sphere',
sequelize.literal('geolocation'),
sequelize.literal('ST_MakePoint('+lat+','+lng+')'));
var distanceAlias = [distanceAttribute, 'distance'];
attributes.push(distanceAlias);
var query = {
attributes: attributes,
where: sequelize.where(distanceAttribute, {$lte: 100000}),
logging: console.log
}
User.findAll(query)
.then(function(instance){
console.log(instance);
});
这将生成如下SQL:
SELECT "user_id", "user_name" ... ST_Distance_Sphere(geolocation,
ST_MakePoint(-22.4149023,-47.56513940000002)) AS "distance"
FROM "user" AS "User"
WHERE ST_Distance_Sphere(geolocation,
ST_MakePoint(-22.4149023,-47.56513940000002)) <= 100000;
选择“用户名”、“用户名”。。。距离球(地理位置,
ST_MakePoint(-22.4149023,-47.565139400002))作为“距离”
从“用户”变为“用户”
其中ST_距离_球面(地理位置,
ST_MakePoint(-22.4149023,-47.565139400002))除非您在南极洲有地址,否则它应该是点(-76.984722 39.807222)
这只是一个地理位置示例。它可能是任何其他坐标