Я хочу рассчитать расстояние между двумя наборами широты и долготы.
Моя проблема
У меня есть 2500+ почтовых индексов в таблице, и у меня есть 10000+ магазинов, каждый магазин и почтовые индексы имеют свои лат, lng.
У каждого магазина есть расстояние доставки в KMS.
Я хочу сохранить все почтовые индексы магазина, который находится в пределах расстояния их доставки, в таблице с именем shop_delivery_zips. Я не могу использовать карты в момент размещения заказа, потому что магазин может не захотеть доставлять каждый почтовый индекс, который попадает в их диапазон расстояния доставки.
Итак, впервые я хочу вставить данные в shop_delivery_zips стол, проверив расстояние доставки.
Мое решение
Сначала я подумал, что напишу код, который будет переходить на все почтовые индексы и вычислять расстояние между магазинами lat, lng и zip lat, lng и сохранять данные в shop_delivery_zips стол, но если я сделаю это, то мне придется каждый раз звонить в API Google, а если я делаю для всех наших данных, то я должен делать 2500 * 10000 звонков API Google, которые Google не позволяет в течение одного дня, поэтому я не могу пойти с этим вариантом.
Итак, я хочу знать, что есть какой-либо способ, которым я вычисляю расстояние между двумя широтами, заданными. Может быть, по расчету Google использовать для расчета то же самое. Пожалуйста, предложите мне это решение или любое другое решение, если вы знаете.
Пожалуйста, дайте мне знать, если что-то не понятно.
Я знаю об этом решении для расчета по мере необходимости (взято из https://github.com/shafiqpab/distance-between-two-addresses-google-maps-api-php/blob/master/index.php):
//Calculate distance from latitude and longitude
$theta = $longitudeFrom - $longitudeTo;
$dist = sin(deg2rad($latitudeFrom)) * sin(deg2rad($latitudeTo)) +
cos(deg2rad($latitudeFrom)) * cos(deg2rad($latitudeTo)) *
cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.8515;
$unit = strtoupper($unit);
// for units in KM
$kilometers = round($miles * 1.609344, PHP_ROUND_HALF_UP).' km';
Это то, что вы ищете?
В то время как @tbedner имеет правильное решение математически, вы делаете не Я хочу выполнить этот расчет для каждого места в списке, так как математика очень нетривиальна.
Сначала вы определяете простую ограничивающую рамку, например:
lat BETWEEN $min_lat AND $max_lat
AND
lng BETWEEN $min_lng AND $max_lng
Что очень просто и может легко использовать индексы, и затем Вы делаете сложную математику на гораздо меньшем подмножестве мест, которые попадают в поле, чтобы найти те, которые находятся в пределах радиуса, который вы хотите.