Вариант 1: Выполните расчет в базе данных, переключившись на базу данных, поддерживающую GeoIP.
Вариант 2: Выполните расчет в базе данных: есливы используете MySQL, поэтому следующая хранимая процедура должна помочь
CREATE FUNCTION distance (latA double, lonA double, latB double, LonB double)
RETURNS double DETERMINISTIC
BEGIN
SET @RlatA = radians(latA);
SET @RlonA = radians(lonA);
SET @RlatB = radians(latB);
SET @RlonB = radians(LonB);
SET @deltaLat = @RlatA - @RlatB;
SET @deltaLon = @RlonA - @RlonB;
SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) +
COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2);
RETURN 2 * ASIN(SQRT(@d)) * 6371.01;
END//
Вариант 3: Если в вашей базе данных есть индекс широты и долготы, вы можете уменьшить количествовычисления, которые необходимо рассчитать, разработав начальную ограничивающую рамку на выбранном вами языке сценариев (minLat, maxLat, minLong и maxLong), и ограничив ряды подмножеством ваших записей на основе этого (ГДЕ широта между minLat И maxLatдолгота между minLong и maxLong).Тогда MySQL нужно только выполнить расчет расстояния для этого подмножества строк.
Если вы используете оператор SQL или хранимую процедуру для вычисления расстояния, то SQL все равно должен просматривать каждую запись в вашей базе данных.и рассчитать расстояние для каждой записи в вашей базе данных, прежде чем он сможет решить, следует ли вернуть эту строку или отбросить ее.Поскольку вычисления выполняются относительно медленно, было бы лучше, если бы вы могли уменьшить набор строк, которые необходимо вычислить, исключив строки, которые явно выйдут за пределы требуемого расстояния, так что мы выполняем только дорогостоящий расчет дляменьшее количество строк.
Использование ограничивающего прямоугольника аналогично рисованию сначала квадрата на карте с левым, правым, верхним и нижним краями на соответствующем расстоянии от нашей центральной точки.Затем наш круг будет нарисован внутри этого прямоугольника, а самые северные, самые восточные, самые южные и самые западные точки на круге касаются границ прямоугольника.Некоторые строки будут выходить за рамки этого поля, поэтому SQL даже не пытается вычислить расстояние для этих строк.Он рассчитывает расстояние только для тех строк, которые попадают в ограничивающую рамку, чтобы увидеть, попадают ли они и в круг.