如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?

Posted

技术标签:

【中文标题】如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?【英文标题】:How to insert a PostGIS GEOMETRY Point in Sequelize ORM? 【发布时间】:2015-11-10 15:26:14 【问题描述】:

我正在尝试在 Sequelize.js ORM 中具有几何列的表中插入一行。 我有纬度、经度和高度,需要先将其转换为一个点,以便将其作为几何图形插入。

进行转换的 PostGIS 存储过程是

ST_MakePoint( longitude, latitude, altitude ) 

要插入一行,我正在使用 sequelize model.create 函数

models.Data.create(    
  location: "ST_MakePoint("+request.params.lon+", "+request.params.lat+", "+request.params.alt+")", // PSUEDO code, How can I call this function?
  speed: request.params.spd,
  azimuth: request.params.azi,
  accuracy: request.params.acc
);

现在我要做的是让字段location 在插入行时返回"ST_MakePoint("+request.params.lon+", "+request.params.lat+", "+request.params.alt+")" 的结果。

我该怎么做?

【问题讨论】:

【参考方案1】:

扩展 l0oky 的答案,integration test 有很多关于如何将 json 与不同类型的几何图形一起使用的好线索。基本上,sequelize 似乎会将提供的几何对象字符串化,假设它是有效的 GeoJSON 并将其传递到 PostGIS 函数 ST_GeomFromGeoJSON。因此,几何对象只需按照GeoJSON spec 即可。

积分:

var point =  type: 'Point', coordinates: [39.807222,-76.984722];

User.create(username: 'username', geometry: point ).then(function(newUser) 
...
);

线串:

var line =  type: 'LineString', 'coordinates': [ [100.0, 0.0], [101.0, 1.0] ] ;

User.create(username: 'username', geometry: line ).then(function(newUser) 
...
);

多边形:

var polygon =  type: 'Polygon', coordinates: [
             [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
               [100.0, 1.0], [100.0, 0.0] ]
             ];

User.create(username: 'username', geometry: polygon ).then(function(newUser) 
...
);

设置自定义 SRID:

var point =  
  type: 'Point', 
  coordinates: [39.807222,-76.984722],
  crs:  type: 'name', properties:  name: 'EPSG:4326' 
;

User.create(username: 'username', geometry: point ).then(function(newUser) 
...
);

【讨论】:

【参考方案2】:

经过一番研究,我发现 Sequelize 3.5.1(支持 GEOMETRY)有一个 test 插入了一个 Point

var point =  type: 'Point', coordinates: [39.807222,-76.984722] ; 
return User.create( username: 'user', email: ['foo@bar.com'], location: point)

location 是一个 GEOMETRY 字段。这样我就不需要手动调用ST_MakePoint,sequelize 会处理这个问题。

【讨论】:

以上是关于如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sequelize ORM Query 中更改日期格式?

Node.js:如何在 Sequelize 中使用 Postgres 存储过程?

如何在 Sequelize ORM 中获取不带前缀表名的连接数据结果

如何在sequelize ORM中使用从时间戳中选择并提取日期到月份和年份?

DAO vs ORM - 在 Sequelize.js 的上下文中解释的概念

如何使用 Sequelize.js ORM 正确迁移 sqlite3 数据库?