Как уменьшить количество точек из огромного сбора данных на основе ближайшего расстояния? - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в python кодировании, моя основная сфера деятельности - наука о Земле. У меня есть огромная база данных (миллион точек), которая содержит координаты (x, y), выраженные в UTM (это не критично для описываемой проблемы), которые представляют центр окружностей с радиусом r. Я хотел бы уменьшить количество этих точек на основе порогового значения, которое выражается через несколько радиусов (например, 1 * r / 2 * r / 3.5 * r, et c.); Точки, которые будут ближе, чем порог, должны быть отклонены из списка точек. Я хотел бы создать новый канал маски, который будет показывать 1 для принятых точек и 0 для отклоненных точек, а также отображать результаты в виде кругов (точек в качестве центра) с радиусом r как исходного набора точек, так и новых принятых точек каналов в разные цвета на графике (помечены ось / заголовок / сводная легенда). Перед началом обработки данные точек должны быть отсортированы в порядке возрастания. Я хотел бы иметь возможность экспортировать график в виде изображений и карт PDF. #

  1. Элемент списка

    • данные будут выглядеть примерно так:
    • xy_data =
    • [[687690., 992340 .],
    • [687720., 992340.],
    • [693210., 993000.],
    • [693420., 999420.],
    • [693450., 999420.],
    • [693480., 999420.],
    • [693540., 999210.],
    • [693570., 999210.] ,
    • [693840., 999870.],
    • [693870., 999870.],
    • [693900., 999870.],
    • [ 694200., 1000530.],
    • [694230., 1000530.],
    • [694260., 1000530.],
    • [694890., 999240.]]
    • ...
    • ...
    • ...

пожалуйста, посмотрите внизу, что я пытался что по мне плохой способ кодирования. Пожалуйста, предложите лучший python способ выполнения sh этой задачи.

Заранее благодарим вас за вашу помощь и помощь (пожалуйста, предоставьте объяснение для каждого шага и не стесняйтесь предлагать чтения, которые помогут в понимании часть программирования)

    import numpy as np
    from scipy.spatial import distance
    from scipy.spatial.distance import cdist


    r           = 100.
    k           = 0
    N           = xy_data[:].shape[0] # xy_data is input data as shown above          
    dist_tol    = 3*r
    Mask        = np.ones(N)
    sep         = np.ones(N) # points separation
    point_dist3 = np.ones(N).reshape(1,N)

    for i in np.arange(k,N - 1,1):

        if i == 0 :
            point_dist3[:,i] = 0.
            sep[i]           = 0.
            Mask[i]          = 1.

        for j in np.arange(i+1,N,1):
            print('i: ',i, '\tj: ',j, '\tk: ', k)
            sep[j]  = cdist(xy_data[i:i+1], xy_data[j:j+1])
            if sep[j] <= dist_tol: #if point_dist2[:,i] <= dist_tol:
                Mask[j] = 0
                k       = j
            else:
                 continue
...