Страницы: 1
RSS
Поиск ближайшей точки по координатам
 
Добрый день. Требуется найти ближайшую точку к искомой по координатам. Данные в формате:
35,94156156,040809
35,95336256,024264
Видел похожие темы, но при большом массиве данных, формулы не работают, так же нашёл недочёт в них, так как они ищут в массиве от большего к меньшему и не смотрят на верный результат, а выдают первый вариант. Пример во вложении.

Должно получиться так:
- Есть метка "36,194327 55,705717", ближняя к ней это "36,198614 55,702564" (скрин)
- Или есть три метки "37,300359 55,945308", "37,299914 55,942363", "37,332601 55,951183" и ближний полигон к ним это "37,842295 55,75802", "37,842396 55,745956" и так далее. (скрин 2)

Хочется сделать результат на VBA (новичок) или формулой.
 
По уму, то надо через расстояния считать с учетом кривизны земли, но на это нет времени.
Для Москвы и так сойдет.Можете использовать как  идею.
дельту по направлениям взял отдельно, разницы в них разного масштаба
Код
Sub New_AddressNew()

    Dim out()
    With Worksheets("TP")
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
        arrXY = .Range("B1").Resize(LastRow, 2)

    End With
    With Worksheets("New_address_sheet")
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
        arrXYZ = .Range("B1").Resize(LastRow, 3)

    End With

    ReDim out(1 To UBound(arrXY), 1 To 1)
    For n = 2 To UBound(arrXY)
        deltax = 10000#
        deltaY = 10000#
        curAdr$ = ""
        For i = 2 To UBound(arrXYZ)
            dx = Abs(arrXY(n, 1) - arrXYZ(i, 1))
            dy = Abs(arrXY(n, 2) - arrXYZ(i, 2))
            If deltax > dx And deltaY > dy Then
                deltax = dx
                deltaY = dy
                curAdr$ = arrXYZ(i, 3)
            End If

        Next
        out(n, 1) = curAdr$
    Next
    Worksheets("TP").Range("f1").Resize(UBound(out), 1) = out
End Sub
 
doober Спасибо, но считает так же как формула. Полностью не точно. Вы правы по поводу кривизны земли, только вот как это просчитать)
Страницы: 1
Наверх