2015-08-17 3 views
12

Ich versuche, eine Zeile in eine Tabelle einzufügen, die über eine Geometrie-Spalte in Sequelize.js-ORM verfügt. Ich habe Breitengrad, Längengrad und Höhe und muss es zuerst in einen Punkt umwandeln, damit ich es als Geometrie einfügen kann.Wie fügt man einen PostGIS GEOMETRY Punkt in Sequelize ORM ein?

Das Verfahren PostGIS gespeichert, die die Umwandlung tut, ist

ST_MakePoint(longitude, latitude, altitude) 

eine Zeile einzufügen ich die sequelize model.create Funktion

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 
}); 

Jetzt bin mit, was ich tun möchte, ist das Feld machen location haben das Ergebnis von "ST_MakePoint("+request.params.lon+", "+request.params.lat+", "+request.params.alt+")" zurückgegeben, wenn ich die Zeile einfügen.

Wie kann ich das tun?

Antwort

17

Erweitern auf l0oky's Antwort, die integration test hat viele gute Hinweise, wie man den json mit verschiedenen Arten von Geometrie verwendet. Im Grunde scheint es, dass Sequelize das bereitgestellte Geometrieobjekt unter der Annahme, dass es sich um ein gültiges GeoJSON handelt, in die PostGIS-Funktion ST_GeomFromGeoJSON pipettieren wird. Daher kann man einfach die GeoJSON spec für Geometrieobjekte folgen.

Punkte:

var point = { type: 'Point', coordinates: [39.807222,-76.984722]}; 

User.create({username: 'username', geometry: point }).then(function(newUser) { 
... 
}); 

Linienfolgen:

var line = { type: 'LineString', 'coordinates': [ [100.0, 0.0], [101.0, 1.0] ] }; 

User.create({username: 'username', geometry: line }).then(function(newUser) { 
... 
}); 

Polygonen:

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) { 
... 
}); 

Einstellen einer benutzerdefinierten 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) { 
... 
}); 
1

Nach ein wenig Nachforschung fand ich, dass Sequelize 3.5.1 (unterstützt GEOMETRY) eine test hat, die eine Point einfügt.

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

Wo location ein GEOMETRIE Feld ist. Auf diese Weise muss ich nicht ST_MakePoint manuell aufrufen, Sequelize kümmert sich darum.