shapely parallel_offset иногда не создает замкнутое кольцо

Я использую функцию parallel_offset пакета shapely, чтобы получить структуры смещения для некоторых полигонов, которые являются замкнутыми кольцами. У меня есть сразу несколько полигонов, многие с похожей формой. Однако около 10-25% из них не создают замкнутого кольца из parallel_offset. Вот MWE формы, которая не работает:

import matplotlib.pyplot as plt
from shapely.geometry.polygon import LinearRing

def plot_line(ax, ob, color):
    x, y = ob.xy
    ax.plot(x, y, color=color, alpha=0.7, linewidth=3, 
            solid_capstyle='round', zorder=2)

polygon = [[-29.675, -30.675],
           [-28.4094, -29.4094],
           [-28.325, -29.325],
           [-28.325, -29.764],
           [-28.325, -29.7933],
           [-28.4587, -29.8274],
           [-28.4676, -29.8297],
           [-28.5956, -29.8814],
           [-28.6041, -29.8848],
           [-28.724, -29.953],
           [-28.732, -29.9576],
           [-28.8417, -30.0413],
           [-28.849, -30.0469],
           [-28.9466, -30.1445],
           [-28.9531, -30.151],
           [-29.0368, -30.2607],
           [-29.0424, -30.268],
           [-29.1106, -30.3879],
           [-29.1152, -30.3959],
           [-29.1669, -30.5239],
           [-29.1703, -30.5324],
           [-29.2044, -30.6661],
           [-29.2067, -30.675],
           [-29.6457, -30.675],
           [-29.675, -30.675]]

poly_line = LinearRing(polygon)
poly_line_offset = poly_line.parallel_offset(0.05, side="left", resolution=16, 
                                             join_style=2, mitre_limit=1)
fig = plt.figure()
ax = fig.add_subplot(111)
plot_line(ax, poly_line, "blue")
plot_line(ax, poly_line_offset, "green")
plt.show()

Исходный многоугольник синего графика, многоугольник смещения зеленого графика

Как видите, зеленый многоугольник смещения не замыкается в точке, которая является первой/последней в списке вершин. Однако другие очень похожие формы работают так, как задумано. У них одинаковая структура данных, а также одна и та же начальная/конечная точка, как в моем примере выше. Атрибут join_style не меняет результат на то, что я хочу. Смена resolution или distance тоже не помогает. документация также не решает эту проблему.

Есть ли у вас какие-либо указания? Я использую shapely 1.6.3.


person Ian    schedule 26.01.2018    source источник


Ответы (1)


не совсем уверен, почему это происходит, тем не менее вы можете использовать обходной путь, основанный на буфере метод:

poly_line = LinearRing(polygon)
poly_line_offset = poly_line.buffer(0.05, 
                       resolution=16, join_style=2, mitre_limit=1).exterior

С вашими данными это дает (вероятно) желаемый результат: введите здесь описание изображения

person ewcz    schedule 26.01.2018
comment
Спасибо за ответ! Однако я обнаружил, что buffer работает не так, как parallel_offset. У меня есть большой набор (частично) вложенных контуров. parallel_offset правильно распознает, что внутри, а что снаружи, а буфер всегда неправильно интерпретирует как минимум один контур. - person Ian; 29.01.2018
comment
Я также только что заметил, что, несмотря на использование стиля соединения mitred, нижний левый угол закруглен. Я предполагаю, что это ошибка? - person Ian; 29.01.2018
comment
И последнее, что я заметил: буфер не принимает direction в качестве входных данных, как это делает parallel_offset. Отрицательные значения для distance также не работают. - person Ian; 29.01.2018
comment
@Ian, кажется, что-то в методе GEOSOffsetCurve, который внутренне вызывает красиво - я пробовал с PostGIS, и ST_OffsetCurve ведет себя так же - person ewcz; 30.01.2018
comment
Куда мне лучше сообщить об этой проблеме? - person Ian; 30.01.2018
comment
@ReblochonMasque Я открыл там тему, посмотрим, что будет дальше. Я буду сообщать о новостях здесь, как редактировать OP. - person Ian; 06.02.2018