Разделите линейную линию в каждой точке, где она пересекает многоугольник - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть линейная строка, которая охватывает различные полигоны, хранящиеся в виде GeoJsons.Я хочу разбить линию на отдельные части в каждой области многоугольника.Однако я пока не смог этого добиться.Это воспроизводимый пример того, что у меня пока есть:

from shapely.geometry import Point, LineString, Polygon
from shapely.ops import split
from matplotlib import pyplot as plt

poly = {
    'type': "Feature",
    'geometry': {
        "type": "Polygon",
        "coordinates": ([(2,2),(2,4),(4,4),(4,2)]),
    },
    'properties': {
        'id': 'A'
    }
}

line = {
    'type': "Feature",
    'geometry': {
        "type": "Linestring",
        "coordinates": ([(3,3),(5,1)]),
    },
    'properties': {
        'id': 'A'
    }
}

poly = Polygon(poly['geometry']['coordinates'])
line = LineString(line['geometry']['coordinates'])

x,y = poly.exterior.xy
x2,y2 = line.coords

plt.plot(x, y, x2, y2)
plt.show()

Этот код создает следующий квадратный многоугольник с пересекающейся линией строк: enter image description here

IЗатем я попытался разбить линию через многоугольник, как показано ниже:

new_lines = split(line, poly)

Но я получаю следующий вывод, который кажется неправильным:

GEOMETRYCOLLECTION (LINESTRING (3 3, 4 2), LINESTRING (4 2, 5 1))

Я ожидал трилинии, одна существует внутри квадратного многоугольника, а затем две существующие отдельно вне многоугольника.

1 Ответ

0 голосов
/ 04 февраля 2019

Похоже, что расщепление работает, как вы ожидаете, но координаты линии отображаются в заблуждении - следует использовать .xy, чтобы получить линию xs и ys, как с многоугольником:

from shapely.geometry import Point, LineString, Polygon
from shapely.ops import split
from matplotlib import pyplot as plt

poly = Polygon([(2,2),(2,4),(4,4),(4,2)])
original_line = LineString([(3,3),(5,1)])
line = LineString([(3,1), (3,5)])
x, y = poly.exterior.xy
x2, y2 = line.xy
x3, y3 = original_line.xy

plt.plot(x, y, x2, y2)
plt.show()

plt.plot(x, y, x3, y3)
plt.show()

изображение с исходными координатами

изображение с ожидаемыми координатами

>>> print(split(poly, line))
GEOMETRYCOLLECTION (LINESTRING (3 1, 3 2), LINESTRING (3 2, 3 4), LINESTRING (3 4, 3 5))
...