使用NodeJS,BookshelfJS和Knex进行PostGIS查询

时间:2017-08-18 15:11:07

标签: node.js postgresql express postgis bookshelf.js

我正在使用NodeJS,BookshelfJS和ExpressJS开展项目。 我的数据库是Postgres,安装了Postgis。 我的桌子'组织'有一个' lat_lon'几何列。 我想查询特定纬度/长点的固定半径内的所有组织。 我试过这样的事情:

var organizations = await Organization.query(function (qb) {
 qb.where('ST_DWithin(lat_lon, ST_GeomFromText("POINT(45.43 10.99)", 4326), 1000 )') 
}).fetchAll()

以及更多组合,但它不起作用。 它给我一个错误

  

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):TypeError:运算符" undefined"不允许

似乎期待操作员处于何处,但我已经开始研究' lat_lon'列。

我该如何解决? 感谢

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用knex.raw()?

var organizations = await Organization.query(function (qb) {
 qb.where(knex.raw('ST_DWithin(lat_lon, ST_GeomFromText("POINT(45.43 10.99)", 4326), 1000 )'))
}).fetchAll()

答案 1 :(得分:0)

我发现whereRaw是遇到类似情况时正在寻找的解决方案。

基本示例

如果我们使用where

进行以下查询
qb.where('id', 2')

相当于whereRaw

qb.whereRaw('id = ?', [2])

从问题中应用于情境

我相信这与您的查询大致相同

qb.whereRaw('ST_DWithin(lat_lon, ST_GeomFromText("POINT(45.43 10.99)", 4326), 1000 )') 

可以将其参数化为

qb.whereRaw(
    'ST_DWithin(lat_lon, ST_GeomFromText("POINT(?, ?)", 4326), ?)',
    [45.43, 10.99, 1000]
) 

如果经度,纬度或搜索半径要更改。