我有一个MS SQL数据库,其中包含一个包含某些设备的纬度/经度位置的表。这些位置存储在地理字段中。现在我想使用 Sequelize 从我的节点应用程序中获取这些位置。
这是我的续集模型定义:
db.define('StationLocation', {
StationId: { type: Sequelize.INTEGER },
Position: { type: Sequelize.GEOMETRY('POINT') }
}
)
这是我目前得到的:
{
"id":4,
"StationId":1,
"Position":{
"type":"Buffer",
"data":[
230,
16,
0,
0,
1,
12,
25,
159,
112,
57,
112,
200,
73,
64,
0,
0,
0,
128,
184,
247,
26,
64
]
}
}
如何将其转换为纬度和经度值?续集能做到这一点吗?
更新:在上面的例子中,位置是这样的:
Latitude: 51.565924816122966
Longitude: 6.741914749145508
这是我的查询:
StationLocation
.findAll({ raw: true })
.then(function(allStationLocations) {
console.dir(allStationLocations[0].coordinates); // Just for debugging
res.send(JSON.stringify(allStationLocations));
});
这转换为以下 SQL 语句:
SELECT [id], [StationId], [Position] FROM [StationLocations] AS [StationLocation];
对 MSSQL 几何和地理数据类型的正确支持仍悬而未决。然而,乏味确实为你得到的缓冲区提供了一个解析器:乏味的地理解析器
作为遇到相同问题的任何人的解决方法,我创建了一个适配器实用程序,它使用起来相当简单,但仅支持以下几点: 续集 MSSQL 适配器
在模型定义中相应地要求和使用有关代码段说明的详细信息。
const adapter = require('../utils/sequelize-geodata-adapter');
module.exports = (sequelize, DataType) =>
sequelize.define('MyModel', {
// Attributes
location: {
type: DataType.GEOGRAPHY('POINT', 4326),
get: function () {
const location = this.getDataValue('location');
if (location)
return adapter.get(location);
},
set: function (value) {
if (value === undefined || value === null)
return this.setDataValue('location', value);
this.setDataValue('location', adapter.set(value));
},
validate: {
hasCoordinates: adapter.validate
}
},
...
}, {
tableName: 'MyModels'
...
});
Setter 支持 GeoJSON 和 Google 风格的{lat, lng}
位置格式,getter 始终返回{lat, lng}
对象。
在特定情况下,您需要将适配器上的geography::Point
替换为geometry::Point
,因为您使用的是 GEOMETRY 数据类型。解析器对于两者都是模糊的。