Использование shapely для возврата координат многослойных строк, которые пересекаются - PullRequest
0 голосов
/ 22 ноября 2018

Я сгенерировал случайные улицы, используя функцию ShaStly LineString, используя следующий код:

class StreetNetwork():

def __init__(self):
    self.street_coords = []
    self.coords = {}

def gen_street_coords(self, length, coordRange):
    min_, max_ = coordRange
    for i in range(length): 
        street = LineString(((randint(min_, max_), randint(min_, max_)),
                  (randint(min_, max_), randint(min_,max_))))
        self.street_coords.append(street)

Если я использую:

street_network = StreetNetwork() street_network.gen_street_coords(10, [-50, 50])

Я получаю изображениевот так: Простой

Я смотрел на следующий вопрос , который кажется похожим.Теперь я хочу перебрать мой список street_coords и разделить улицы на 2, если они пересекаются с другой улицей, но мне трудно найти координаты точки пересечения.Однако, поскольку я незнаком с использованием Shapely, я изо всех сил пытаюсь использовать функцию «пересечения».

1 Ответ

0 голосов
/ 29 ноября 2018

Достаточно просто проверить пересечение двух объектов LineString.Чтобы избежать получения пустых геометрий, я предлагаю сначала проверить на пересечение, прежде чем вычислять его.Примерно так:

from shapely.geometry import LineString, Point

def get_intersections(lines):
    point_intersections = []
    line_intersections = [] #if the lines are equal the intersections is the complete line!
    lines_len = len(lines)
    for i in range(lines_len):
        for j in range(i+1, lines_len): #to avoid computing twice the same intersection we do some index handling
            l1, l2 = lines[i], lines[j]
            if l1.intersects(l2):
                intersection = l1.intersection(l2)
                if isinstance(intersection, LineString):
                    line_intersections.append(intersection)
                elif isinstance(intersection, Point)
                    point_intersections.append(intersection)
                else:
                    raise Exception('What happened?')

    return point_intersections, line_intersections

С примером:

l1 = LineString([(0,0), (1,1)])
l2 = LineString([(0,1), (1,0)])
l3 = LineString([(5,5), (6,6)])
l4 = LineString([(5,5), (6,6)])
my_lines = [l1, l2, l3, l4]
print get_intersections(my_lines)

Я получил:

[<shapely.geometry.point.Point object at 0x7f24f00a4710>,      
    <shapely.geometry.linestring.LineString object at 0x7f24f00a4750>]
...