python postgis ST_ClosestPoint
我正在努力使用python脚本发出的SQL命令。这是我到目前为止尝试过的,第一个例子很好,但其余的不行python postgis ST_ClosestPoint,python,postgis,Python,Postgis,我正在努力使用python脚本发出的SQL命令。这是我到目前为止尝试过的,第一个例子很好,但其余的不行 #working SQL = "SELECT ST_Distance(ST_Transform(ST_GeomFromText(%s, 4326),27700),ST_Transform(ST_GeomFromText(%s, 4326),27700));" #newPointSQL = "SELECT ST_ClosestPoint(ST_GeomFromText(%s),ST_GeomFr
#working SQL = "SELECT ST_Distance(ST_Transform(ST_GeomFromText(%s, 4326),27700),ST_Transform(ST_GeomFromText(%s, 4326),27700));"
#newPointSQL = "SELECT ST_ClosestPoint(ST_GeomFromText(%s),ST_GeomFromText(%s));"
#newPointSQL = "SELECT ST_As_Text(ST_ClosestPoint(ST_GeomFromText(%s), ST_GeomFromText(%s)));"
#newPointSQL = "SELECT ST_AsText(ST_ClosestPoint(ST_GeomFromEWKT(%s), ST_GeomFromText(%s)));"
#newPointSQL = "SELECT ST_AsText(ST_Line_Interpolate_Point(ST_GeomFromText(%s),ST_Line_Locate_Point(ST_GeomFromText(%s),ST_GeomFromText(%s))));"
newPointData = (correctionPathLine,pointToCorrect) - ( MULTILINESTRING((-3.16427109855617 55.9273798550064,-3.16462372283029 55.9273883602162)), POINT(-3.164667 55.92739))
我的数据拾取正常,因为第一个sql在执行时成功。问题是当我使用ST_ClosestPoint函数时。
有人能在任何地方注意到误用吗?我是否以错误的方式使用ST_ClosetsPoint?
在上一个示例中,我确实修改了数据(以防有人注意到)来运行它,但它仍然不会执行 我不知道你在处理什么样的几何图形,但我以前也遇到过多行线的问题,我意识到当一条多行线不能合并时,函数ST_Line\u Locate\u Point就不起作用了。(你可以通过函数知道多行线是否不能合并)我在一个旧邮件列表中创建了一个pl/pgSQL函数,但我添加了一些性能调整,它只适用于多行字符串和线字符串(但可以轻松修改以使用多边形)。首先,它检查几何体是否只有一个尺寸,如果有,可以使用旧的ST_Line_Interpolate_Point和ST_Line_Locate_Point组合,如果没有,则必须对多重线串中的每个线串执行相同的操作。此外,我还添加了一个ST_LineMerge以实现1.5版本之前的兼容性:
CREATE OR REPLACE FUNCTION ST_MultiLine_Nearest_Point(amultiline geometry,apoint geometry)
RETURNS geometry AS
$BODY$
DECLARE
mindistance float8;
adistance float8;
nearestlinestring geometry;
nearestpoint geometry;
simplifiedline geometry;
line geometry;
BEGIN
simplifiedline:=ST_LineMerge(amultiline);
IF ST_NumGeometries(simplifiedline) <= 1 THEN
nearestpoint:=ST_Line_Interpolate_Point(simplifiedline, ST_Line_Locate_Point(simplifiedline,apoint) );
RETURN nearestpoint;
END IF;
-- *Change your mindistance according to your projection, it should be stupidly big*
mindistance := 100000;
FOR line IN SELECT (ST_Dump(simplifiedline)).geom as geom LOOP
adistance:=ST_Distance(apoint,line);
IF adistance < mindistance THEN
mindistance:=adistance;
nearestlinestring:=line;
END IF;
END LOOP;
RETURN ST_Line_Interpolate_Point(nearestlinestring,ST_Line_Locate_Point(nearestlinestring,apoint));
END;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
创建或替换函数ST_多行_最近点(A多行几何体、A点几何体)
将几何图形返回为
$BODY$
声明
心距浮动8;
adio8;
最接近直线的弦几何;
最近点几何;
简化线几何;
线几何;
开始
simplifiedline:=ST_LineMerge(多行);
如果ST_NumGeometries(simplifiedline)您好,谢谢您的回答,我会尽快尝试并让您知道结果。谢谢你抽出时间!不幸的是,我只能说谢谢你的帮助!!!它工作得很好!如果有任何其他方式,我可以表达我的感激,请让我知道!别担心,我早就做过这个函数了。您可以将答案标记为正确答案;)@pacofvf在多地理区域或集合上使用ST_ClosestPoint应该没有问题。如果你发现任何可疑的东西,请向PostGIS邮件列表报告,或者提交一个bug。我在我的博客中发布了一个例子作为对你评论的回应,我不明白你的问题是什么。您收到了什么错误消息?当我测试您的查询时,它们会毫无问题地运行。ST_ClosestPoint对于多重几何图形、集合或嵌套集合应该没有问题。