簡體   English   中英

多邊形與直線之間的交點

[英]Intersection between a polygon and a line in shapely

我試圖找到圓形多邊形和一條線之間的交點,然后合並結果。

我希望所有的交叉點都屬於該線,也屬於它們的並集,但這不是我所看到的。

這里是一個例子:

from shapely.geometry import LineString, Point

line = LineString([(2, 5), (2.1, 1)])  # slightly oblique line

point1 = Point(2.5, 3)

int1 = line.intersection(point1.buffer(1))
int2 = line.intersection(point1.buffer(1.3))

union = int1.union(int2)

print union.length
print int2.length

結果:

4.22183534925

2.43702622444

因為int2包含int1,所以我希望它們的並集恰好是int2。 我希望聯盟也只是一個LineString,而是由4行組成的MultiLineString。

如果我繪制聯合線,我會看到它們如何真正彼此靠近,但不在同一條線上。

我認為這與形狀對象值的分辨率有關。

有什么建議如何將“幾乎平行”的線合並為一條? 或您是否建議其他解決此問題的方法?

據我所知,沒有內置的內置函數可以執行所需的操作。 此外,正如您所注意到的,還有一些您需要解決的舍入錯誤 幸運的是,有一些勻稱的功能可以幫助您實現一個簡短的解決方案:

  1. LineString的project方法,該方法采用一個點,並提供從線的第一個點到該線的最接近點到給定點的距離。
  2. 給定距離的LineString的interpolate方法,它會為您提供LineString中的點,該點與直線的第一個點具有該距離。

我會假設你知道什么是線路上的其他 ,如示例。 如果是這種情況,您可以做的是將短線的點投射到較長的線中,然后考慮到它們與線的第一點的距離對這些點進行排序。

使用以下代碼,

from shapely.geometry import LineString, Point
from shapely.ops import linemerge

def getProyection(aline, point_coords):
    return aline.interpolate(aline.project(Point(point_coords)))

def mergeInside(aline, inside_line):
    mline_tups = [(aline.project(Point(p)), p) for p in aline.coords]
    mline_tups.extend([ (aline.project(Point(p)), getProyection(aline, p))
                                    for p in inside_line.coords])
    mline_tups.sort()
    return LineString([p for _, p in mline_tups])

line = LineString([(2, 5), (2.1, 1)])  # slightly oblique line
point1 = Point(2.5, 3)
int1 = line.intersection(point1.buffer(1))
int2 = line.intersection(point1.buffer(1.3))
merged_line = mergeInside(int2, int1)

print(int1)
print(int2)
print(merged_line)

我得到:

LINESTRING (2.02796158358983 3.881536656406788, 2.072567874421353 2.097285023145893)
LINESTRING (2.019819096605441 4.207236135782384, 2.080725721869193 1.770971125232286)
LINESTRING (2.019819096605441 4.207236135782384, 2.027961583589831 3.881536656406788, 2.072567874421353 2.097285023145893, 2.080725721869193 1.770971125232286)

由於我主要對聯合的長度感興趣,而不是對聯合的確切頂點感興趣,因此我找到了另一種方法來對其進行度量。

from shapely.geometry import LineString, Point

line = LineString([(2, 5), (2.1, 1)])  # slightly oblique line

point1 = Point(2.5, 3)

int1 = line.intersection(point1.buffer(1))
int2 = line.intersection(point1.buffer(1.3))

line_not_intersected = line.difference(point1.buffer(1))
line_not_intersected = line_not_intersected.difference(point1.buffer(1.3))

print line.length - line_not_intersected.length
print int2.length

它給出了預期的結果:

2.43702622444

2.43702622444

如果我得到工會的話,有趣而煩人的同時

union = line.difference(line_not_intersected)

union是一個LineString,但是它的長度與兩行長度的差不同。

print line.length - line_not_intersected.length
print union.length

2.43702622444

4.00124980475

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM