Сортировать список координат в полоски - PullRequest
1 голос
/ 06 мая 2019

Я читаю в лат и длинные координаты из CSV-файла.Моя цель состоит в том, чтобы взять координаты и отсортировать их по соответствующим пунктам в виде списка списков, например [[strip 1 coordiantes],[strip 2 coordiantes],[strip 3 coordinates]]

Конечная цель - использовать эти полосы для определения наиболее удаленных угловых точек, которые будут использоваться для другой работы.,Простое получение стандартных значений max, min x и y для всех координат не работает, поскольку ориентация точек не является фиксированной.

Перейдите к следующему:

[['41.55275997', '21.97765353'], ['41.55273016', '21.97763498'], ['41.55270034', '21.97761643'], ['41.55267052', '21.97759788'], ['41.55264071', '21.97757933'], ['41.55270455', '21.97740142'], ['41.55273436', '21.97741997'], ['41.55276418', '21.97743852'], ['41.55279399', '21.97745707'], ['41.55282381', '21.97747562'], ['41.55275997', '21.97765353'], ['41.55273016', '21.97763498'], ['41.55270034', '21.97761643'], ['41.55267052', '21.97759788'], ['41.55264071', '21.97757933']]

К этому:

[[['41.55275997', '21.97765353'], ['41.55273016', '21.97763498'], ['41.55270034', '21.97761643'], ['41.55267052', '21.97759788'], ['41.55264071', '21.97757933']], [['41.55270455', '21.97740142'], ['41.55273436', '21.97741997'], ['41.55276418', '21.97743852'], ['41.55279399', '21.97745707'], ['41.55282381', '21.97747562']], [['41.55275997', '21.97765353'], ['41.55273016', '21.97763498'], ['41.55270034', '21.97761643'], ['41.55267052', '21.97759788'], ['41.55264071', '21.97757933']]]

Мой план состоял в том, чтобы использовать расчет подъема / пробега между точками.Однако, поскольку наклон точек изменяется, когда координата перемещается на другую полосу, и снова при сравнении точек на той же полосе, я не уверен, как поступить.

enter image description here

CurrКод:

# get waypoint coordiantes
coordinateList = []
csv_file.seek(0)
next(csv_reader)
#add all coordinates in csv to a single list
for line in csv_reader:
    coordinateList.append([line[0],line[1]])
print(coordinateList)

#Take coordinate list (list of lists) and add coordinates to lists reprenting a s ingle stip

#Get the rise over run from the first two coordinates.
rise = float(coordinateList[0][1]) - float(coordinateList[1][1])
run = float(coordinateList[0][0]) - float(coordinateList[1][0])
print(rise,run)
#add first two coordiantes to a strip
coordStips = [[coordinateList[0],coordinateList[1]]]

#iterate through remaining coordiantes and compare
for coord1,coord2 in zip(coordinateList[1:-1:], coordinateList[2::]):
    #print(coord1,coord2)
    rise = float(coord2[1]) - float(coord1[1])
    run = float(coord2[0]) - float(coord1[0])
    print(rise,run)

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Вот склоны, которые я рассчитал в настоящее время.Не уверен, почему они все немного отличаются.

0.622065727665411
0.622065727665411
0.6222744045453561
-2.7868107768422306
0.6222744045453561
0.6220657278136351
0.6222744045453561
0.622065727665411
-2.7868107768422306
0.6222744046936797
0.622065727665411
0.622065727665411
0.6222744045453561

Решение:

# get waypoint coordiantes
        coordinateList = []
        csv_file.seek(0)
        next(csv_reader)
        #add all coordinates in csv to a single list
        for line in csv_reader:
            coordinateList.append([line[0],line[1]])
        print(coordinateList)

        #Take coordinate list (list of lists) and add coordinates to lists reprenting a s ingle stip

        #Get the rise over run from the first two coordinates.
        rise = float(coordinateList[0][1]) - float(coordinateList[1][1])
        run = float(coordinateList[0][0]) - float(coordinateList[1][0])
        masterslope = rise/run

        #---Strip List set Up
        #add first two coordiantes to a strip
        coordStrips = [[coordinateList[0],coordinateList[1]]]
        stripCount = 0
        switch = False


        #----------Iteration
        #iterate through remaining coordiantes and compare
        for coord1,coord2 in zip(coordinateList[1:-1:], coordinateList[2::]):
            #if previous waypoint was found to be on a new strip
            if switch == True:
                coordStrips[stripCount].append(coord2)

                rise = float(coord2[1]) - float(coord1[1])
                run = float(coord2[0]) - float(coord1[0])
                masterslope = rise/run

                switch = False
                continue
            #print(coord1,coord2)
            rise = float(coord2[1]) - float(coord1[1])
            run = float(coord2[0]) - float(coord1[0])
            slope = rise/run
            diff = abs(masterslope-slope)
            #they are in the same strip, add to current strip
            if diff < 0.5:
                coordStrips[stripCount].append(coord2)
            #new strip
            else:

                stripCount+= 1
                coordStrips.append([coord2])
                switch = True

1 Ответ

2 голосов
/ 06 мая 2019

Я думаю, вы на правильном пути. Предполагая, что точки, принадлежащие одной «полосе», уже находятся в списке вместе, вам просто нужно запомнить наклон текущей группы и продолжать добавлять точки, пока они имеют наклон w.r.t. последняя точка (примерно) такая же, как последний уклон.

points = [tuple(map(float, t)) for t in coordinateList]

x2, y2 = points[0]
groups = [[(x2, y2)]]
slope = None
close = lambda a, b: abs(a - b) < epsilon

for x, y in points[1:]:
    if slope is None or close(x-x2, slope[0]) and close(y-y2, slope[1]):
        groups[-1].append((x,y))
        slope = (x-x2, y-y2)
    else:
        groups.append([(x,y)])
        slope = None
    x2, y2 = x, y

Самое сложное - это когда склоны считают "достаточно близкими". Для вашего примера, любой epsilon от 1e-4 до 1e-7, кажется, работает, в результате чего группы

[(41.55275997, 21.97765353), (41.55273016, 21.97763498), (41.55270034, 21.97761643), (41.55267052, 21.97759788), (41.55264071, 21.97757933)]
[(41.55270455, 21.97740142), (41.55273436, 21.97741997), (41.55276418, 21.97743852), (41.55279399, 21.97745707), (41.55282381, 21.97747562)]
[(41.55275997, 21.97765353), (41.55273016, 21.97763498), (41.55270034, 21.97761643), (41.55267052, 21.97759788), (41.55264071, 21.97757933)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...