Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用sequelize.js和PostGIS通过接近度正确查找对象?_Javascript_Express_Postgis_Sequelize.js - Fatal编程技术网

Javascript 如何使用sequelize.js和PostGIS通过接近度正确查找对象?

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

我正在尝试使用sequelize.js和PostGIS执行一个简单的搜索。 在我的数据库中,我有3个感兴趣的表:用户、邻居和地址。所有地理数据都存储在addresses表中,该表引用了用户和社区

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)
这只是一个地理位置示例。它可能是任何其他坐标