MySQL Функция для определения близости / диапазона Zip-кода

StackOverflow https://stackoverflow.com/questions/3543890

Вопрос

Я смог создать функцию PHP, чтобы определить список zip-кодов в определенном диапазоне данного Zip-кода. Тем не менее, моя следующая задача немного сложнее.

Позвольте сказать, что таблица имеет следующие столбцы:

id,
username
info
latitude
longitude
range

Каждая запись имеет уникальный идентификатор строки, некоторая информация, широта, долгота и максимальный диапазон от тех координат, которые человек хочет, чтобы эта запись была найдена. Итак, если я создаю запись с координатами -20, 50, 50 с диапазоном 15, это означает, что я хочу только людям в 15 милях от координат -20, 50, чтобы иметь возможность увидеть мою запись. Выяснение широты и долготы пользователя, работающего по поиску, является тривиальным веществом.

Когда пользователь ищет через базу данных, все записи должны быть получены для координат широты и долготы в пределах значения диапазона от пользователей LAT / Long.

Итак, нефункциональный пример кода с использованием формулы расстояния, чтобы проиллюстрировать это будет

$userLat = Широта пользователя, которая управляет поиском

$userLong = Долгота пользователя, которая управляет поиском

SELECT info FROM table 
WHERE sqrt(($userLat - lat)^2 - ($userLong - long)^2) <= range 
ORDER BY username ASC

Это было бы идеально, но это недействительно с точки зрения кодирования. Есть ли способ запустить вышеупомянутые сравнения, используя PHP и MySQL в одном запросе? Это будет включать возможность выполнения операций с использованием нескольких значений столбцов из данной строки.


Обновление + решение

Я создал еще одну запись вопроса, которая обращается к этой проблеме и имеет очень компактную функцию, чтобы сделать то, что хотел этот вопрос. Функция, заданная CODERPROS, служила вдохновением для него (его функция имеет намного лучшее решение для определенных ситуаций). Однако, поскольку я использую свою функцию с большой степенью контроля над входом, я создал отдельную функцию. Его можно найти по ссылке ниже:

Пользовательская функция MySQL для синтаксиса широты долготы

Это было полезно?

Решение

Эта Nifty Lil Mysql функция, которую я написал, должен определенно сделать трюк для вас.

BEGIN
   DECLARE x decimal(18,15);
   DECLARE EarthRadius decimal(7,3);
   DECLARE distInSelectedUnit decimal(18, 10);

   IF originLatitude = relativeLatitude AND originLongitude = relativeLongitude THEN
          RETURN 0; -- same lat/lon points, 0 distance
   END IF;

   -- default unit of measurement will be miles
   IF measure != 'Miles' AND measure != 'Kilometers' THEN
          SET measure = 'Miles';
   END IF;

   -- lat and lon values must be within -180 and 180.
   IF originLatitude < -180 OR relativeLatitude < -180 OR originLongitude < -180 OR relativeLongitude < -180 THEN
          RETURN 0;
   END IF;

   IF originLatitude > 180 OR relativeLatitude > 180 OR originLongitude > 180 OR relativeLongitude > 180 THEN
         RETURN 0;
   END IF;

   SET x = 0.0;

   -- convert from degrees to radians
   SET originLatitude = originLatitude * PI() / 180.0,
       originLongitude = originLongitude * PI() / 180.0,
       relativeLatitude = relativeLatitude * PI() / 180.0,
       relativeLongitude = relativeLongitude * PI() / 180.0;

   -- distance formula, accurate to within 30 feet
   SET x = Sin(originLatitude) * Sin(relativeLatitude) + Cos(originLatitude) * Cos(relativeLatitude) * Cos(relativeLongitude - originLongitude);

   IF 1 = x THEN
          SET distInSelectedUnit = 0; -- same lat/long points
          -- not enough precision in MySQL to detect this earlier in the function
   END IF;

   SET EarthRadius = 3963.189;
   SET distInSelectedUnit = EarthRadius * (-1 * Atan(x / Sqrt(1 - x * x)) + PI() / 2);

   -- convert the result to kilometers if desired
   IF measure = 'Kilometers' THEN
          SET distInSelectedUnit = MilesToKilometers(distInSelectedUnit);
   END IF;

   RETURN distInSelectedUnit;
END

Это происходит оригинал, оригинал, оригинал, реляссивенность, относительство и измерение в качестве параметров. Мера может быть просто Miles или Kilometers

Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top