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

5

我找到了这段代码,但它需要第一个点和第二个点才能创建一条线。如何更改代码,使其只需第一个点、线的长度和角度即可工作?

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)

Shapely不支持无限线。如果您想构建有限长度的LineString,仅有一个点和一个角度是不够的。我们还需要关于LineString长度或第二个点的x或y坐标的信息。 - Georgy
用角度 Fi 和距离 L 计算第二个点的坐标:x2 = x1 + L * cos(Fi) y2 = y1 + L * sin(Fi) - MBo
@Georgy,我也有长度,你能告诉我怎么做吗? - user15636383
1个回答

8

您有几个选项:

  1. Calculate the coordinates of the second point using basic trigonometry:
    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)
    
    If your angle is not in radians but in degrees, you should convert it first:
    angle = 60
    angle = math.radians(angle)
    
  1. Make a horizontal line with the given start point and length, and then rotate it by given angle around the first point:

    from shapely.affinity import rotate
    from shapely.geometry import LineString, Point
    
    start = Point(0, 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)
    

    Note that by default rotate function expects angles in degrees, so if we want to pass an angle in radians to it, we have to use the use_radians=True as shown above.

    Alternatively, we could also use translate function to get the endpoint:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接