首页 > 其他分享 >在不完全重合的情况下,判断线经过另一线段的方法

在不完全重合的情况下,判断线经过另一线段的方法

时间:2023-08-11 14:33:46浏览次数:40  
标签:判断 angle 重合 else seg line pi 一线 road

import logging

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s:%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')
import numpy as np
from shapely.geometry import LineString, Point
from shapely.ops import substring


def pnt2polar(p):
    # 平面点转极坐标
    x, y = p
    pi = np.pi
    alpha = np.arctan(abs(y / x)) if x != 0. else 0.
    if x > 0:
        if y > 0:
            angle = alpha
        elif y == 0:
            angle = 0
        else:
            angle = pi * 2 - alpha
    elif x == 0:
        if y > 0:
            angle = pi / 2
        elif y == 0:
            angle = 0
        else:
            angle = 3 * pi / 2
    else:
        if y > 0:
            angle = pi - alpha
        elif y == 0:
            angle = pi
        else:
            angle = pi + alpha

    return round(angle, 3)


def vline(line):
    # line shapely.geometry.LineString

    if line.length < 1e-6:
        res = None  # todo 处理空线的情况
    else:
        x0, y0 = line.coords[0]
        x1, y1 = line.coords[-1]
        vec = [x1-x0, y1-y0]
        res = pnt2polar(vec)
    return res


def lineXroad(line=None, road=None, near=30, N=11):
    # 在不完全重合的情况下 判断一段线是否是另一条线的一部分
    # line / road LineString
    # near 缓冲区半径 default 30m
    # N 参考点的数量

    seg_pnts = [substring(road, _, _, normalized=1) for _ in np.linspace(0, 1, N)]  # 取点

    seg_line = [_.buffer(near).intersection(road) for _ in seg_pnts]  # 截局部
    seg_line = [_ if _.geom_type=='LineString' else _.geoms[0] for _ in seg_line]  # 截出多线取第一部分

    iline = [_.buffer(near).intersection(line) for _ in seg_pnts]  # 截取线路
    iline = [_ if _.geom_type=='LineString' else _.geoms[0] for _ in iline]

    rvec = [vline(_) for _ in seg_line]  # road方向 逐段的
    lvec = [vline(_) for _ in iline]  # line方向
    logging.warning(rvec)
    logging.warning(lvec)

    flag = [abs(m-n) if n is not None else -1 for m, n in zip(rvec, lvec)]
    res = sum([_ < 0.262 or _ > 6.02 if _ >= 0 else 0 for _ in flag])
    return res > N//2+1


if __name__ == "__main__":

    line = [(0, 0), (3, 0), (3, 3), (6, 3), (6, 0), (9, 0)]

    road1 = [(-1, -0.1), (2, -0.1)]  # True 超过一半重合
    road2 = [(2.95, 0), (2.95, 3)]  # True  完全重合
    road3 = [(6, 3.05), (3, 3.05)]  # False  方向相反
    road4 = [(6, -0.1), (9, -0.1), (15, 0)]  # false  少部分重合

    roads = [LineString(_) for _ in [road1, road2, road3, road4]]
    line = LineString(line)
    for road in roads:
        res = lineXroad(line=line, road=road, near=0.3)
        logging.warning(res)

 

标签:判断,angle,重合,else,seg,line,pi,一线,road
From: https://www.cnblogs.com/ddzhen/p/17622891.html

相关文章

  • 判断软连接,及通过软连接找源文件
    1.判断的方式可以有多种最简单的readlink-f目录/文件||echo'不是链接文件' 常用的是findfind/目录-typel如果要直接判断指定文件,后面抓取一下文件名即可find/目录-typel|grep文件名但是如果目录下文件大,且目录下还有目录,使用find就会变得十分耗费资源......
  • 2023.8.10 周四:判断输入的数是否为正整数
    1intis_integer(charptr[])2{3intlen=strlen(ptr);4intret=0;5inti=0;6for(i=0;i<len;i++)7{8if(ptr[i]>='0'&&ptr[i]<='9')9......
  • 判断是不是子字符串
    1.题目链接:https://www.nowcoder.com/questionTerminal/5382ff24fbf34a858b15f93e2bd85307给定两个字符串s和t,判断s是否为t的子序列。你可以认为s和t中仅包含英文小写字母。字符串t可能会很长(长度n~=500,000),而s是个短字符串(长度<=100)。字符串的一个子序列是......
  • HJ39 判断两个IP是否属于同一子网
    题目描述IP地址是由4个0-255之间的整数构成的,用"."符号相连。二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。子网掩码与IP地址结构相同,是32位二进制......
  • 判断较大值
    1、声明函数,使用if条件句判断较大值#include<stdio.h>intMax(intx,inty){ if(x>y){ returnx; }else{ returny; }}intmain(){ inta=10; intb=20; intmax=Max(a,b); printf("max=%d\n",max1); return0;}2、使用宏的方式判断较大值#include&l......
  • Linux:如何在脚本中判断某个指令是否存在
    学习自:检查linux命令是否存在的正确方式指令:which用法:which命令结果:一个字符串存在:输出命令对应的可执行文件地址不存在:输出信息/usr/bin/which:nowgetin(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin),但是如果用字符串变量去承接时,会发现字符串......
  • 怎么判断linux中的内核进程与用户进程
    在ubuntu或者centos中,1号init进程或者systemd为用户进程,它的子进程也为用户进程;2号kthreadd进程为内核进程,其子进程也为内核进程。所以,判断是否为内核进程是看它跟2号进程的关系。此外,0号进程idle也是内核进程。init进程init进程是所有其他进程的祖先进程,是系统启动时第一个被......
  • 遇到的问题--python---代码格式层级错误导致if判断无效
    情况我们在运行python脚本时没有报错,但是发现if判断没有生效,python的格式很严格,也很深坑。原因if的层级超过了变量赋值语句的层级,所以判断无效。我们看看我们的代码如下:python对代码的格式要求很严格,第一行需要顶格写,然后根据冒号:后续的代码行需要有缩进,并且有层级。同样的......
  • 1.创建一个类,类A中定义了一个方法,该方法能接受3个参数根据参数判断是做加法还是减法并
    classA:defcal(self,x,y,z):ifz=='+':returnx+yifz=='-':returnx-yelse:print('error')a=A()b=a.cal(3,4,'+')print(b)运行结果: 2.延伸:创建一个类,类B......
  • 【动态规划】【力扣357次周赛】6953. 判断是否能拆分数组
    【力扣357次周赛】6953.判断是否能拆分数组给你一个长度为n的数组nums和一个整数m。请你判断能否执行一系列操作,将数组拆分成n个非空数组。在每一步操作中,你可以选择一个长度至少为2的现有数组(之前步骤的结果)并将其拆分成2个子数组,而得到的每个子数组,至少需......