Намиране на точки на каскадно обединение на полигони в python

Опитвам се да намеря близко разположените точки и да премахна дублирани точки за някои данни за форма (координати) в Python. Назовавам координатните възли като 1,2,3.. и така нататък и използвам пакета shapely и създавам полигони около възловите точки 1,2,3.. като казвам

полигони = [Точка ([възли [i]).буфер (1) за i в диапазон (len (възли))]

и да намеря каскадните, които използвам

каскада = cascaded_union(многоъгълници)

каскадата, която се връща, е мултиполигон и има много изброени координати, искам да знам точно кои от точките от моите възли са каскадни (на базата на стойността на буфера 1), така че да мога да ги заменя с нов възел. Как мога да знам това??


person user3637176    schedule 02.05.2015    source източник
comment
Доколкото разбирам от документацията, каскадното обединение е обединение на всички входни полигони и така ще включва всички входни точки. Изпускам ли нещо?   -  person daphshez    schedule 05.05.2015


Отговори (1)


Вместо да използвате метода cascaded_union, може да е по-лесно да напишете свой собствен метод, за да проверите дали всеки два полигона се пресичат. Ако разбирам правилно какво искате да направите, искате да откриете дали два полигона се припокриват и след това да изтриете един от тях и съответно да редактирате друг.

Бихте могли да направите нещо подобно (не е най-доброто решение, ще обясня защо):

def clean_closely_lying_points(nodes):
    polygons = [Point([nodes[i]).buffer(1) for i in range(len(nodes))]
    for i in range(len(polygons) - 1):
        if polygons[i] is None:
            continue
        for j in range(i + 1, len(polygons)):
            if polygons[j] is None:
                continue
            if polygons[i].intersects(polygons[j]):
                polygons[j] = None
                nodes[j] = None
                # now overwrite 'i' so that it's whatever you want it to be, based on the fact that polygons[i] and polygons[j] intersect
                polygons[i] = 
                nodes[i] = 

Като цяло обаче смятам, че създаването на полигони отнема време и е ненужно. Също така е досадно да актуализирате заедно списъка с полигони и списъка с възли. Вместо това можете просто да използвате самите възли и да използвате метода за разстояние на shapely, за да проверите дали две точки са в рамките на 2 единици една от друга. Това трябва да е математически еквивалентно, тъй като пресечната точка между две окръжности и двете с радиус 1 означава, че централните им точки са най-много на разстояние 2. В този сценарий вашите for цикли ще приемат подобна структура, освен че ще обикалят възлите.

def clean_closely_lying_points(nodes):
    point_nodes = [Point(node) for node in nodes]  # Cast each of the nodes (which I assume are in tuple form like (x,y), to shapely Points)
    for i in range(len(point_nodes) - 1):
        if point_nodes[i] is None:
            continue
        for j in range(i + 1, len(point_nodes)):
            if point_nodes[j] is None:
                continue
            if point_nodes[i].distance(point_nodes[j]) < 2:
                point_nodes[j] = None
                point_nodes[i] = # Whatever you want point_nodes[i] to be now that you know that point_nodes[j] was within a distance of 2 (could remain itself)
     return [node for node in point_nodes if node is not None]

Резултатът от този метод ще бъде списък с оформени точкови обекти, с елиминирани близко разположени точки.

person abali96    schedule 11.09.2015