Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python postgis ST_ClosestPoint_Python_Postgis - Fatal编程技术网

python postgis ST_ClosestPoint

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

我正在努力使用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_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对于多重几何图形、集合或嵌套集合应该没有问题。