web-dev-qa-db-ja.com

PostGISジオメトリポイントをSequelize ORMに挿入する方法

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+")"の結果を返すようにします。

どうやってやるの?

19
Muhamed Krlić

L0okyの答えを拡張すると、 統合テスト は、さまざまなタイプのジオメトリで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) {
...
});
30
Evan Siroky

少し調べたところ、Sequelize 3.5.1(GEOMETRYをサポートしています)にPointを挿入する test があることがわかりました。

var point = { type: 'Point', coordinates: [39.807222,-76.984722] }; 
return User.create({ username: 'user', email: ['[email protected]'], location: point})

ここで、locationはGEOMETRYフィールドです。このように手動でST_MakePointを呼び出す必要はありません。sequelizeが処理します。

4
Muhamed Krlić