如何使用Sequelize从GEOMETRY('POINT')获取lat / lng坐标?

时间:2017-05-18 15:33:26

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

我有一个MS SQL数据库,其中包含一些表,其中包含某些设备的纬度/经度位置。这些位置存储在GEOGRAPHY字段中。现在我想通过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];

1 个答案:

答案 0 :(得分:2)

对MSSQL几何和地理数据类型的正确支持仍在等待中。但是,Tedious确实为您得到的缓冲区提供了解析器:Tediousjs Geoparser

作为解决所有遇到相同问题的人的解决方法,我创建了一个 adapter实用程序,它使用起来非常简单,但仅支持以下几点: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}对象。

在特定情况下,由于使用的是GEOMETRY数据类型,因此需要在适配器上用geography::Point替换geometry::Point。解析器对两者都不是很清楚。