Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

SQL/POSTGIS 使用函数实现ST_Intersects


create or replace function ST_LineIntersects(x1 float, y1 float, x2 float, y2 float, x3 float, y3 float, x4 float, y4 float) 
    returns boolean
as $$
declare a1 float;
        a2 float;
        b1 float;
        b2 float;
        c1 float;
        c2 float;
begin
    a1 = y2 - y1;
    b1 = x1 - x2;
    c1 = a1*x1 + b1*y1;
    a2 = y4 - y3;
    b2 = x3 - x4;
    c2 = a2*x3 + b2*y3;
    if (a1*x3 + b1*y3) = c1 and (a1*x4 + b1*y4) = c1 then
    begin
        if (min(x1,x2)<=min(x3,x4) and min(x3,x4)<=max(x1,x2)) or (min(x1,x2)>=min(x3,x4) and max(x3,x4)>=min(x1,x2)) then 
            return true;
        else 
            return false;
        end if;
    end;
    elsif ((a1*x3+b1*y3-c1)*(a1*x4+b1*y4-c1)<=0) and ((a2*x1+b2*y1-c2)*(a2*x2+b2*y2-c2)<=0) then
    return true;
    end if;
    return false;
end;
$$ language plpgsql;

算法思路,相交线段必然是一条线段的两点分在另一条线段的两侧,则另L1的两端点在L2的两侧,L2的两端点在L1的两侧,则相交成立。

转载自:https://blog.csdn.net/qq_33646587/article/details/51347841