4

Npgsqlコマンドにこのパラメーター化されたクエリがあります。

UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(:longitude :latitude)', 4326),3081)
WHERE id=:id

:longutide:latitudedoubleであり、idintです

DBに対して実際に実行されるクエリは次のようになります。

UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(((E'-96.6864379495382')::float8) ((E'32.792527154088')::float8))', 4326),3081)
WHERE id=((10793455)::int4)

ここでErwinBrandstetterの助けを借りて、PostGISで動作するようにクエリを単純化する必要があることは明らかです。彼はこれを提案しました:

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(
                  $$POINT(:longitude :latitude)$$::geometry, 4326), 3081)
WHERE  id = :id

動的クエリでこれを作成できると思います。実行するたびに手動でクエリを更新しますが、Npgsqlパラメーター化クエリでこれを機能させる方法はありますか?

4

2 に答える 2

4

私は の専門家ではありませんnpgsqlが、パラメータ化されたクエリは次のように機能すると思います。

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(:mygeom, 4326), 3081)
WHERE  id = :id

そしてmygeom、この文字列を保持します:

POINT(96.6864379495382 32.792527154088)

.. 他の変数から事前に組み立てられます。次のようなクエリになります。

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(
             (E'POINT(96.6864379495382 32.792527154088)')::text, 4326),3081)
WHERE  id=((10793455)::int4)

どちらが機能するはずです。


文字列の組み立てに問題がある場合 (コメントが示すように)、よりエレガントな方法があります。私の以前の回答に関する@Paulからのヒントによると、 PostGISは目的のために専用の機能を提供します:

ST_MakePoint(double precision x, double precision y)

詳細はマニュアルをご覧ください。これで、最終的には次のようになります。

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_SetSRID(
               ST_MakePoint(:longitude, :latitude), 4326), 3081)
WHERE  id = :id

コンマに注意してください。それは今ようやく機能しますか?
そうでない場合は、ハンマーで叩いてください。ぐるぐる。

ST_SetSRID()の代わりに- を使用しST_GeomFromText()ます。コメントを参照してください。

于 2012-09-14T18:45:24.377 に答える
2

私の場合、私は使用しました:

NpgsqlCommand command = new NpgsqlCommand(
                "select ST_Distance( ST_SetSRID(" +
                    "ST_MakePoint(@longitude, @latitude), 4326)," +
                    "(select geom from segments where segment_id= @id )," +
                    "true)",
                    m_DBConnection);

そして、それはうまくいきました。また、試してみてください:

 NpgsqlCommand command = new NpgsqlCommand(
                "select ST_AsText( ST_ClosestPoint( ST_GeomFromText('POINT(" +
                    longitude.ToString(CultureInfo.GetCultureInfo("en-US").NumberFormat) + " " +
                    latitude.ToString(CultureInfo.GetCultureInfo("en-US").NumberFormat) + ")', 4326)," +
                        "(select geom from segments where segment_id= @id )))",
                        m_DBConnection);

ありがとう。

于 2013-01-04T12:17:55.000 に答える