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)

感谢 Erwin Brandstetter here的帮助,很明显需要简化查询以使用 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

注意逗号。它现在终于可以工作了吗?
如果没有,那就用大锤敲打它。GRML。

它确实 - 使用ST_SetSRID()now 而不是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 回答