Поиск ближайшей координаты.

Evgeny76

Client
Регистрация
11.09.2015
Сообщения
192
Благодарностей
85
Баллы
28
Всем привет!
Подскажите как можно реализовать следующее:
Есть большая таблица с координатами (GPS) объектов и есть моя искомая координата (долгота, широта).
Как найти в таблице координаты ближайщей точки к моей исходной координате.
Точного вхождения не будет. Но надо как-то найти столбец с ближайшими значениями по двум столбцам.

Примерно вот так:
я ищу: 55.8853|37.5852

Таблица:
55.6160|37.7330
55.7225|37.7915
55.6165|37.7330
55.6205|37.7330
55.8850|37.5840
55.6330|37.5375
55.6795|37.4955
55.7305|37.6955

В данном случае, лучший вариант - 5-я строка.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 333
Баллы
113
Сумма долготы и широты это нормальный критерий "близости"?
Просто может быть по долготе 1 км разница, по широте 10 км, сумма 10 км.
А может быть по долготе 5 км и по широте 5 км, сумма тоже 10 км, но по сути второй вариант намного ближе.
И правильнее считать гипотенузу.
 
  • Спасибо
Реакции: Alexmd и Evgeny76

Evgeny76

Client
Регистрация
11.09.2015
Сообщения
192
Благодарностей
85
Баллы
28
Сумма долготы и широты это нормальный критерий "близости"?
Просто может быть по долготе 1 км разница, по широте 10 км, сумма 10 км.
А может быть по долготе 5 км и по широте 5 км, сумма тоже 10 км, но по сути второй вариант намного ближе.
И правильнее считать гипотенузу.
Точно, гипотенуза!
Спасибо!
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 333
Баллы
113
Ну тогда как-то так:
C#:
double x = 55.6853;
double у = 37.5852;
var t = project.Tables["t"];
double [] nums= new double [t.RowCount] ;
double x_data = 0;
double у_data = 0;
for (int i = 0; i< t.RowCount; i++) {
    x_data = double.Parse(t.GetCell("A", i), System.Globalization.CultureInfo.InvariantCulture);
    у_data = double.Parse(t.GetCell("B", i), System.Globalization.CultureInfo.InvariantCulture);
    nums[i] = Math.Sqrt(Math.Pow(Math.Abs(x_data - x), 2) + Math.Pow(Math.Abs(у_data - у), 2));
}

double min_val = nums.Min();
int index = Array.IndexOf(nums, min_val);
return t.GetCell("A", index) + " " + t.GetCell("B", index);
Только проверьте, может я и не прав))
 
Последнее редактирование:
  • Спасибо
Реакции: Evgeny76 и doc

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 596
Баллы
113
Ну тогда как-то так:
C#:
double x = 55.6853;
double у = 37.5852;
var t = project.Tables["t"];
double [] nums= new double [t.RowCount] ;
double x_data = 0;
double у_data = 0;
for (int i = 0; i< t.RowCount; i++) {
    x_data = double.Parse(t.GetCell("A", i), System.Globalization.CultureInfo.InvariantCulture);
    у_data = double.Parse(t.GetCell("B", i), System.Globalization.CultureInfo.InvariantCulture);
    nums[i] = Math.Sqrt(Math.Pow(Math.Abs(x_data - x), 2) - Math.Pow(Math.Abs(у_data - у), 2));
}

double min_val = nums.Min();
int index = Array.IndexOf(nums, min_val);
return t.GetCell("A", index) + " " + t.GetCell("B", index);
Только проверьте, может я и не прав))
а там не плюс должен быть в корне? Кстати, модуль то зачем. Квадрат всё порешает
 
  • Спасибо
Реакции: Evgeny76 и Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 333
Баллы
113

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)