
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 – екінші орынның бойлығының айнымалысы.
- $бірлік – әдепкі мән миль. Оны жаңартуға немесе жіберуге болады шақырым.
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 формуласы (Мил мен километрге түрлендірумен бірге) екі ондық таңбаға дейін дөңгелектенеді. Менің ұлым Билл Каррға, ол үшін деректер ғалымы 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 пайдалануға болады. Бұл мысалда мен MySQL жүйесіндегі MyTable жүйесінде $latitude және $longitude орналасқан орныма дейін $distance (Милмен) айнымалы мәнінен аз немесе оған тең барлық жазбаларды табу үшін сұраймын:
Белгілі бір көлемдегі барлық жазбаларды алуға арналған сұраныс қашықтық ендік пен бойлықтың екі нүктесі арасындағы мильдегі қашықтықты есептеу арқылы:
$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 серверінің географиялық қашықтығы: STDistance
Егер сіз Microsoft SQL серверін пайдалансаңыз, олар өз функцияларын ұсынады, 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);
Манаш Саху, VP және сәулетшіге арналған шляпалар Highbridge.
Бөліскеніңіз үшін көп рахмет. Бұл оңай көшірме және қою жұмысы болды және өте жақсы жұмыс істейді. Сіз мені көп уақытты үнемдедіңіз.
C-ге көшетін кез келген адам үшін:
қос градус (қос градус) {қайтару дәрежесі * (2 / 3.14159265358979323846); }
Өте жақсы орналастыру бөлігі - өте жақсы жұмыс істеді - маған кестенің атауын тек лат-long деп өзгерту керек болды. Бұл өте жылдам жұмыс істейді. Менде ұзын саны аз (<400), бірақ менің ойымша, бұл масштаб жақсы болады. Жақсы сайт - мен оны del.icio.us аккаунтына жаңадан қостым және үнемі тексеріп отырамын.
Питер мен Керриге үлкен рахмет! Егер сізге ГАЖ жобаларында жұмыс жасау ұнаса, мен сізге кеңес беремін:
Сізге көп рахмет ... 😀
Мен sql операторына қалай қоюға мысал келтіргеніңіздің арқасында мен күндіз қашықтықтағы есептеулерді іздедім және гварверсин алгоритмін таптым. Даниял, рахмет және сәлем!
Көмектескеніме қуаныштымын, досым!
Енді мен «полигонда» PHP функциясын іздеймін, ол тізбектелген ендік пен бойлық координаттарының жиымын алады және басқа нүкте көпбұрыштың ішінде немесе сыртында орналасқанын анықтайды.
Мен таптым көпбұрыштағы нүкте екенін анықтайтын теңдеу!
менің ойымша, сіздің SQL-ге мәлімдеме керек
WHERE арақашықтықтың орнына <= $ қашықтық қажет болуы мүмкін
арақашықтық = = $ қашықтықты қолданыңыз
әйтпесе маған уақыт пен энергияны үнемдегеніңіз үшін рақмет.
Сәлем, Дэвид,
Егер сіз GROUP BY операторының кез-келген түрін жасасаңыз, сізге HAVING қажет болады. Мен мұны жоғарыдағы мысалда жасамаймын.
Даг
MySQL 5.x жағдайына сәйкес, сіз WHERE тармағындағы бүркеншік аттарды пайдалана алмайсыз http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Жоғарыдағы сұраулардағы WHERE орнына HAVING қолданыңыз
Көп рақмет. Сіз өте жақсы жұмыс жасадыңыз, бұл мен қалаған нәрсе. Көп рақмет.
Осы кодты бөліскеніңіз үшін көп рахмет. Бұл менің даму уақытымды үнемдеді. Сонымен, сіздің оқырмандарыңызға MySQL 5.x үшін HAVING тұжырымдамасы қажет екенін көрсеткені үшін рахмет. Өте пайдалы.
Маған қарағанда әлдеқайда ақылды оқырмандар бар екені үшін бақыттымын!
🙂
Жоғарыдағы формула менің көп уақытымды үнемдейді. Көп рақмет.
Мен 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
рахмет,
Гарри
Мен сонымен бірге ҚАЙДА маған жұмыс істемейтінін анықтадым. Оны HAVING деп өзгертті және бәрі керемет жұмыс істейді. Алдымен мен түсініктемелерді оқымадым және оны ішкі таңдау арқылы қайта жаздым. Екеуі де жақсы жұмыс істейді.
Mysql-де жазылған сценарий үшін көп рахмет, аз ғана түзетулер енгізу керек болды (HAVING)
Грет жұмысы
Керемет пайдалы, көп рахмет! Маған «ҚАЙДА» дегеннен гөрі жаңа «HAVING» -де қиындықтар болды, бірақ мен мұндағы пікірлерді оқыдым (жарты сағат ішінде тісімді қыжылдатып = P), мен оны жақсы жұмыс істедім. Рахмет ^ _ ^
көп рахмет керемет жұмыс істейді
Ұқсас мәлімдеме өте қарқынды және сондықтан баяу болатынын ұмытпаңыз. Егер сізде көптеген сұрақтар болса, ол тез арада істі басуы мүмкін.
Есептелген қашықтықпен анықталған SQUARE алаңын қолданып, бірінші (шикі) таңдауды жүргізу өте аз қарқынды тәсіл болып табылады, яғни «ені lat1 және lat2 арасындағы ендік және lon1 мен lon2 арасындағы бойлық» кестесінен * таңдаңыз. lat1 = targetlatitude - латдиф, lat2 = targetlatitude + latdiff, лонға ұқсас. латдифф ~ = қашықтық / 111 (км үшін), немесе қашықтық / 69 ендік дәрежесінен бастап миль үшін ~ 1 км құрайды (жер аздап сопақ болғандықтан сопақ, бірақ осы мақсат үшін жеткілікті). londiff = қашықтық / (abs (cos (deg111rad (ендік)) * 2)) - немесе 111 мильге (вариацияларды ескеру үшін сіз шынымен сәл үлкен квадрат ала аласыз). Содан кейін нәтижені алыңыз және оны радиалды таңдауға жіберіңіз. Шектен тыс координаттарды есепке алуды ұмытпаңыз, яғни сіздің латифіңіздің немесе лондифтіңіздің осы диапазоннан тыс шығуы жағдайында, яғни рұқсат етілген бойлық диапазоны -69-ден +180-ге дейін және қолайлы ендік -180-ден +90-ға дейін. . Көбінесе бұл мүмкін емес екенін ескеріңіз, өйткені ол тек мұхит арқылы полюстен полюске дейінгі сызық бойынша есептеулерге әсер етеді, бірақ ол чукотканың бөлігі мен алясканың бір бөлігін қиып өтеді.
Біздің қолымыздан келетін нәтиже - сіз есептейтін нүктелер санының айтарлықтай азаюы. Егер сізде мәліметтер базасында миллионға жуық жаһандық ұпайлар біркелкі бөлінген болса және сіз 100 км қашықтықта іздегіңіз келсе, онда сіздің алғашқы (жылдам) іздеуіңіз 10000 шаршы км аумақты құрайды және шамамен 20 нәтиже береді (біркелкі таратуға негізделген) бұл шамамен 500 миллион шаршы км), демек, сіз бұл сұраныс үшін миллион рет емес, 20 рет күрделі қашықтықты есептейсіз.
Мысалдағы кішігірім қателік ... бұл біздің 50 шаршы метрдің ішінде болады (100 емес), өйткені біз өзіміздің… квадраттың “радиусын” қарастырамыз.
Керемет кеңес! Мен іс жүзінде ішкі квадратты тартатын функцияны, содан кейін периметр бойынша «квадраттар» құрған және қалған нүктелерді қосатын және шығаратын рекурсивті функцияны жазған әзірлеушімен жұмыс істедім. Нәтиже өте тез нәтиже болды - ол миллиондаған нүктелерді микросекундтарда бағалай алды.
Менің жоғарыдағы көзқарасым «шикі», бірақ қабілетті. Тағы да рахмет!
Даг,
Lat ұзын нүктесінің көпбұрыш ішінде екенін бағалау үшін 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 қашықтықты” “HAVING қашықтықпен” ауыстырыңыз.
Шарм сияқты жұмыс істейді, рахмет, Дуглас!
Бұл өте жақсы, дегенмен құстар қалай ұшады. Google maps API-ді қандай да бір жолмен енгізіп көрген дұрыс болар еді (мүмкін жолдармен және т.б.) Көліктің басқа түрін пайдаланып идея беру үшін. Мен әлі күнге дейін PHP-де саяхатшылар мәселесін шешудің тиімді әдісін ұсына алатын модельдеу күйдіру функциясын жасаған жоқпын. Бірақ менің ойымша, бұл үшін сіздің кейбір кодтарыңызды қайта қолдана аламын.
Сәлем, Дуглас,
осы мақала үшін сізге көп рахмет - сіз мені көп уақытты үнемдедіңіз.
өз-өзіңді күт,
нимрод @srael
Жақсы мақала! Екі нүкте арасындағы қашықтықты қалай есептеу керектігін сипаттайтын көптеген мақалалар таптым, бірақ мен SQL үзінділерін шынымен іздедім.
Көп рахмет жақсы жұмыс істейді
Осы формула үшін көп рахмет. Мені жеп жатқан дүкеннің орналасу жобасында біраз уақыт қырынды.
Бумаға рахмет. Бұл кішкене код сызығы дүкеннің орналасу жобасында біраз уақытты үнемдеді!
# 1054 - белгісіз баған 'қашықтық', 'қай жерде сөйлемде'
мақұлдау
Мен де! Қандай проблема бар: - /? «қашықтықты» қалай шешуге болады - Баған мәселесі? Бізге көмектесіңізші, өтінемін !! 🙂
WHERE орнына HAVING қолданып көріңіз
Менің проблемамды шешетін осы парақты табу үшін 2 күндік зерттеу. Менің WolframAlpha-ны өшіріп, математиканы тазартқан дұрыс сияқты. WHERE-ден HAVING-ге ауысу менің сценарийімнің жұмыс тәртібіне ие. РАҚМЕТ СІЗГЕ
сөйлемнің WHERE орнына:
<50 арақашықтық
Рахмет Георгий. Мен «қашықтық» бағанын таба алмадым. Бірде мен ҚАЙЫРЫМДЫ БОЛУҒА ауыстырдым, ол очарование сияқты жұмыс жасады!
Бұл менің осы жерден тапқан алғашқы бетім болғанын қалаймын. Әр түрлі командаларды қолданып көргеннен кейін, бұл дұрыс жұмыс істейтін жалғыз адам болды, ал минималды өзгертулермен менің жеке мәліметтер базасына сәйкес келуім керек болды.
Көп рақмет!
Бұл менің осы жерден тапқан алғашқы бетім болғанын қалаймын. Әр түрлі командаларды қолданып көргеннен кейін, бұл дұрыс жұмыс істейтін жалғыз адам болды, ал минималды өзгертулермен менің жеке мәліметтер базасына сәйкес келуім керек болды.
Көп рақмет!
Көп рақмет!
Көп рақмет!
Код енді көрінбейді деп ойлаймын. Мүмкін бұл firefox шығар?
Мен жай ғана Firefox пен Chrome-да сынап көрдім, ол пайда болады. Қайтадан байқап көріңіз?
Сәлем. Көп рақмет. Бұл очарование сияқты жұмыс істейді.
Дугласқа көп рахмет. Бұл өте жақсы жұмыс істейді.
Мен бұл формуланың жұмыс істейтінін білемін, бірақ мен жердің радиусы қай жерде ескерілетінін көре алмаймын. Мені біреу ағарта алады ма?
Тим, Гаверсин формуласын толық түсіндіру үшін (бұл код емес), Википедияның мақаласын қараңыз: http://en.wikipedia.org/wiki/Haversine_formula
Әдемі! Бұл маған өте көмектесті!
Дуглас керемет заттар. Екі нүктенің ұзын / ұзын / подшипнигі берілген қиылысу нүктесін алуға тырыстыңыз ба?
Мұны әлі жасамадыңыз ба, Ханх!
Дугласқа рахмет, SQL сұранысы маған керек нәрсе, сондықтан мен оны өзім жазуым керек деп ойладым. Сіз мені ендік бойын үйренудің қисық сызығынан құтқардыңыз!
Мен Errormessage: MySQL сұрауындағы 'қай жерде' белгісіз 'қашықтық' бағанын ала беремін.
Питер, басқа түсініктемелерді оқып шығыңыз. Кейбір адамдар WHERE / HAVING үшін басқа синтаксисті қолдануға мәжбүр болды.
Осы керемет мақала үшін рахмет! Тек менің ДБ-де кодты тексеріп, керемет жұмыс жасадым!
Дуглас, керемет коды үшін рахмет. Мұны қалай жасау керектігі туралы менің GPS қоғамдастық порталымда ойладым. Сіз маған сағат үнемдедіңіз.
Естіген керемет!
осы пайдалы мақаланы орналастырғаныңызға рахмет,
бірақ мен қандай да бір себептермен сұрағым келеді
mysql db ішіндегі координаттар мен пайдаланушының php-ге енгізген координаттар арасындағы қашықтықты қалай алуға болады?
нақтырақ сипаттау үшін:
1. пайдаланушыға DB және пайдаланушының координаттарынан көрсетілген деректерді таңдау үшін [id] енгізу қажет
2. php файлы мақсатты деректерді (координаттарды) [id] көмегімен алады, содан кейін пайдаланушы мен мақсатты нүкте арасындағы қашықтықты есептейді
немесе жай кодтан қашықтықты ала аласың ба?
$ qry = “ТАҢДАУ *, (((acos (sin ((.. $ ендік.” * 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` ҚАЙДА қашықтық> = “. $ Қашықтық.” >>>> осы жерден қашықтықты «шығарып» алсам бола ма?
тағы да рахмет,
Тимми С.
ешқашан қарсы емеспін, мен «функцияның» php-да қалай жұмыс істейтінін білдім
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
көп рақмет!!
жарайды, мен көргендердің бәрі жұмыс істемейді. Менің айтарым, менде не бар, бірақ қашықтық алыс.
Бұл кодтың дұрыс еместігін біреу көре ме?
егер (isset ($ _ POST ['ұсынылған'])) {$ z = $ _POST ['индекс']; $ r = $ _POST ['радиус']; echo “.” үшін нәтижелер. $ 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 mrk m, zip z1, zip z2 қайда m.zipcode = z1.zipcode AND 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 «) немесе өледі (mysql_error ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. «»; $ store = $ row ['LocAddSt']. ””; ”; $ store. = $ row ['LocAddCity']. ”,“. $ row ['LocAddState']. ” “. $ Row ['индекс']; $ width1 = $ row ['lat']; $ longitude1 = $ row ['lon']; $ width2 = $ row ['y1']; $ longitude2 = $ row ['x1']; $ city = $ row ['city']; $ state = $ row ['state']; $ dis = getnew ($ ендік1, $ бойлық1, $ ендік2, $ бойлық2, $ бірлік = 'Mi'); // $ dis = қашықтық ($ lat1, $ lon1, $ lat2, $ lon2); $ verified = $ row ['verified']; егер ($ verified == '1') {echo “”; echo “”. $ store. ””; echo $ dis. ”Миля (-лар) алыс”; жаңғырық “”; } else {echo “”. $ store. ””; echo $ dis. ”Миля (-лар) алыс”; жаңғырық “”; }}}
Менің функцияларым.php коды
getnew функциясы ($ Enlem1, $ бойлық1, $ ендік2, $ бойлық2, $ бірлік = 'Mi') {$ theta = $ бойлық1 - $ бойлық2; $ қашықтық = (sin (deg2rad ($ ендік1)) * sin (deg2rad ($ ендік2))) + (cos (deg2rad ($ ендік1)) * cos (deg2rad ($ ендік2)) * cos (deg2rad ($ тета)) ); $ қашықтық = acos ($ қашықтық); $ қашықтық = rad2deg ($ қашықтық); $ қашықтық = $ арақашықтық * 60 * 1.1515; switch ($ unit) {case 'Mi': break; іс 'Km': $ қашықтық = $ қашықтық * 1.609344; } return (дөңгелек ($ қашықтық, 2)); }
Алдын-ала рақмет
Осы мақала үшін рахмет. Менің кодыммен жақсы жұмыс істеу. 🙂
Сәлем, Дуглас, керемет мақала. Мен сізге географиялық ұғымдар мен кодтар туралы түсініктемелеріңізді өте қызықты көрдім. Менің жалғыз ұсынысым бос орынға шығару және көрсету үшін кодты шегіндіру болар еді (мысалы, Stackoverflow сияқты). Менің ойымша, сіз кеңістікті сақтағыңыз келеді, бірақ әдеттегі код аралықтары / шегіністері мен үшін бағдарламашы ретінде оқуды және бөлшектеуді жеңілдетер еді. Қалай болғанда да, бұл кішкентай нәрсе. Үлкен жұмысты жалғастырыңыз.
Рахмет! Мен жазбаны сәл өзгерттім ... бірақ теңдеулер өте көп орын алады және ұзақ болғандықтан, оның тым көп көмектесетініне сенімді емеспін.
Көп рақмет сізге.
Мұнда функцияны қолдану кезінде біз қашықтықтың бір түрін аламыз .. сұрау салу кезінде оның басқа қашықтық түрін аламыз
Мен екі күйдің арақашықтығын есептемеймін
Muchas gracias por tan tan hermoso codigo…
Бұл косинустың жақсы функциялары. Мен математиканы білмеймін, бірақ рахмет!
Тамаша жұмыс ... 🙂 (ж)
таңдау кезінде екі есе формуланы қолдану жылдамырақ көрінеді (mysql 5.9):
$ формула = “(((acos (sin ((.. $ ендік.” * 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) »;
$ sql = 'SELECT *,'. $ формула. ' '.. $ формуласы ҚАДАҒЫ кестеден арақашықтық ретінде.' <= '. $ қашықтық;
рахмет ...
егер жұмыс істемесе
«ҚАЙДА қашықтық»
егер жұмыс істейтін болса
«Қашықтық бар»
Осы мақаланың қырқылғанына көп рахмет, бұл өте пайдалы.
PHP алғашында «Жеке үй беті» деп аталатын қарапайым сценарий платформасы ретінде құрылды. Қазіргі уақытта PHP (гипермәтіндік препроцессордың қысқасы) - бұл Microsoft корпорациясының Active Server Pages (ASP) технологиясының баламасы.
PHP - бұл динамикалық веб-беттерді құру үшін қолданылатын серверге арналған ашық бастапқы тіл. Оны HTML-ге енгізуге болады. PHP әдетте Linux / UNIX веб-серверлеріндегі MySQL мәліметтер қорымен бірге қолданылады. Бұл сценарийлердің ең танымал тілі шығар.
Жоғарыда шешім дұрыс жұмыс істемейтінін таптым.
Маған өзгерту керек:
$ qqq = “ТАҢДАУ *, (((acos (sin ((.. $ ендік.” * pi () / 180)) * sin ((`latt` * pi () / 180)) + cos ((”. $ ендік. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((”. $ longitude.“ - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) қашықтықтан FR 'regist` “;
Купендраға рахмет!
рахмет мырза өте жақсы сылап жатыр .. бірақ менде бір сұрақ бар, егер мен ондық нүктесіз шығарсам, онда не істей аламын ..?
Алдын-ала рақмет.
Сәлеметсіз бе, маған бұл мәселе бойынша сіздің көмегіңіз өте қажет болады.
Мен веб-серверіме сұраныс жібердім
53.47792 = $ ендік
-2.23389 = $ бойлық
және 20 = мен алғым келетін қашықтық
Сіз формуланы қолдана отырып, ол менің db-дегі барлық жолдарды шығарады
$нәтижелері = DB::select( DB::raw(“SELECT *, (((acos(sin((".$latitude."))pi()/180)) * sin((латpi()/180))+cos((“.$ ендік.”pi()/180)) * cos((латpi()/180)) * cos(((“.$бойлық.”- lng)pi()/180))))180/pi())601.1515*1.609344) қашықтығы бар маркерлерден қашықтық ретінде >= “.$дистанция ));
[{«Id»: 1, «name»: «Frankie Johnnie & Luigo Too», «address»: «939 W El Camino Real, Mountain View, CA», «lat»: 37.386337280273, «lng»: - 122.08582305908, «Қашықтық»: 16079.294719663}, {«id»: 2, «name»: «Amici's East Coast Pizzeria», «address»: «790 Castro St, Mountain View, CA», «lat»: 37.387138366699, «lng»: -122.08323669434, «қашықтық»: 16079.175940152}, {«id»: 3, «name»: «Kapp's Pizza Bar & Grill», «address»: «191 Castro St, Mountain View, CA», «lat»: 37.393886566162, «Lng»: - 122.07891845703, «қашықтық»: 16078.381373826}, {«id»: 4, «name»: «Round Table Pizza: Mountain View», «address»: «570 N Shoreline Blvd, Mountain View, CA», «Лат»: 37.402652740479, «lng»: - 122.07935333252, «қашықтық»: 16077.420540582}, {«id»: 5, «name»: «Tony & Alba's Pizza & Pasta», «address»: «Escuela авеню, 619 View, CA «,» lat «: 37.394012451172,» lng «: - 122.09552764893,» қашықтық «: 16078.563225154}, {» id «: 6,» name «:» Oregano's Wood-Fire Pizza «,» address «:» 4546 El Camino Real, Los Altos, CA «,» lat «: 37.401725769043,» lng «: - 122.11464691162,» қашықтық «: 16077.937560795}, {» id «: 7,» name «:» Bars and grills «,» address «:» Уайтли көшесі, 24, Манчестер «,» лат «: 53.485118865967,» lng «: - 2.1828699111938,» арақашықтық «: 8038.7620112314}]
Мен 20 мильдік жолдарды алғым келеді, бірақ ол барлық жолдарды алып келеді. Өтінемін, мен не істеп жатырмын?
Мен ұқсас сұрауды іздеймін, бірақ біраз күшейе түстім - бұл әр координатадан 2 миль қашықтықта барлық координаттарды топтастыру, содан кейін әр топта қанша координат санау және координаттары бар бір топты шығару - тіпті Сізде координаттары көп топтар арасында бірнеше топ бар - кездейсоқ топты ең үлкен саны бар топтардан шығарыңыз -
Бөлісу үшін сіздерге үлкен рахмет.