
Обчисліть або запитайте відстань у великому колі між точками широти та довготи за допомогою формули гаверсинуса (приклади PHP, JavaScript, Java, Python, MySQL, MSSQL)
Цього місяця я досить багато займався програмуванням PHP та MySQL по відношенню до ГІС. Шукаючи в мережі, мені було важко знайти деякі з них Географічні розрахунки щоб знайти відстань між двома місцями, тому я хотів поділитися ними тут.

Простий спосіб обчислення відстані між двома точками - використання формули Піфагора для обчислення гіпотенузи трикутника (A² + B² = C²). Це відомо як Евклідова відстань.
Це цікавий початок, але він не стосується географії, оскільки відстань між лініями широти та довготи не є однаковими. У міру наближення до екватора лінії широти віддаляються один від одного. Якщо ви використовуєте просте рівняння тріангуляції, воно може виміряти відстань точно в одному місці та неправильно в іншому через кривизну Землі.
Відстань великого кола
Маршрути, пройдені на великі відстані навколо Землі, відомі як відстань великого кола. Тобто…найкоротша відстань між двома точками на сфері відрізняється від точок на плоскій карті. Поєднайте це з тим фактом, що лінії широти та довготи не є рівновіддаленими… і ви отримаєте складний розрахунок.
Ось фантастичне відео-пояснення того, як працюють Великі кола.
Формула Гаверсіна
Відстань за допомогою кривизни Землі включається у формулу Гаверсинуса, яка використовує тригонометрію для врахування кривизни Землі. Коли ви знаходите відстань між двома місцями на Землі (по прямій), пряма лінія насправді є дугою.
Це стосується повітряних польотів – ви коли-небудь дивилися на реальну карту польотів і помічали, що вони дугоподібні? Це тому, що політ по арці між двома точками коротший, ніж безпосередньо до місця.
PHP: Обчисліть відстань між 2 точками широти та довготи
Ось формула PHP для розрахунку відстані між двома точками (разом із перетворенням милі в кілометр), округлена до двох знаків після коми.
function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
$theta = $longitude1 - $longitude2;
$distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
switch($unit) {
case 'miles':
break;
case 'kilometers' :
$distance = $distance * 1.609344;
}
return (round($distance,2));
}
Змінні:
- $Latitude1 – змінна широти вашого першого розташування.
- $Longitude1 – змінна для довготи вашого першого місцезнаходження
- $Latitude2 – змінна широти вашого другого місцезнаходження.
- $Longitude2 – змінна для довготи вашого другого місцезнаходження.
- $одиниця – за замовчуванням миль. Це можна оновити або передати як кілометрів.
Java: обчислення відстані між 2 точками широти та довготи
public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
double theta = longitude1 - longitude2;
double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit.equals("miles")) {
return Math.round(distance, 2);
} else if (unit.equals("kilometers")) {
return Math.round(distance * 1.609344, 2);
} else {
return 0;
}
}
Змінні:
- широта1 – змінна широти вашого першого розташування.
- довгота 1 – змінна для довготи вашого першого місцезнаходження
- широта2 – змінна широти вашого другого місцезнаходження.
- довгота 2 – змінна для довготи вашого другого місцезнаходження.
- блок – за замовчуванням миль. Це можна оновити або передати як кілометрів.
Javascript: обчислення відстані між 2 точками широти та довготи
function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
let theta = longitude1 - longitude2;
let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit == 'miles') {
return Math.round(distance, 2);
} else if (unit == 'kilometers') {
return Math.round(distance * 1.609344, 2);
}
}
Змінні:
- широта1 – змінна широти вашого першого розташування.
- довгота 1 – змінна для довготи вашого першого місцезнаходження
- широта2 – змінна широти вашого другого місцезнаходження.
- довгота 2 – змінна для довготи вашого другого місцезнаходження.
- блок – за замовчуванням миль. Це можна оновити або передати як кілометрів.
Python: обчислити відстань між 2 точками широти та довготи
У будь-якому випадку, ось формула Python для обчислення відстані між двома точками (разом із перетворенням милі в кілометр), округлена до двох знаків після коми. Слава моєму синові, Біллу Карру, який працює в області Data Scientist OpenINSIGHTS, для коду.
from numpy import sin, cos, arccos, pi, round
def rad2deg(radians):
degrees = radians * 180 / pi
return degrees
def deg2rad(degrees):
radians = degrees * pi / 180
return radians
def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
theta = longitude1 - longitude2
distance = 60 * 1.1515 * rad2deg(
arccos(
(sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) +
(cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
)
)
if unit == 'miles':
return round(distance, 2)
if unit == 'kilometers':
return round(distance * 1.609344, 2)
Змінні:
- широта1 – змінна для вашого першого розташування широта.
- довгота 1 – змінна для вашого першого розташування довготи
- широта2 – змінна для вашого другого розташування широта.
- довгота 2 – змінна для вашого другого розташування довготи.
- блок – за замовчуванням миль. Це можна оновити або передати як кілометрів.
MySQL: отримання всіх записів у межах діапазону шляхом обчислення відстані в милях за допомогою широти та довготи
Також можна використовувати SQL для обчислення всіх записів на певній відстані. У цьому прикладі я надсилаю запит MyTable у MySQL, щоб знайти всі записи, які менше або дорівнюють змінній $distance (у милях) до мого місцезнаходження на $latitude і $longitude:
Запит на отримання всіх записів у межах певного відстань шляхом обчислення відстані в милях між двома точками широти та довготи складають:
$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."
Вам потрібно буде налаштувати це:
- $ довготи - це змінна PHP, де я передаю довготу точки.
- $ широта - це змінна PHP, де я передаю довготу точки.
- $ відстань - це відстань, на яку ви хотіли б знайти всі записи, менші або рівні.
- таблиця - це таблиця ... ви захочете замінити її на ім'я вашої таблиці.
- широта - це поле вашої широти.
- довготи - це поле вашої довготи.
MySQL: отримання всіх записів у межах діапазону шляхом обчислення відстані в кілометрах за допомогою широти та довготи
І ось запит SQL із використанням кілометрів у MySQL:
$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."
Вам потрібно буде налаштувати це:
- $ довготи - це змінна PHP, де я передаю довготу точки.
- $ широта - це змінна PHP, де я передаю довготу точки.
- $ відстань - це відстань, на яку ви хотіли б знайти всі записи, менші або рівні.
- таблиця - це таблиця ... ви захочете замінити її на ім'я вашої таблиці.
- широта - це поле вашої широти.
- довготи - це поле вашої довготи.
Я використав цей код на корпоративній платформі картографування, яку ми використали для роздрібного магазину з понад 1,000 місць по всій Північній Америці, і він працював чудово.
Географічна відстань Microsoft SQL Server: STDistance
Якщо ви використовуєте Microsoft SQL Server, вони пропонують власні функції, STDistance для обчислення відстані між двома точками за допомогою типу даних Географія.
DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);
Наконечник капелюха Манашу Саху, віце-президенту та архітектору Highbridge.
Дуже дякую, що поділилися. Це було легке копіювання та вставлення, і воно чудово працює. Ви заощадили мені багато часу.
FYI для тих, хто переносить на C:
подвійний deg2rad (подвійний град) {повернутий градус * (3.14159265358979323846 / 180.0); }
Дуже гарний шматок допису - працював дуже приємно - мені довелося лише змінити назву таблиці, що тримає довжину лат. Це працює досить швидко, щоб .. У мене досить мала кількість довжин (<400), але я думаю, що це було б гарно. Хороший сайт - я щойно додав його до свого облікового запису del.icio.us і регулярно перевірятиму.
Дуже дякую Пітеру та Керрі! Якщо вам подобається працювати над проектами ГІС, я б порекомендував:
Щиро дякую ... 😀
Я цілий день шукав розрахунки відстані і знайшов алгоритм харверсину, дякую вам, що подали приклад, як помістити його в оператор sql. Дякую і вітаю, Даніеле
Радий допомогти, рейку, друже!
Зараз я шукаю функцію PHP у полігоні, яка буде приймати масив послідовних координат широти та довготи та з’ясувати, чи є інша точка всередині чи поза полігону.
Я знайшов рівняння, щоб з’ясувати, чи є точка у багатокутнику!
я думаю, що ваш SQL потребує наявності заяви.
замість WHERE відстань <= $ відстань вам може знадобитися
використовуйте HAVING distance <= $ distance
інакше дякую, що заощадили купу купу часу та енергії.
Привіт Девід,
Якщо ви виконуєте будь-який тип оператора GROUP BY, вам знадобиться HAVING. У наведеному вище прикладі я цього не роблю.
Doug
Починаючи з MySQL 5.x, ви не можете використовувати псевдонім для речення WHERE див http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Використовуйте HAVING замість WHERE у наведених вище запитах
Дуже дякую. Ви чудово зробили цю справу, чого я насправді хочу. Дуже дякую.
Дуже дякую, що поділилися цим кодом. Це заощадило мені багато часу на розробку. Крім того, дякую вашим читачам за те, що ви звернули увагу на те, що оператор HAVING необхідний для MySQL 5.x. Дуже корисний.
Я щасливий, що читачі набагато розумніші, ніж я!
🙂
Наведена вище формула економить мені багато часу. Велике спасибі.
Мені також потрібно перемикатися між форматом NMEA та градусами. Я знайшов формулу за цією URL-адресою внизу сторінки. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Хтось знає, як це перевірити?
Дякую!
Гаррі
Здравствуйте,
Інше питання. Чи існує формула для рядків NMEA, як наведена нижче?
1342.7500, N, 10052.2287, E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Спасибі,
Гаррі
Я також виявив, що WHERE не працює для мене. Змінив його на HAVING, і все працює ідеально. Спочатку я не читав коментарі та переписав його за допомогою вкладеного вибору. Обидва працюватимуть чудово.
Щиро дякую за сценарій, написаний на mysql, просто довелося зробити кілька незначних коригувань (МАЮ) 🙂
Отримана робота
Неймовірно корисно, велике спасибі! У мене були деякі проблеми з новим “HAVING”, а не “WHERE”, але одного разу, коли я прочитав тут коментарі (приблизно через півгодини розчарувавши зуби = P), я змусив це працювати гарно. Дякую ^ _ ^
велике спасибі чудово працює
Майте на увазі, що вибране твердження, подібне до цього, буде дуже обчислювальним, а отже, повільним. Якщо у вас багато цих запитів, це може досить швидко завалити ситуацію.
Набагато менш інтенсивний підхід полягає у виконанні першого (грубого) вибору з використанням області SQUARE, визначеної обчисленою відстанню, тобто «вибрати * з назви таблиці, де широта між lat1 і lat2 і довгота між lon1 і lon2». lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, подібно до lon. latdiff ~= відстань / 111 (для км), або відстань / 69 для миль, оскільки 1 градус широти становить ~ 111 км (незначна зміна, оскільки земля злегка овальна, але достатньо для цієї мети). londiff = відстань / (abs(cos(deg2rad(latitude))*111)) — або 69 для миль (ви можете взяти трохи більший квадрат, щоб врахувати варіації). Потім візьміть результат і передайте його в радіальний вибір. Тільки не забудьте врахувати координати поза межами, тобто діапазон прийнятної довготи становить від -180 до +180, а діапазон прийнятної широти – від -90 до +90, якщо ваш latdiff або londiff виходить за межі цього діапазону . Зауважте, що в більшості випадків це може бути незастосовним, оскільки воно впливає лише на обчислення лінії через Тихий океан від полюса до полюса, хоча вона перетинає частину Чукотки та частину Аляски.
Ми цим досягаємо значного зменшення кількості балів, щодо яких ви робите цей розрахунок. Якщо у вас є мільйон глобальних точок у базі даних, розподілених приблизно рівномірно і ви хочете шукати в межах 100 км, то ваш перший (швидкий) пошук займає площу 10000 кв. Км і, ймовірно, дасть близько 20 результатів (на основі рівномірного розподілу по площа близько 500 млн. кв. км), що означає, що ви виконуєте складний розрахунок відстані 20 разів для цього запиту замість мільйона разів.
Невелика помилка у прикладі…, яка була б у межах 50 км (а не 100), оскільки ми розглядаємо «радіус» нашого ... квадрата.
Чудова порада! Я справді працював із розробником, який написав функцію, яка витягувала внутрішній квадрат, а потім рекурсивну функцію, яка створювала «квадрати» по периметру, щоб включити та виключити решту точок. Результат був неймовірно швидким – він міг оцінити мільйони балів за мікросекунди.
Мій підхід вище, безумовно, «грубий», але дієвий. Знову дякую!
Дуг,
Я намагався використовувати mysql і php, щоб оцінити, чи розташована довга точка в межах багатокутника. Чи знаєте ви, чи публікував ваш друг-розробник приклади виконання цього завдання? Або чи знаєте ви хороші приклади. Заздалегідь спасибі.
Привіт усім, це мій тестовий вираз SQL:
SELECT DISTINCT area_id, (
(
(
acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
`lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
`lat_dec` * pi( ) /180 )
) * cos( (
( 51.02 - `lon_dec` ) * pi( ) /180 )
)
)
) *180 / pi( )
) *60 * 1.1515 * 1.609344
) AS distance
FROM `post_codes` WHERE distance <= 50
і Mysql каже мені, що відстань не існує як стовпець, я можу використовувати порядок за, я можу зробити це без ДЕ, і це працює, але не з ним ...
Замініть “WHERE distance” на “HAVING distance”.
Працює як шарм, дякую, Дугласе!
Це чудово, проте так само, як птахи літають. Було б чудово спробувати якось включити API Google Maps до цього (можливо, за допомогою доріг тощо), лише щоб дати ідею, використовуючи інший вид транспорту. Я ще не створив змодельовану функцію відпалу в PHP, яка могла б запропонувати ефективне рішення проблеми мандрівного продавця. Але я думаю, що, можливо, я зможу повторно використати для цього деякі ваші коди.
Привіт Дуглас
велике спасибі за цю статтю - ви просто заощадили мені багато часу.
піклуватися,
німрод @ Ізраїль
Гарна стаття! Я знайшов багато статей, в яких описувалося, як обчислити відстань між двома точками, але я справді шукав фрагмент SQL.
Спасибі багато працює добре
Дуже дякую за цю формулу. Це скоротило час на проект розташування магазину, який мене з’їдав.
Дякую пучок. Цей маленький рядок коду заощадив мені значний час у проекті розміщення магазину!
# 1054 - Невідомий стовпець "відстань" у "де речення"
схвалювати
Те ж саме! В чому проблема :-/? як вирішити «відстань» - проблему стовпця? Допоможіть нам, будь ласка !! 🙂
Спробуйте використовувати HAVING замість WHERE
2 дні досліджень, щоб нарешті знайти цю сторінку, яка вирішує мою проблему. Схоже, мені краще вибити мою WolframAlpha і розібратися з моєю математикою. Перехід від WHERE до HAVING мій сценарій справний. ДЯКУЮ
замість речення WHERE використовуйте:
МАЮЧИ відстань <50
Дякую Георгію. Я продовжував отримувати стовпець "відстань" не знайдений. Одного разу я змінив ДЕ ДЕ на МАЄ, це спрацювало як шарм!
Я хотів би, щоб це була перша сторінка, яку я знайшов на цьому. Спробувавши безліч різних команд, це була єдина, яка працювала належним чином і з мінімальними змінами, необхідними для власної бази даних.
Спасибі велике!
Я хотів би, щоб це була перша сторінка, яку я знайшов на цьому. Спробувавши безліч різних команд, це була єдина, яка працювала належним чином і з мінімальними змінами, необхідними для власної бази даних.
Спасибі велике!
Дуже дякую!
Дуже дякую!
Я не думаю, що код більше не відображається. Може це Firefox?
Я щойно тестував як у Firefox, так і в Chrome, і він з’являється. Спробувати ще раз?
Привіт. Дуже дякую. Це працює як шарм.
Дуже дякую Дугласу. Це працює ідеально.
Я знаю, що ця формула працює, але я не бачу, де враховується радіус землі. Хто-небудь може мене просвітити, будь ласка?
Тім, щоб отримати повне пояснення формули Гаверсіна (це не код), перегляньте статтю Вікіпедії: http://en.wikipedia.org/wiki/Haversine_formula
Гарний! Це мені надзвичайно допомогло!
Чудова річ Дуглас. Ви пробували отримати точку перетину, враховуючи довжину / ширину / підшипник двох точок?
Ще цього не зробив, Хан!
Дякую, Дугласе, SQL-запит - це саме те, що мені потрібно, і я думав, що мені доведеться написати його самому. Ви врятували мене від можливої години кривої навчання довготи широти!
Я постійно отримую повідомлення про помилки: невідомий стовпець "Відстань" у пункті "where" у запиті MySQL.
Пітере, будь ласка, прочитайте інші коментарі. Здається, що деяким людям довелося використовувати інший синтаксис для WHERE / HAVING.
Дякуємо за цю чудову статтю! Просто перевірив код на моїй БД і чудово працював!
Дугласе, дякую за цей дивовижний код. Я тріснув головою про те, як це зробити на моєму порталі спільноти GPS. Ви врятували мені години.
Приємно чути, Еш!
дякую за розміщення цієї корисної статті,
але я чомусь хотів би запитати
як отримати відстань між кордами всередині mysql db та кордами, вставленими користувачем у php?
для більш чіткого опису:
1. користувач повинен вставити [id] для вибору вказаних даних з баз даних і власних координат користувача
2. PHP-файл отримує цільові дані (координати) за допомогою [id], а потім обчислює відстань між користувачем та цільовою точкою
або можете просто отримати відстань від коду нижче?
$ qry = “ВИБРАТИ *, (((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` Latitude` * pi () / 180)) + cos ((„. $ широта. "* pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((". $ longitude." - "Longitude`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) як відстань ВІД `MyTable` WHERE відстань> =". $ Distance. " >>>> чи можу я “вийняти” відстань звідси?
знову дякую,
Тіммі С.
неважливо, я з'ясував, як функція працює в php
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
дуже дякую!!
добре, все, що я спробував, не працює. Я маю на увазі те, що у мене працює, але відстань далеко.
Хтось міг би побачити, що не так з цим кодом?
if (isset ($ _ POST ['submit'])) {$ z = $ _POST ['поштовий індекс']; $ r = $ _POST ['радіус']; ехо “Результати для“. $ z; $ sql = mysql_query (“ВИБЕРИТЕ ВИЗНАЧЕНИЙ m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m.verified, z1.lat, z2.lon, z1. місто, z1.state ВІД mrk m, zip z1, zip z2 ДЕ m.zipcode = z1.zipcode І z2.zipcode = $ z AND (3963 * acos (усіка (sin (z2.lat / 57.2958) * sin (m. y1 / 57.2958) + cos (z2.lat / 57.2958) * cos (m.y1 / 57.2958) * cos (m.x1 / 57.2958 - z2.lon / 57.2958), 8))) <= $ r ") або померти (mysql_error ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. ""; $ store = $ row ['LocAddSt']. ""; $ store. = $ row ['LocAddCity']. ",". $ row ['LocAddState']. " ". $ Row ['zipcode']; $ latitude1 = $ row ['lat']; $ longitude1 = $ row ['lon']; $ latitude2 = $ row ['y1']; $ довгота2 = $ рядок ['x1']; $ city = $ row ['city']; $ state = $ row ['state']; $ dis = getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi'); // $ dis = відстань ($ lat1, $ lon1, $ lat2, $ lon2); $ перевірено = $ рядок ['перевірено']; if ($ verify == '1') {echo “”; echo “”. $ store. ””; echo $ dis. ”Милі (милі)”; ехо “”; } else {echo “”. $ store. ””; echo $ dis. ”Милі (милі)”; ехо “”; }}}
мої функції.php код
функція getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2; $ відстань = (sin (deg2rad ($ latitude1)) * * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ); $ відстань = acos ($ відстань); $ відстань = rad2deg ($ відстань); $ відстань = $ відстань * 60 * 1.1515; перемикач ($ одиниця) {case 'Mi': break; справа 'Km': $ відстань = $ відстань * 1.609344; } return (раунд ($ відстань, 2)); }
Заздалегідь спасибі
Дякую за цю статтю. Прекрасно працює з моїм кодом. 🙂
Гей, Дуглас, чудова стаття. Я знайшов ваше пояснення географічних понять і коду справді цікавим. Єдиною моєю пропозицією було б розмістити та відступити код для відображення (наприклад, Stackoverflow). Я розумію, що ви хочете заощадити простір, але звичайний інтервал / відступ коду значно полегшить мені, програмісту, читання та розбір. У всякому разі, це дрібниця. Продовжуйте велику роботу.
Дякую! Я трохи змінив пост ... але рівняння займають так багато місця і настільки довгі, що я не впевнений, що це занадто допомагає.
Дуже дякую.
тут при використанні з функцією ми отримуємо один тип відстані .. при використанні запиту приходить інший тип відстані
Я не буду обчислювати відстань між двома станами
Muchas gracias por tan hermoso codigo…
Це добре функціонує косинус. Я не знаю математики, але дякую!
Чудова робота ... 🙂 (у)
здається швидшим (mysql 5.9) використовувати подвійну формулу в select та де:
$ формула = “(((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` Latitude` * pi () / 180)) + cos ((„. $ latitude. ”* Pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos ((((“. $ Longitude.” - `Longitude`) * pi () / 180)))) * 180 / пі ()) * 60 * 1.1515 * 1.609344) ”;
$ sql = 'ВИБЕРІТЬ *,'. $ формула. ' як відстань від таблиці ДЕ '.. $ формула.' <= '. $ відстань;
Дякую…
не працює, якщо
“ДЕ відстань”
працює, якщо
“МАЄМО відстань”
Велике спасибі за зріз цієї статті. Це дуже корисно.
Спочатку PHP був створений як проста скриптова платформа під назвою “Персональна домашня сторінка”. В наш час PHP (скорочення від Hypertext Preprocessor) є альтернативою технології Active Server Pages (ASP) Microsoft.
PHP - це мова з відкритим кодом на стороні сервера, яка використовується для створення динамічних веб-сторінок. Його можна вбудувати в HTML. PHP зазвичай використовується спільно з базою даних MySQL на веб-серверах Linux / UNIX. Це, мабуть, найпопулярніша мова сценаріїв.
Я виявив, що вищевказане рішення не працює належним чином.
Мені потрібно змінити на:
$ qqq = “ВИБРАТИ *, (((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((”. $ широта. "* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((". $ longitude." - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) як відстань ВІД `реєстру`“;
Дякую Купендра!
дякую, сер, все чудово.. але в мене є одне запитання, якщо я хочу виводити без коми, що я можу зробити..?
Спасибо заранее.
Привіт, будь ласка, мені дійсно знадобиться ваша допомога у цьому.
Я зробив запит на отримання свого веб-сервера
53.47792 = широта $
-2.23389 = довгота $
і 20 = відстань, яку я хочу отримати
Однак, використовуючи формулу, вона отримує всі рядки в моїй базі даних
$results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”)pi()/180)) * sin((латpi()/180))+cos((“.$latitude.”pi()/180)) * cos((латpi()/180)) * cos(((“.$longitude.”- lng)пі()/180))))180/pi())601.1515*1.609344) як відстань ВІД маркерів HAVING distance >= “.$distance ));
[{"Id": 1, "name": "Frankie Johnnie & Luigo Too", "address": "939 W El Camino Real, Mountain View, CA", "lat": 37.386337280273, "lng": - 122.08582305908, ”Distance”: 16079.294719663}, {“id”: 2, “name”: ”Піцерія на східному узбережжі Амічі”, “address”: ”790 Castro St, Mountain View, CA”, “lat”: 37.387138366699, “lng”: -122.08323669434, "відстань": 16079.175940152}, {"id": 3, "name": "Pizza Bar & Grill Kapp's", "address": "191 Castro St, Mountain View, CA", "lat": 37.393886566162, ”Lng”: - 122.07891845703, “відстань”: 16078.381373826}, {“id”: 4, “name”: ”Піца круглого столу: Маунтін-В’ю”, “адреса”: ”570 N Shoreline Blvd, Mountain View, CA”, ”Lat”: 37.402652740479, “lng”: - 122.07935333252, “distance”: 16077.420540582}, {“id”: 5, “name”: ”Піца та паста Тоні і Альби”, “address”: ”619 Escuela Ave, Mountain Вид, Каліфорнія ”,” lat ”: 37.394012451172,“ lng ”: - 122.09552764893,“ distance ”: 16078.563225154}, {“ id ”: 6,“ name ”:” Піца з дерев’яною пічкою ”,“ address ”:” 4546 El Camino Real, Лос-Альтос, Каліфорнія ”,” lat ”: 37.401725769043,“ lng ”: - 122.11464691162,“ distance ”: 16077.937560795}, {“ id ”: 7,” name ”:“ Бари та грилі ”,“ address ”:” 24 Whiteley Street, Manchester ”,“ lat ”: 53.485118865967,“ lng ”: - 2.1828699111938,“ distance ”: 8038.7620112314}]
Я хочу отримати лише рядки з 20 милями, але це приносить всі рядки. Будь ласка, що я роблю не так
Я шукаю подібний запит, але трохи збільшився - коротше, це згрупувати всі координати в радіусі 2 милі від кожної координати, а потім порахувати, скільки координат у кожній групі, і вивести лише одну групу, яка має найбільшу кількість координат - навіть якщо у вас є більше однієї групи серед груп, які мають найбільшу кількість координат - просто виведіть випадкову групу з груп з однаковим найбільшим числом -
Велике спасибі за обмін.