Все расчеты и методы являются приблизительными, но находятся в пределах допусков для того, что вам нужно.
Окружность Земли составляет примерно 40076000 метров.
пройденное расстояние на градус широты всегда одинаково и представляет собой просто пропорцию земного круга.
однако расстояние, проходимое на градус долготы, меняется в зависимости от вашей широты (эти кольца на глоде становятся меньше ближе к полюсам).
поэтому для заданного расстояния m соответствующие значения широты и долготы равны
earthcirc = 40076000;
// at Lat and Lon for distance m (in meters)
LatDelta = (m * 360) / earthcirc;
LonDelta = (m * 360) / abs(eathcirc*cos(lat));
Это дает вам ваши квадратные дельты широты и долготы для простого поиска ваших данных. но, найдя кандидата, вам следует выполнить расчет полного расстояния, так как угол квадрата находится на расстоянии более 5 км.
расстояние между 2 широтами/долгами
distLat = (lat1-lat2) * earthcirc) / 360;
distLong = (long1-long2) * earthcirc * cos((lat1+lat2)/2) / 360;
dist = sqrt( sqr(distLat) + sqr(distLong) );
Я знаю, что большинство компиляторов/языков используют радианы для функций cos/sin, но их легко объяснить в градусах.
что касается поиска ваших данных, самый простой способ - заказать их либо по широте, либо по долготе, тогда вы можете выполнить двоичный поиск, чтобы найти возможное место для проверки вместо полного сканирования. Есть лучшие способы упорядочить данные (квадраты), но для 2500 записей я бы не стал беспокоиться
person
Dampsquid
schedule
20.02.2012