
Пресметајте или побарајте големо растојание на кругот помеѓу точките на географска ширина и должина користејќи ја формулата Haversine (PHP, JavaScript, Java, Python, MySQL, MSSQL примери)
Овој месец доста програмирав PHP MySQL, за ГИС. Додека ја истражував темата, тешко ми беше да најдам некои од нив Географски пресметки да го најдам растојанието помеѓу две локации, па сакав да ги споделам овде.

Едноставен начин за пресметување на растојание помеѓу две точки е користење на Питагоровата формула за пресметување на хипотенузата на триаголник (A² + B² = C²). Ова е познато како Евклидовска оддалеченост.
Тоа е интересен почеток, но не се однесува на географијата бидејќи растојанието помеѓу линиите на географска ширина и должина се не еднакви растојанија. Како што се приближувате до екваторот, линиите на географска широчина се повеќе се одвојуваат. Ако користите едноставна равенка за триаголник, таа може точно да го мери растојанието на една локација, а погрешно на другото поради заобленоста на Земјата.
Големо растојание на кругот
Патеките поминати на долги растојанија околу Земјата се познати како растојание на Големиот круг. Тоа е… најкраткото растојание помеѓу две точки на сфера се разликува од точките на рамна карта. Комбинирајте го тоа со фактот дека линиите на географска ширина и должина не се еднакво оддалечени… и имате тешка пресметка.
Еве фантастично видео објаснување за тоа како функционираат Големите кругови.
Формулата Хаверсин
Растојанието користејќи ја закривеноста на Земјата е вградено во формулата Хаверсин, која користи тригонометрија за да овозможи закривеност на Земјата. Кога го наоѓате растојанието помеѓу 2 места на Земјата (како што лета врана), права линија е всушност лак.
Ова е применливо при воздушни летови - дали некогаш сте ја погледнале вистинската карта на летови и сте забележале дека се заоблени? Тоа е затоа што летањето во лак помеѓу две точки е пократко отколку директно до локацијата.
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 – променлива за географската ширина на вашата прва локација.
- $ Географска должина1 – променлива за должината на вашата прва локација
- $Latitude2 – променлива за географската ширина на вашата втора локација.
- $ Географска должина2 – променлива за географската должина на вашата втора локација.
- $ единица – стандардното битие милји. Ова може да се ажурира или пренесе како километри.
Јава: Пресметајте го растојанието помеѓу 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 формулата за пресметување на растојанието помеѓу две точки (заедно со конверзија Миле наспроти Километар) заокружено на две децимални места. Заслуга за мојот син, Бил Кар, научник за податоци за 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: Враќање на сите записи во опсег со пресметување на растојание во милји користејќи географска ширина и должина
Користењето на типови на просторни податоци во MySQL е поефикасен и поудобен начин за работа со географски податоци, вклучително и пресметување на растојанија помеѓу точките. MySQL поддржува Типови на просторни податоци како што се POINT
, LINESTRING
, и POLYGON
, заедно со просторните функции како ST_Distance
.
Кога го користите ST_Distance
функција во MySQL со географски податоци претставени како POINT
координати, ја зема предвид искривувањето на површината на Земјата. Сферичниот модел користен од ST_Distance
ја користи формулата Haversine. Ова приближување е погодно за повеќето практични цели, но може да внесе мали неточности за многу долги растојанија.
Еве како можете да пресметате растојанија помеѓу две точки користејќи Типови на просторни податоци:
- Направете табела со тип на просторни податоци: Прво, креирајте табела со a
POINT
колона за складирање на географски точки. На пример:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Вметнете ги вашите географски точки во оваа табела користејќи го POINT
конструктор:
INSERT INTO locations (name, coordinates)
VALUES
('Point A', POINT(40.7128, -74.0060)), -- New York City
('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
- Пресметајте го растојанието користејќи ST_Distance: Можете да го пресметате растојанието помеѓу две точки користејќи го
ST_Distance
функција. Еве пример за пребарување за пресметување на растојанието помеѓу две точки:
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Заменете 1
2
со ID на двете точки што сакате да го пресметате растојанието помеѓу.
- Резултат: Барањето ќе го врати растојанието помеѓу двете точки во милји.
Користење на типови на просторни податоци и на ST_Distance
функцијата обезбедува поефикасен и попрецизен начин за работа со географски податоци во MySQL. Исто така, го поедноставува пресметувањето на растојанијата помеѓу точките, што го олеснува управувањето и барањето на вашите податоци.
MySQL: Враќање на сите записи во опсег со пресметување на растојание во километри користејќи географска ширина и географска должина
Стандардно ST_Distance
го враќа растојанието во метри, така што едноставно треба да го ажурирате барањето за километри:
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Географско растојание на Microsoft SQL Server: STDDistance
Ако користите Microsoft SQL Server, тие нудат своја сопствена функција, STD растојание за пресметување на растојанието помеѓу две точки со помош на типот на податоци Географија.
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:
double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }
Многу убаво парче објава - работеше многу убаво - морав само да го сменам името на масата на која се наоѓа lat-long. Работи прилично брзо до.. Имам разумно мал број на lat-longs (< 400), но мислам дека ова би се размери убаво. Прекрасна страница исто така - штотуку ја додадов на мојата сметка на del.icio.us и редовно ќе проверувам.
Ви благодарам многу Питер и Кери! Ако сакате да работите на ГИС проекти, би препорачал:
Ви благодарам многу… 😀
Цел ден барав пресметки за растојание и го најдов алгоритмот harversine, благодарение на тебе што го даде примерот како да го ставиш во sql изјава. Фала и поздрав, Даниел
Мило ми е да помогнам, шини пријателе!
Сега сум во потрага по „in Polygon“ PHP функција која ќе земе низа од секвенционирани координати на географска должина и ширина и ќе открие дали друга точка е во или надвор од полигонот.
Го најдов равенка за да дознаеме дали точка во многуаголник!
Мислам дека на вашиот SQL му треба изјава за поседување.
наместо WHERE растојание <= $distance можеби ќе треба
користете HAVING растојание <= $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), сфатив дека функционира добро. Ви благодариме ^_^
благодарам многу работи одлично
Имајте на ум дека избраната изјава како таа ќе биде многу пресметковна интензивна и затоа бавна. Ако имате многу од тие прашања, може многу брзо да ги заглави работите.
Многу помалку интензивен пристап е да се изврши првиот (суров) избор со користење на КВАДРАТНА област дефинирана со пресметано растојание т.е. „избери * од името на табелата каде географската ширина помеѓу lat1 и lat2 и должината помеѓу lon1 и lon2“. lat1 = целна ширина – latdiff, lat2 = целна ширина + latdiff, слично со лон. latdiff ~= растојание / 111 (за km), или растојание/69 за милји бидејќи 1 степен на географска широчина е ~ 111 km (мала варијација бидејќи земјата е малку овална, но доволна за оваа намена). londiff = растојание / (abs(cos(deg2rad(географска ширина))*111)) - или 69 за милји (всушност можете да земете малку поголем квадрат за да ги земете предвид варијациите). Потоа земете го резултатот од тоа и внесете го во радијалниот избор. Само не заборавајте да ги земете предвид координатите надвор од границите - т.е. опсегот на прифатлива географска должина е -180 до +180 и опсегот на прифатлива географска ширина е -90 до +90 - во случај вашиот latdiff или londiff да тече надвор од овој опсег . Забележете дека во повеќето случаи ова можеби не е применливо бидејќи влијае само на пресметките преку линијата низ Тихиот океан од пол до пол, иако пресекува дел од чукотка и дел од Алјаска.
Она што го постигнуваме со ова е значително намалување на бројот на поени според кои ја правите оваа пресметка. Ако имате милион глобални точки во базата распределени приближно рамномерно и сакате да пребарувате во рок од 100 km, тогаш вашето прво (брзо) пребарување е на површина од 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, и работи, но не со него…
Заменете го „WHERE distance“ со „HAVING distance“.
Работи како шарм, благодарам, Даглас!
Ова е одлично, но е исто како што летаат птиците. Би било одлично да се обидете да го вклучите API-то на google maps на ова некако (можеби користејќи патишта итн.) Само за да дадете идеја користејќи различна форма на транспорт. Сè уште треба да направам симулирана функција за жарење во PHP која би можела да понуди ефикасно решение за проблемот со патувачкиот продавач. Но, мислам дека можеби ќе можам повторно да користам дел од вашиот код за да го сторам тоа.
Здраво Даглас,
Ви благодарам многу за оваа статија - само што ми заштедивте многу време.
чувај се,
nimrod @Израел
Добра статија! Најдов многу статии кои опишуваат како да се пресмета растојанието помеѓу две точки, но навистина го барав фрагментот SQL.
Фала многу работи добро
Ви благодарам многу за оваа формула. Избричи некое време на проект за локација на продавница што ме јадеше.
Фала пакет. Оваа мала линија код ми заштеди значително време во проект за локација на продавница!
#1054 – Непозната колона „растојание“ во „клаузула каде“
одобри
Исто и тука! Што е проблемот :-/? како да се реши „растојание“ – проблем со колона? Помогнете ни, ве молиме!! 🙂
Обидете се да користите HAVING наместо WHERE
2 дена истражување за конечно да ја најдам оваа страница што ми го решава проблемот. Изгледа дека е подобро да го отфрлам мојот WolframAlpha и да се осврнам на мојата математика. Промената од WHERE во HAVING го има моето сценарио во работна состојба. ВИ БЛАГОДАРАМ
наместо WHERE употреба на клаузула:
ИМАЊЕ на растојание < 50
Благодарам Георги. Постојано добивав колона „растојание“ не е пронајдена. Откако ќе го сменам WHERE во HAVING тоа функционираше како чаре!
Посакувам ова да беше првата страница што ја најдов на ова. Откако пробав многу различни команди, оваа беше единствената што функционираше правилно, и со минимални промени потребни за да се вклопи во мојата сопствена база на податоци.
Фала многу!
Посакувам ова да беше првата страница што ја најдов на ова. Откако пробав многу различни команди, оваа беше единствената што функционираше правилно, и со минимални промени потребни за да се вклопи во мојата сопствена база на податоци.
Фала многу!
Благодарам многу!
Благодарам многу!
Мислам дека кодот веќе не се појавува. Можеби е Firefox?
Само што тестирав и во Firefox и во Chrome и се појавува. Обиди се повторно?
Здраво. Благодарам многу. Ова функционира како шарм.
Фала многу Даглас. Ова функционира совршено.
Знам дека оваа формула функционира, но не можам да видам каде се зема предвид радиусот на земјата. Може ли некој да ме просветли, ве молам?
Тим, за целосно објаснување на формулата Haversine (тоа не е код), проверете ја статијата на Википедија: http://en.wikipedia.org/wiki/Haversine_formula
Прекрасно! Ова ми помогна неизмерно!
Одлични работи Даглас. Дали сте се обиделе да ја добиете пресечната точка со оглед на Long/Lat/Bearing од две точки?
Сè уште не сте го направиле тоа, Кан!
Ти благодарам Даглас, SQL Query е токму она што ми требаше и мислев дека ќе треба сам да го напишам. Ме спасивте од евентуални часови крива на учење на географска должина!
Постојано добивам Порака за грешка: Непозната колона „Растојание“ во „клаузулата каде“ на барањето за MySQL.
Петар, прочитај ги другите коментари. Се чини дека некои луѓе мораа да користат различна синтакса за WHERE/HAVING.
Ви благодариме за оваа одлична статија! Само што го тестирав кодот на мојот DB и работеше одлично!
Даглас, ти благодарам за овој неверојатен код. Разбирам како да го направам ова на мојот портал за заедницата GPS. Ми заштедивте часови.
Одлично е да се слушне, Еш!
благодариме што ја објавивте оваа корисна статија,
но поради некоја причина би сакал да прашам
како да се добие растојанието помеѓу координите во mysql db и координите вметнати во php од корисникот?
за појасно опишете:
1.корисникот треба да вметне [id] за избирање на одредени податоци од db и координатите на самиот корисник
2. php-датотеката ги добива целните податоци (коорди) користејќи [id] и потоа пресметајте го растојанието помеѓу корисникот и целната точка
или едноставно може да се оддалечи од кодот подолу?
$qry = „SELECT *,(((acos(sin((“.$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“. $широчина."*pi()/180)) * cos((`Широчина`*pi()/180)) * cos(((".$лонгитуда."- `Гоградина`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) како растојание ОД „Моја табела“ WHERE растојание >= „.$distance“. >>>>можам ли да го „извадам“ растојанието од овде?
благодарам уште еднаш,
Тими С
не ми е важно, сфатив како функционира „функцијата“ во php
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = „Км“)
благодарам многу!!
ок, се што пробав не работи. Мислам, тоа што го имам функционира, но далечините се далеку.
Дали некој може да види што не е во ред со овој код?
if(isset($_POST['поднесено'])){ $z = $_POST['поштенски код']; $r = $_POST['радиус']; ехо „Резултати за „.$z; $sql = mysql_query(„SELECT DISTINCT m.zipcode, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. град,z1.state FROM mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode И z2.zipcode = $z AND (3963 * acos( truncate( 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) или die (mysql_error()); while($row = mysql_fetch_array($sql)) {$store1 = $row['MktName'].""; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." „.$row['zipcode']; $latitude1 = $ред['lat']; $longitude1 = $ред['лон']; $latitude2 = $ред['y1']; $longitude2 = $ред['x1']; $city = $ред['град']; $state = $ред['состојба']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = растојание ($lat1, $lon1, $lat2, $lon2); $verified = $ред['потврдено']; if($verified == '1'){ ехо „“; ехо “”.$store.””; ехо $dis . „милја(и) подалеку“; ехо „“; } else { echo „“.$store.““; ехо $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)) ); $distance = acos($distance); $растојание = rad2deg($растојание); $distance = $distance * 60 * 1.1515; switch($unit) { case 'Mi': break; случај 'Km' : $distance = $distance * 1.609344; } враќање (круг ($растојание,2)); }
Благодарам однапред
Ви благодариме за оваа статија. Работам добро со мојот код. 🙂
Здраво Даглас, одлична статија. Навистина ми беше интересно твоето објаснување за географските поими и кодот. Мојот единствен предлог би бил да се стави празно место и да се вовлече кодот за прикажување (како Stackoverflow, на пример). Разбирам дека сакате да заштедите простор, но конвенционалното растојание / вовлекување на кодот многу би ми олеснило, како програмер, да читам и сецирам. Како и да е, тоа е мала работа. Продолжете со одличната работа.
Благодарам! Малку го изменив постот... но равенките заземаат толку многу простор и се толку долги што не сум сигурен дека премногу помага.
Ви благодарам многу.
овде додека користиме со функција добиваме еден вид растојание .. додека користиме пребарување што доаѓа неговиот друг вид на растојание
Нема да пресметам растојание помеѓу две состојби
Многу благодарност за тан хермосо кодиго…
Ова имам добри косинус функции. Не знам математика, но фала!
Одлична работа… 🙂 (y)
се чини побрзо (mysql 5.9) да се користи двапати формула при изборот и каде:
$формула = „(((acos(sin((“.$ ширина.“*pi()/180)) * sin((`Широчина`*pi()/180))+cos((“.$ ширина. ”*pi()/180)) * cos((`Широчина`*pi()/180) *180/pi())*180*60*1.1515)”;
$sql = 'SELECT *, '.$формула.' како растојание од табелата КАДЕ „..$формула.“ <= '.$distance;
благодарам
не работи ако
„КАДЕ растојание“
работи ако
„ИМАЊЕ на растојание“
Ви благодариме многу за стрижењето на овој напис. многу е корисен.
PHP најпрво беше создаден како едноставна платформа за скриптирање наречена „Лична почетна страница“. Во денешно време PHP (кратенката за Hypertext Preprocessor) е алтернатива на технологијата на Microsoft Active Server Pages (ASP) технологија.
PHP е јазик со отворен код од страна на серверот кој се користи за креирање динамични веб-страници. Може да се вметне во HTML. PHP обично се користи заедно со базата на податоци MySQL на веб-серверите на Linux/UNIX. Тоа е веројатно најпопуларниот јазик за скриптирање.
Сфатив дека решението погоре не работи правилно.
Треба да се сменам на:
$qqq = „SELECT *,(((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 = растојанието што сакам да го повлечам
Како и да е, користејќи ја формулата, ги враќа сите редови во мојата db
$results = DB::select( DB::raw(“SELECT *, ((acos(sin((“.$latitude.”pi()/180)) * sin((латpi()/180))+cos((„.$ ширина“.pi()/180)) * cos((латpi()/180)) * cos(((“.$лонгитуда.”- lng)пи ()/180))))180/pi ())601.1515*1.609344) како растојание ОД маркери HAVING растојание >= „.$distance ));
[{“id”:1,”име”:”Frankie Johnnie & Luigo Too”,”адреса”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, "distance":16079.294719663},{"id":2,"name":"Amici's East Coast Pizzeria", "адреса": "790 Castro Street, Mountain View, CA","lat":37.387138366699,"lng": -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”адреса”:”191 Castro Street, Mountain View, CA”,”lat”:37.393886566162, “lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Пица на тркалезна маса: Mountain View”,”адреса”:”570 N Shoreline Blvd, Mountain View, CA”, "lat":37.402652740479,"lng":-122.07935333252,"distance":16077.420540582},{"id":5,"име":"Tony & Alba's Pizza & Pasta","адреса на планината A619": View, CA","lat":37.394012451172,"lng":-122.09552764893,"distance":16078.563225154},{"id":6,"name":"Oregano's Wood-reed Pizza"4546",37.401725769043" Ел Камино Реал, Лос Алтос, Калифорнија","лат":122.11464691162,"lng":-16077.937560795," distance":7},{" id”:24,”име”:”Бала и скари”,”адреса”:”Улица Вајтли 53.485118865967, Манчестер”,”лат”:2.1828699111938,”lng”:-8038.7620112314,”дистанца”:XNUMX]]
Сакам да повратам само редови со 20 милји, но ги носи сите редови. Ве молам, што правам погрешно
Барам слично барање, но малку се засилив - накратко, ова е да се групираат сите координати во рок од 2 милји од секоја координата, а потоа да се брои колку координати во секоја група и да се излезе само една група која има најмногу координати - дури и ако имате повеќе од една група меѓу групите кои имаат најголем број на координати - едноставно извадете ја случајната група од групите со ист најголем број -
Ви благодарам многу за споделување.