[Python] Divide a LINESTRING with a list of LINESTRING

Discussão em 'Python' iniciado por Stack, Fevereiro 17, 2025.

  1. Stack

    Stack Membro Participativo

    I'm searching a solution to divide Main Line with more than one overlapped lines. In this example I've four lines (I've applied an offset on Line 1, Line 2 and Line 3 in this chart to facilitate reading): [​IMG]

    Below the lines:

    from shapely import wkt

    main_line = wkt.loads('LINESTRING (461179.6655721677 4507148.788223281, 461217.56786209624 4507181.537033379, 461236.3280996226 4507194.537878151, 461241.7247760045 4507197.640095252, 461258.8379542616 4507210.660701941, 461261.9432857035 4507219.791508417, 461270.90091201715 4507254.590010401, 461271.56385885156 4507303.918307676, 461273.67536588735 4507318.460376316, 461286.2322009634 4507358.346460313, 461302.55653224624 4507403.197152592, 461365.2492823085 4507485.060388609, 461480.4983426857 4507548.512415529, 461580.7367309019 4507618.493483591)')

    line_1 = wkt.loads('LINESTRING (461179.6655721677 4507148.788223281, 461217.56786209624 4507181.537033379, 461236.3280996226 4507194.537878151, 461241.7247760045 4507197.640095252, 461258.8379542616 4507210.660701941, 461261.9432857035 4507219.791508417, 461270.90091201715 4507254.590010401, 461271.56385885156 4507303.918307676, 461273.67536588735 4507318.460376316, 461286.2322009634 4507358.346460313, 461302.55653224624 4507403.197152592)')
    line_2 = wkt.loads('LINESTRING (461179.6655721677 4507148.788223281, 461217.56786209624 4507181.537033379, 461236.3280996226 4507194.537878151, 461241.7247760045 4507197.640095252, 461258.8379542616 4507210.660701941, 461261.9432857035 4507219.791508417, 461270.90091201715 4507254.590010401, 461271.56385885156 4507303.918307676, 461273.67536588735 4507318.460376316, 461286.2322009634 4507358.346460313, 461302.55653224624 4507403.197152592, 461365.2492823085 4507485.060388609)')
    line_3 = wkt.loads('LINESTRING (461179.6655721677 4507148.788223281, 461217.56786209624 4507181.537033379, 461236.3280996226 4507194.537878151, 461241.7247760045 4507197.640095252, 461258.8379542616 4507210.660701941, 461261.9432857035 4507219.791508417, 461270.90091201715 4507254.590010401, 461271.56385885156 4507303.918307676, 461273.67536588735 4507318.460376316, 461286.2322009634 4507358.346460313, 461302.55653224624 4507403.197152592, 461365.2492823085 4507485.060388609, 461480.4983426857 4507548.512415529)')


    I don't know how many lines I've, in staging I will have a list. Looking the image above Main Line will be divided into 4 parts, but I'm little bit confused on how I can do this. I've used the code below hoping into a brilliant idea but without fortune.

    line_list = [line_1, line_2, line_3]
    diff_list = []
    first_line_length = line_list[0].length

    for line in line_list:
    line_length = line.length

    if line_length != first_line_length:
    diff = main_line.symmetric_difference(line)
    diff_list.append(diff)

    fig, ax = plt.subplots(figsize=(10, 10))
    ax.set_xlabel('X coordinate', fontsize=15)
    ax.set_ylabel('Y coordinate', fontsize=15)

    plt.plot(*main_line.xy, label='Main Line', color='blue')

    plt.plot(*line_1.parallel_offset(distance=5).xy, label='Line 1', color='green')
    plt.plot(*line_2.parallel_offset(distance=10).xy, label='Line 2', color='red')
    plt.plot(*line_3.parallel_offset(distance=15).xy, label='Line 3', color='violet')

    plt.plot(*diff_list[0].parallel_offset(distance=-5).xy, label='Diff Line 1', color='green')
    plt.plot(*diff_list[1].parallel_offset(distance=-10).xy, label='Diff Line 2', color='red')

    plt.legend()

    plt.show()


    [​IMG]

    In brief, if I have n lines shortest than a main line, I would like to divide that main line in n+1 parts.

    Continue reading...

Compartilhe esta Página