我试图用子查询清理sql查询,但每次都会出现语法错误或无效几何体错误。对于清理,我使用清理sql数组函数。
SQL查询
SELECT ST_Distance('SRID=4326;POINT(0 0)'::geometry, subqry.centroid)
FROM
(SELECT ST_AsText(ST_Centroid('SRID=4326;MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )'))::geography as centroid
) as subqry;
第一种方法
ActiveRecord::Base::sanitize_sql_array(["select ST_Distance('SRID=4326;POINT(? ?)'::geometry, :sub_query", sub_query: "(SELECT ST_Centroid(SRID=4326;'MULTIPOINT ( ? ?, ? ?, ? ?, ? ? )'::geometry) as centroid) as sub_query", min_longitude, min_latitude, min_longitude, min_latitude, min_longitude, max_latitude, max_longitude, min_latitude, max_longitude, max_latitude])
第二种方法
这里我得到“srid=4326;se“<--几何体中位置13处的分析错误
ActiveRecord::Base::sanitize_sql_array(["ST_Distance('SRID=4326;POINT(? ?)'::geometry, 'SRID=4326; SELECT ST_AsText(ST_Centroid(MULTIPOINT ( ? ?, ? ?, ? ?, ? ? ))) as centroid'::geometry)", min_longitude, min_latitude, min_longitude, min_latitude, min_longitude, max_latitude, max_longitude, min_latitude, max_longitude, max_latitude])
postgis中的st_质心&st_距离法示例
st_centroid
SELECT ST_AsText(ST_Centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )'));
st_distance
SELECT ST_Distance(
'SRID=4326;POINT(-72.1235 42.3521)'::geometry,
'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry
);
1条答案
按热度按时间but5z9lq1#
你可以通过一些小技巧和大量arel(这将为你处理卫生问题)构建任何你想要的查询。
警告:这可能看起来不漂亮,但它可以非常灵活,并应产生预期的结果(这只会产生所需的查询,如帖子所示(我不知道所需的语法是否正确,因为我从未使用过postgis)
使用
sql生成: