我在Npgsqlcommand中有这个参数化查询:
UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(:longitude :latitude)', 4326),3081)
WHERE id=:id
:longutide
和:latitude
double ,id
int 。
实际针对数据库运行的查询如下所示:
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参数化查询来实现这一点?
答案 0 :(得分: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)
哪个应该有用。
如果您在组装字符串时遇到问题(就像您的评论所示),那么有一种更优雅的方式。根据{{3}} - PostGIS为此目的提供专用功能:
ST_MakePoint(double precision x, double precision y)
hint from @Paul on my previous answer。有了这个,我们终于到达:
UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_SetSRID(
ST_MakePoint(:longitude, :latitude), 4326), 3081)
WHERE id = :id
请注意逗号。它现在终于有效了吗? 如果没有,只需用大锤击败它。 GRML。
确实如此 - 现在使用Details in the manual代替ST_GeomFromText()
。见评论。
答案 1 :(得分: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);
感谢。