В Excel, как можно рассчитать расстояния между двумя большими наборами точек с широтой / долготой? - PullRequest
1 голос
/ 06 июня 2011

Приветствую всех, у меня есть 2 набора точек в Excel (группы A и B), каждый набор имеет около 1000 записей, которые содержат широту / долготу.То, что я хочу сделать, это сравнить группу A с группой B и выяснить для каждой точки в группе A, какая точка в группе B является ближайшей.Какой самый простой способ сделать это в Excel?

Одним из решений, над которым я начал работать, является макрос, который сравнивает 2 точки друг с другом.

    Sub distance()
'
' distance Macro
'
' Keyboard Shortcut: Ctrl+d
'
    Range("D4:E4").Select
    Selection.Copy
    Sheets("Analog Data").Select
    Range("F3:G3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D3:E3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Cluster 58").Select
    Range("FT4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D5:E5").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Analog Data").Select
    Range("F3:G3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D3:E3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Cluster 58").Select
    Range("FT5").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Теперь, как мне это сделать?скажите Visual Basic, чтобы установить диапазоны для перехода к следующему, чтобы мне не приходилось вводить каждый отдельный диапазон вплоть до диапазона («D1237: E1237»)?

Ответы [ 4 ]

2 голосов
/ 06 июня 2011

Вы можете использовать эту формулу, чтобы найти минимум различий, вам просто может понадобиться создать собственный способ определения разницы в широте / долготе (например, UDF). Поместите эту формулу в другой столбец и перетащите вниз:

=SUMPRODUCT(ABS(MIN(A1-B:B)))
1 голос
/ 06 июня 2011

Вопрос внутри тела вашего поста (о коде) полностью отличается от вопроса в заголовке вашего поста.

Теперь я собираюсь ответить на первый очень буквально, с оговоркойчто это действительно плохой способ делать вещи.Вы просите что-то вроде этого:

Sub distance()

Dim i As Long

For i = 0 To 1236

    Range("D4:E4").Offset(i, 0).Copy
    Sheets("Analog Data").Select
    Range("F3:G3").Offset(i, 0).PasteSpecial Paste:=xlPasteValues, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Range("D3:E3").Offset(i, 0).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Cluster 58").Select
    Range("FT4").Offset(i, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Next i

End Sub

Очистка этого ужасного беспорядка приводит к единственному утверждению, которое делает то же самое, что и ваш миллионный код:

    Sheets("Analog Data").Range("F3:G3").Resize(1237, 2).Value _
        = Sheets("Cluster 58").Range("D4:E4").Resize(1237, 2).Value

Теперь перейдем к лат-лонгу.Вы знаете, я предполагаю, что с (широтой, длиной), заданным в градусах, точки (0,0) и (0,0,1) находятся примерно на расстоянии 10 км друг от друга, а точки (90, -131) и (90,74)) точно в 0 км друг от друга?Это предполагает сферическую Землю.Предполагая, что более реалистичные данные, например, WGS84 , приводят к более сложным расчетам расстояния.

Прежде чем спрашивать, как это сделать в Excel, вы должны спросить себя (и рассказать нам), как бы вы сделали это на листе бумаги.

0 голосов
/ 22 марта 2016

Вот лучшая формула, которую я мог придумать, после некоторого утомительного поиска ..

вы можете скопировать это напрямую, чтобы превзойти и обновить ваши значения ..

Location-1  Latitude    Longitude   Location-2  Latitude    Longitude   Distance in Kilo Meters
POI-1   40.634068   -73.941248      POI-2       41.634068   -73.941248  

=ACOS((COS((B2*PI()/180))*COS((E2*PI()/180))*COS((-1*(F2*PI()/180))-(-1*(C2*PI()/180))))+(SIN((B2*PI()/180))*SIN((E2*PI()/180))))*6371

0 голосов
/ 09 июня 2011

Что касается лат-длинного, вы должны понимать, как конвертировать широту / долготу в ложные северо-восточные или UTM координаты. Эта страница может помочь вам в этом, но на испанском языке, кроме того, возникают дополнительные вопросы, если вам нужно определить расстояние между различными часовыми поясами или полушариями Земли.

О программированииЧастичное и почти не содержащее макросов решение будет выглядеть следующим образом:

(предполагается, что все в UTM-координатах и ​​в том же часовом поясе и в том же полушарии)

  • Зарезервируйте 3 ячейки для следующих данных:

ID_Point_in_GroupA

NORTH_of_ID

EAST_of_ID

  • Можно определить NORTH_ID и EAST_ID, добавив функцию "index" основан на ID_Point_in_GroupA.
  • Рассчитать пифагорейское расстояние каждой точки в группе B до NORTH_ID и EAST_ID
  • Определить шкаф.
  • Определить идентификатор ближайшей точки (a "match" * функция 1029 * поможет).
  • Макрос цикличного выполнения всех ID_Point_in_GroupA в группе A и сохранение результатов.

RegОРДС

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...