Npgsql参数化查询输出与PostGIS不兼容

我在Npgsqlcommand中有这个参数化查询:

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

:longutide:latitudedoubleidint

实际上针对数据库运行的查询如下所示:

 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的帮助,显然需要简化查询才能使用PostGIS。 他建议:

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

我想我可以使用动态查询来创建它,我每次运行时都会手动更新查询,但有没有办法使用Npgsql参数化查询来完成这项工作?

我不是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提供了一个专用function:

 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()而不是ST_GeomFromText() 。 见评论。

就我而言,我用过:

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

谢谢。