web-dev-qa-db-ja.com

postgresデータベースにPOINTを挿入します

Postgresデータベースにポイント列タイプを挿入/更新する必要があります。

_node-postgres_を使用しています

POSTGRES管理パネルを使用して生成されたスクリプトは、更新クエリを次のように表示します。

_UPDATE public.places SET id=?, user_id=?, business_name=?, alternate_name=?, primary_category=?, categories=?, description=?, address=?, city=?, state=?, country=?, Zip=?, point WHERE <condition>;_

緯度と経度からポイントを取得するにはどうすればよいですか?

POSTGISを使用していくつかの回答を見ましたが、それを機能させることができませんでした。

POSTGRESのドキュメント( https://www.postgresql.org/docs/9.2/static/xfunc-sql.html )には、point '(2,1)'を使用できると記載されていますが、これはpgクエリでは機能しません。

私が今持っているもの:

_var config = {
  user: 'postgres',
  database: 'PGDATABASE',
  password: 'PGPASSWORD!',
  Host: 'localhost',
  port: 5432,
  max: 10,
  idleTimeoutMillis: 30000
};
_

そして更新部分:

_app.post('/updatePlaces', function(req, res, next) {
    console.log("Update");
    console.log(req.body.places);
    pool.query('UPDATE places SET address = $1, alternate_name = $2, business_name = $3, categories = $4, city = $5, country = $6, description = $7, point = $8, primary_category = $9, state = $10, Zip = $11', [req.body.places.address, req.body.places.alternate_name, req.body.places.business_name, req.body.places.categories, req.body.places.city, req.body.places.country, req.body.places.description, (req.body.places.point.x, req.body.places.point.y), req.body.places.primary_category, req.body.places.state, req.body.places.Zip], function(err, result) {
      if(err) {
          console.log(err);
          return err;
      }

      res.send(result.rows[0]);
    });
});
_

ポイントを通過するための多くの異なる方法を試しました:

  1. (req.body.places.point.x、req.body.places.point.y)
  2. point(req.body.places.point.x、req.body.places.point.y)
  3. ポイント '(2,1)'

上記のすべてがエラーをスローします。 POSTGISを使用する必要がありますか?

5
Deepak Bandi

いくつかの組み合わせの後、これがうまくいくことがわかりました。

_( '(' + req.body.places.point.x + ',' + req.body.places.point.y +')' )_

誰かが_node-postgres_を使用してこれを行おうとしている場合は、回答として投稿してください。

したがって、一重引用符で囲まれたポイントを使用できます:insert into x values ( '(1,2)' );

ただし、クエリでinsert into x values (point(1,2));を使用しても機能しません。

8
Deepak Bandi

これは、SQLを「直接」記述した場合に機能します。

CREATE TEMP TABLE x(p point) ;
INSERT INTO x VALUES ('(1,2)');
INSERT INTO x VALUES (point(3, 4));
SELECT * FROM x ;

結果

(1,2)
(3,4)
8
joanolo

pg-promise を使用している場合は、カスタムタイプを自動的にフォーマットできます。 カスタムタイプのフォーマット を参照してください。

次のように独自のタイプを導入できます。

function Point(x, y) {
    this.x = x;
    this.y = y;

    // Custom Type Formatting:
    this._rawDBType = true; // to make the type return the string without escaping it;

    this.formatDBType = function () {
        return 'ST_MakePoint(' + this.x + ',' + this.y + ')';
    };
}

ある時点で、オブジェクトを作成します。

var p = new Point(11, 22);

そして、通常の型などの変数を使用できます。

db.query('INSERT INTO places(place) VALUES(ST_SetSRID($1, 4326))', [p]);

参照: ジオメトリコンストラクタ

1
vitaly-t

最近、地理(ポイント)列を含むpostgisデータベースに挿入するときに、node-postgresを使用して同様の問題に遭遇しました。私の解決策は以下を使用することでした:

pool.query("INSERT INTO table (name, geography) VALUES ($1, ST_SetSRID(ST_POINT($2, $3), 4326))",
      [req.body.name, req.body.lat, req.body.lng ]);
0
Chris