sql-server - 如何使用 Sequelize 从 GEOMETRY ('POINT' 获取纬度/经度坐标?

标签 sql-server node.js sequelize.js sqlgeography

我有一个 MS SQL 数据库,其中包含一个表,其中包含某些设备的纬度/经度位置。这些位置存储在 GEOGRAPHY 字段中。现在我想使用 Sequelize 从我的 Node 应用程序中获取这些位置。

这是我的 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
      ]
   }
}

如何将其转换为纬度和经度值? Sequelize 可以做到这一点吗?

更新:在上面的例子中,位置是这样的:

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 几何和地理数据类型的适当支持仍在等待中。然而,Tedious 确实为您得到的缓冲区提供了一个解析器:Tediousjs Geoparser

作为任何遇到相同问题的人的解决方法,我创建了一个适配器实用程序,它使用起来相当简单,但只支持点:Sequelize MSSQL Adapter

在您的模型定义中相应地要求和使用,有关片段描述的更多信息。

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 数据类型。解析器对两者都是模糊的。

关于sql-server - 如何使用 Sequelize 从 GEOMETRY ('POINT' 获取纬度/经度坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44052061/

相关文章:

sql-server - 如何对由任意表达式描述的日期排序事件进行分组/窗口?

sql-server - SQL Server 最佳实践 - 如何管理一个大型、用途广泛的表的索引

c# - 一次将两条记录插入两个表中,其中一个表使用另一个表作为外键?

mysql - 在 MySQL 和 SQL Server 中查询?

javascript - 如何一次插入两个表?准备好的陈述

javascript - 创建新闻提要的概念

node.js - 将 ENUM 与 Sequelize 和 Typescript 结合使用

sql - 将 PostgreSQL 子查询语句转换为 Sequelize 查询

javascript - 访问我的网站 (.herokuapp.com) 时,Multer (Nodejs) 图像未加载或图像消失

node.js - Sequelize - 在 where 子句中的列上运行