我的应用程序使用Node.js(v9.3.0),PostgreSQL(v9.5.1.0)作为数据库,PostGIS(v2.2.1)作为扩展安装,Sequelize(v4.37.6)作为ORM。我试图在LineStringZM列中插入4D数据 - 经度,纬度,高度和unix时间戳 - 但我收到以下错误:
DatabaseError: Column has M dimension but geometry does not
经过一些研究,我发现Sequelize使用函数ST_GeomFromGeoJSON
来插入空间数据。但是,此函数似乎忽略了我的GeoJSON数据中的第4维,这会导致上述错误。
我认为使用ST_MakeLine
(使用适当的输入)而不是ST_GeomFromGeoJSON
的原始查询可以解决我的问题。但是,使用Sequelize插入4D空间数据是否有更简单的方法或更优雅的解决方案?
有条件的信息:
模型样本:
const GEOGRAPHY = require('sequelize').GEOGRAPHY
module.exports = function (sequelize, DataTypes) {
let Course = sequelize.define('Course', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
gps: {
type: GEOGRAPHY('LinestringZM', 4326)
}
}, {
tableName: 'courses',
timestamps: false,
paranoid: false
})
return Course
}
Sequelize生成的插入代码:
INSERT INTO "courses" ("gps")
VALUES (St_geomfromgeojson(
'{"type":"LineString","crs":{"type":"name","properties"{"name":"EPSG:4326"}},"coordinates":[[-44.058367,-19.964709,0,1521552190]]}'
));
上面的SQL返回以下异常:DatabaseError: Column has M dimension but geometry does not
。
使用ST_MakeLine
成功插入:
INSERT INTO "courses" ("gps")
VALUES (ST_MakeLine(ST_MakePoint(1,2, 10, 1), ST_MakePoint(3,4, 10, 1)));