如何使用起点、长度和角度在 Shapely 中创建一条线

问题描述

我找到了这段代码,但它需要第一个点和第二个点来创建一条线。如何更改它,使其仅适用于第一个点、线的长度和角度?

from shapely.geometry import Linestring
from shapely.geometry import Point

p = Point(5,5)
c = p.buffer(3).boundary
l = Linestring([(0,0),(10,10)])
i = c.intersection(l)

print i.geoms[0].coords[0]
(2.8786796564403576,2.8786796564403576)

print i.geoms[1].coords[0]
(7.121320343559642,7.121320343559642)

解决方法

您有多种选择:

  1. 使用基本三角函数计算第二个点的坐标:
    import math
    from shapely.geometry import LineString,Point
    
    start = Point(0,0)
    length = 1
    angle = math.pi / 3
    
    end = Point(start.x + length * math.cos(angle),start.y + length * math.sin(angle))
    line = LineString([start,end])
    print(line)
    # LINESTRING (0 0,0.5000000000000001 0.8660254037844386)
    
    如果你的角度不是弧度而是度数,你应该先转换它:
    angle = 60
    angle = math.radians(angle)
    
  1. 用给定的起点和长度制作一条水平线,然后围绕第一个点以给定的角度rotate

    from shapely.affinity import rotate
    from shapely.geometry import LineString,0)
    length = 1
    angle = math.pi / 3
    
    end = Point(start.x + length,start.y)
    line = LineString([start,end])
    line = rotate(line,angle,origin=start,use_radians=True)
    print(line)
    # LINESTRING (0 0,0.5000000000000001 0.8660254037844386)
    

    请注意,默认情况下 rotate 函数需要以度为单位的角度,因此如果我们想将一个以弧度为单位的角度传递给它,我们必须使用如上所示的 use_radians=True

    或者,我们也可以使用 translate 函数来获取端点:

    from shapely.affinity import translate
    end = translate(start,length)