优化用于线字符串相交的python代码

优化用于线字符串相交的python代码,python,shapely,multilinestring,Python,Shapely,Multilinestring,我试图找到列表中多个线字符串的交点。你知道我如何优化这个吗?我不确定如何使它运行得更快(提供了一个小示例): 这是一个小例子,但我有更多的数据,有什么办法可以让它更快>P>有可能使用空间索引,使内线环上的内环仅在与包围在外环上的线性串的包围盒相交的包围盒中被简化为环,即仅考虑有交叉机会的LineStrings。 为此,有一个方案: #/usr/bin/env python 导入时间 从shapely.geometry导入线串,点 导入rtree def main(): l1=线串([点(-122

我试图找到列表中多个线字符串的交点。你知道我如何优化这个吗?我不确定如何使它运行得更快(提供了一个小示例):


这是一个小例子,但我有更多的数据,有什么办法可以让它更快

>P>有可能使用空间索引,使内线环上的内环仅在与包围在外环上的线性串的包围盒相交的包围盒中被简化为环,即仅考虑有交叉机会的LineStrings。 为此,有一个方案:

#/usr/bin/env python
导入时间
从shapely.geometry导入线串,点
导入rtree
def main():
l1=线串([点(-122.238615,37.783766999999),点(-122.237455,37.7822079999999)])
l2=线串([点(-122.236899,37.779801999999),点(-122.232146,37.77611)])
l3=线串([点(-122.232452,37.775956),点(-122.236212,37.775573)])
l4=线串([点(-122.234843,37.7733619999999),点(-122.231641,37.77664699999)])
l5=线串([点(-121.908187,37.6775409999999),点(-121.908409,37.678108999999)])
linestrings=[l1、l2、l3、l4、l5]
_time=time.time()
L=[x.交点(y)表示idx1,x表示idx2的枚举(线字符串),y表示idx1=i1的枚举(线字符串):继续
ω=l1.交点(线串[i2])
如果ω为空:继续
K.附加(ω)
打印(“TIME:,TIME.TIME()-时间)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

这些行是重复的(如上面的示例)还是不同的?我认为如果所有的段对相交,就没什么可做的了。不,它们是不同的。因为代码当前在时间O(n^2)内执行而且,可能有多达n^2个交点,代码在渐近时间复杂度方面是最优的。我只能说,解决方案会根据情况而有所不同。我理解。感谢您的回答!不会
[x.intersection(y)for x,y in itertools.compositions(linestrings,2)]
更快,而不是在列表压缩中使用两个迭代器,这两个迭代器同时计算,
a.intersection(b)
b.intersection(a)
甚至
a.intersection(a)
from shapely.geometry import LineString
l1 = LineString([Point(-122.238615,37.78376699999999), Point(-122.237455,37.78220799999999)])
l2 = LineString([Point(-122.236899, 37.77980199999999), Point(-122.232146, 37.77611)])
l3 = LineString([Point(-122.232452, 37.775956), Point(-122.236212, 37.775573)])
l4 = LineString([Point(-122.234843, 37.77336199999999), Point(-122.231641, 37.77664699999999)])
l5 = LineString([Point(-121.908187, 37.67754099999999),Point(-121.908409, 37.67810899999999)])

linestrings = [l1,l2,l3,l4,l5,l1,l2,l3,l4,l5,l1,l2,l3,l4,l5,l1,l2,l3,l4,l5,l1,l2,l3,l4,l5,l1,l2,l3,l4,l5]

import time
the_time = time.time()
[ x.intersection(y) for idx1,x in enumerate(linestrings) for idx2,y in enumerate(linestrings) if idx1<idx2 and x.intersects(y)]
print("TIME:",time.time()-the_time)
TIME: 0.026987314224243164
#!/usr/bin/env python
import time

from shapely.geometry import LineString, Point
import rtree

def main():
    l1 = LineString([Point(-122.238615,37.78376699999999), Point(-122.237455,37.78220799999999)])
    l2 = LineString([Point(-122.236899, 37.77980199999999), Point(-122.232146, 37.77611)])
    l3 = LineString([Point(-122.232452, 37.775956), Point(-122.236212, 37.775573)])
    l4 = LineString([Point(-122.234843, 37.77336199999999), Point(-122.231641, 37.77664699999999)])
    l5 = LineString([Point(-121.908187, 37.67754099999999),Point(-121.908409, 37.67810899999999)])

    linestrings = [l1,l2,l3,l4,l5]

    the_time = time.time()
    L = [ x.intersection(y) for idx1,x in enumerate(linestrings) for idx2,y in enumerate(linestrings) if idx1<idx2 and x.intersects(y) ]
    print("TIME: ", time.time() - the_time)

    the_time = time.time()
    index = rtree.index.Index()
    for idx, l in enumerate(linestrings):
        index.insert(idx, l.bounds)

    K = []
    for i1, l1 in enumerate(linestrings):
        for i2 in index.intersection(l1.bounds):
            if i2 >= i1: continue

            omega = l1.intersection(linestrings[i2])
            if omega.is_empty: continue

            K.append(omega)

    print("TIME: ", time.time() - the_time)

if __name__ == '__main__':
    main()