
Kalkulahin o Query ang Great Circle Disstance sa pagitan ng Points of Latitude at Longitude Gamit ang Haversine Formula (PHP, JavaScript, Java, Python, MySQL, MSSQL Examples)
Sa buwang ito, medyo nagprograma na ako sa PHP at MySQL patungkol sa GIS. Pag-snooping sa paligid ng net, talagang nahirapan akong maghanap ng ilan sa mga Mga kalkulasyong pangheograpiya upang mahanap ang distansya sa pagitan ng dalawang lokasyon kaya nais kong ibahagi ang mga ito dito.

Ang simpleng paraan ng pagkalkula ng distansya sa pagitan ng dalawang puntos ay ang paggamit ng pormula na Pythagorean upang makalkula ang hypotenuse ng isang tatsulok (A² + B² = C²). Ito ay kilala bilang ang Ang layo ng Euclidean.
Iyan ay isang kawili-wiling simula ngunit hindi ito nalalapat sa Heograpiya dahil ang distansya sa pagitan ng mga linya ng latitude at longitude ay hindi pantay na distansya. Habang papalapit ka sa ekwador, lalong humihiwalay ang mga linya ng latitude. Kung gagamit ka ng simpleng triangulation equation, maaari nitong sukatin nang tumpak ang distansya sa isang lokasyon at mali sa isa, dahil sa curvature ng Earth.
Mahusay na Distansya ng Circle
Ang mga rutang naglakbay ng malalayong distansya sa paligid ng Earth ay kilala bilang ang Great Circle Distance. Iyon ay... ang pinakamaikling distansya sa pagitan ng dalawang punto sa isang globo ay naiiba sa mga punto sa isang patag na mapa. Pagsamahin iyon sa katotohanang ang mga linya ng latitude at longitude ay hindi pantay na distansiya... at mayroon kang mahirap na pagkalkula.
Narito ang isang kamangha-manghang paliwanag sa video kung paano gumagana ang Great Circles.
Ang Haversine Formula
Ang distansya gamit ang curvature ng Earth ay kasama sa Haversine formula, na gumagamit ng trigonometry upang payagan ang curvature ng earth. Kapag nahanap mo ang distansya sa pagitan ng 2 lugar sa mundo (habang lumilipad ang uwak), ang isang tuwid na linya ay talagang isang arko.
Naaangkop ito sa paglipad sa himpapawid – tumingin ka na ba sa aktwal na mapa ng mga flight at napansin mong naka-arko ang mga ito? Iyon ay dahil ang paglipad sa isang arko sa pagitan ng dalawang punto ay mas maikli kaysa direkta sa lokasyon.
PHP: Kalkulahin ang Distansya sa Pagitan ng 2 Mga Punto ng Latitude at Longhitud
Narito ang formula ng PHP para sa pagkalkula ng distansya sa pagitan ng dalawang punto (kasama ang conversion ng Mile vs. Kilometer) na bilugan sa dalawang decimal na lugar.
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));
}
Ang mga variable ay:
- $Latitude1 – isang variable para sa latitude ng iyong unang lokasyon.
- $Longitude1 – isang variable para sa longitude ng iyong unang lokasyon
- $Latitude2 – isang variable para sa latitude ng iyong pangalawang lokasyon.
- $Longitude2 – isang variable para sa longitude ng iyong pangalawang lokasyon.
- $unit – ang default na nilalang miles. Maaari itong i-update o ipasa bilang kilometro.
Java: Kalkulahin ang Distansya sa Pagitan ng 2 Punto ng Latitude at Longitude
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;
}
}
Ang mga variable ay:
- latitude1 – isang variable para sa latitude ng iyong unang lokasyon.
- longhitud1 – isang variable para sa longitude ng iyong unang lokasyon
- latitude2 – isang variable para sa latitude ng iyong pangalawang lokasyon.
- longhitud2 – isang variable para sa longitude ng iyong pangalawang lokasyon.
- yunit – ang default na nilalang miles. Maaari itong i-update o ipasa bilang kilometro.
Javascript: Kalkulahin ang Distansya sa Pagitan ng 2 Punto ng Latitude at Longitude
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);
}
}
Ang mga variable ay:
- latitude1 – isang variable para sa latitude ng iyong unang lokasyon.
- longhitud1 – isang variable para sa longitude ng iyong unang lokasyon
- latitude2 – isang variable para sa latitude ng iyong pangalawang lokasyon.
- longhitud2 – isang variable para sa longitude ng iyong pangalawang lokasyon.
- yunit – ang default na nilalang miles. Maaari itong i-update o ipasa bilang kilometro.
Python: Kalkulahin ang Distansya sa Pagitan ng 2 Punto ng Latitude at Longitude
Anyways, narito ang Python formula para sa pagkalkula ng distansya sa pagitan ng dalawang puntos (kasama ang Mile vs. Kilometer conversion) na bilugan sa dalawang decimal na lugar. Credit sa aking anak, Bill Karr na isang Data Scientist para sa OpenINSIGHTS, para sa code.
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)
Ang mga variable ay:
- latitude1 – isang variable para sa iyong unang lokasyon latitud.
- longhitud1 – isang variable para sa iyong unang lokasyon longitude
- latitude2 – isang variable para sa iyong pangalawang lokasyon latitud.
- longhitud2 – isang variable para sa iyong pangalawang lokasyon longitude.
- yunit – ang default na nilalang miles. Maaari itong i-update o ipasa bilang kilometro.
MySQL: Kinukuha ang Lahat ng Mga Tala sa loob ng Isang Saklaw Sa pamamagitan ng Pagkalkula ng Distansya Sa Milya Gamit ang Latitude at Longitude
Posible ring gumamit ng SQL upang kalkulahin ang lahat ng mga tala sa loob ng isang partikular na distansya. Sa halimbawang ito, itatanong ko ang MyTable sa MySQL upang mahanap ang lahat ng mga tala na mas mababa o katumbas ng variable na $distance (sa Miles) sa aking lokasyon sa $latitude at $longitude:
Ang query para sa pagkuha ng lahat ng mga talaan sa loob ng isang tukoy layo sa pamamagitan ng pagkalkula ng distansya sa mga milya sa pagitan ng dalawang puntos ng latitude at longitude ay:
$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."
Kakailanganin mong ipasadya ito:
- $ longitude - ito ay isang variable ng PHP kung saan ipinapasa ko ang longitude ng point.
- $ latitude - ito ay isang variable ng PHP kung saan ipinapasa ko ang longitude ng point.
- $ distansya - ito ang distansya na nais mong hanapin ang lahat ng mga tala na mas mababa o katumbas.
- mesa - ito ang talahanayan ... gugustuhin mong palitan iyon sa iyong pangalan ng talahanayan.
- latitud - ito ang larangan ng iyong latitude.
- longitude - ito ang larangan ng iyong longitude.
MySQL: Kinukuha ang Lahat ng Mga Tala sa loob ng Isang Saklaw Sa pamamagitan ng Pagkalkula ng Distansya Sa Kilometro Gamit ang Latitude at Longitude
At narito ang query ng SQL gamit ang mga kilometro sa 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."
Kakailanganin mong ipasadya ito:
- $ longitude - ito ay isang variable ng PHP kung saan ipinapasa ko ang longitude ng point.
- $ latitude - ito ay isang variable ng PHP kung saan ipinapasa ko ang longitude ng point.
- $ distansya - ito ang distansya na nais mong hanapin ang lahat ng mga tala na mas mababa o katumbas.
- mesa - ito ang talahanayan ... gugustuhin mong palitan iyon sa iyong pangalan ng talahanayan.
- latitud - ito ang larangan ng iyong latitude.
- longitude - ito ang larangan ng iyong longitude.
Ginamit ko ang code na ito sa isang platform ng pagmamapa ng enterprise na ginamit namin para sa isang tingiang tindahan na may higit sa 1,000 mga lokasyon sa buong Hilagang Amerika at maganda itong gumana.
Microsoft SQL Server Geographic Distansya: STDistance
Kung gumagamit ka ng Microsoft SQL Server, nag-aalok sila ng sarili nilang function, STDistance para sa pagkalkula ng distansya sa pagitan ng dalawang punto gamit ang uri ng data ng Geography.
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);
Hat tip kay Manash Sahoo, VP at Architect ng Highbridge.
Maraming salamat sa pagbabahagi. Ito ay isang madaling kopya at i-paste ang trabaho at mahusay na gumagana. Na-save mo ako ng maraming oras.
FYI para sa sinumang lumilipat sa C:
dobleng deg2rad (dobleng deg) {return deg * (3.14159265358979323846 / 180.0); }
Napakagandang piraso ng pag-post - gumana ng napakagandang - kailangan ko lamang palitan ang pangalan ng talahanayan na may hawak na lat-long. Gumagawa ito ng napakabilis sa .. Mayroon akong isang makatuwirang maliit na bilang ng mga lat-long (<400) ngunit sa palagay ko ay masusukat ito nang maayos. Magaling ding site - naidagdag ko lang ito sa aking del.icio.us account at babalik ako nang regular.
Maraming salamat kina Peter at Kerry! Kung nais mong magtrabaho sa mga proyekto ng GIS, inirerekumenda ko:
Maraming salamat ... 😀
Hinanap ko ang buong araw para sa mga kalkulasyon sa distansya at nahanap ang harversine algorithm, salamat sa iyo para sa pagbibigay ng halimbawa kung paano ito ilagay sa isang pahayag na sql. Salamat at pagbati, Daniel
Natutuwa upang makatulong, riles kaibigan!
Ngayon ay naghahanap ako ng isang function na 'sa Polygon' PHP na kukuha ng isang hanay ng mga sunud-sunod na latitude at longitude coordinate at alamin kung ang isa pang punto ay nasa loob o labas ng polygon.
Natagpuan ko ang equation upang malaman kung ang isang punto sa isang polygon!
Sa palagay ko ang iyong SQL ay nangangailangan ng pagkakaroon ng pahayag.
sa halip na SAAN ang distansya <= $ distansya na maaaring kailanganin mo
gumamit ng pagkakaroon ng distansya <= $ distansya
kung hindi man salamat sa pag-save sa akin ng isang bungkos ng oras at lakas.
Hi David,
Kung gumagawa ka ng anumang uri ng GROUP BY statement, kakailanganin mong MAYROON. Hindi ko ginagawa iyon sa halimbawa sa itaas.
Doug
Tulad ng sa MySQL 5.x, hindi ka maaaring gumamit ng isang alias sa isang KUNG SAAN sugnay makita http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Gumamit ng MAYROON sa halip na SAAN sa nasa itaas na mga querys
Maraming salamat. Nagawa mo ang mahusay na trabaho Iyon ang bagay kung ano ang talagang gusto ko. Maraming salamat.
Maraming salamat sa pagbabahagi ng code na ito. Natipid ito sa akin ng maraming oras ng pag-unlad. Gayundin, salamat sa iyong mga mambabasa sa pagturo na ang isang pagkakaroon ng pahayag ay kinakailangan para sa MySQL 5.x. Napaka matulungin
Mapalad akong magkaroon ng mga mambabasa na mas matalino kaysa sa akin!
🙂
Ang formula sa itaas ay nakakatipid sa akin ng maraming oras. Maraming salamat.
Kailangan ko ring lumipat sa pagitan ng format na NMEA at Mga Degree. Nakakita ako ng isang formula sa URL na ito sa ilalim ng pahina. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Mayroon bang nakakaalam kung paano ito i-verify?
Salamat!
Manloob
Kamusta,
Isa pang tanong. Mayroon bang isang formula para sa mga string ng NMEA tulad ng isa sa ibaba?
1342.7500, N, 10052.2287, E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Salamat,
Manloob
Nalaman ko din na SAAN hindi gumana para sa akin. Pinalitan ito sa pagkakaroon at perpektong gumagana ang lahat. Sa una ay hindi ko nabasa ang mga komento at muling isinulat ito gamit ang isang pugad na piliin. Parehong gagana ang pareho.
Maraming salamat sa m script para sa script na nakasulat sa MySQL, kailangan lamang gumawa ng ilang mga menor de edad na pagsasaayos (pagkakaroon) 🙂
Gret trabaho
Hindi kapani-paniwala na kapaki-pakinabang, maraming salamat! Nagkaroon ako ng ilang mga problema sa bagong "MAYROON", sa halip na "SAAN", ngunit nang mabasa ko ang mga komento dito (pagkatapos ng halos kalahating oras na paggiling ng aking ngipin sa pagkabigo = P), nakuha ko itong gumana nang maayos. Salamat ^ _ ^
salamat maraming gumagana mahusay
Tandaan na ang isang piling pahayag na tulad nito ay magiging sobrang computationally at samakatuwid ay mabagal. Kung mayroon kang maraming mga query, maaari nitong mabulok nang mabilis ang mga bagay.
Ang isang hindi gaanong masidhing diskarte ay upang magpatakbo ng isang unang (krudo) pumili gamit ang isang lugar ng SQUARE na tinukoy ng isang kinakalkula na distansya ie "pumili * mula sa tablename kung saan ang latitude sa pagitan ng lat1 at lat2 at longitude sa pagitan ng lon1 at lon2". lat1 = targetlatitude - latdiff, lat2 = targetlatitude + latdiff, katulad ng lon. latdiff ~ = distansya / 111 (para sa km), o distansya / 69 para sa mga milya mula noong 1 degree ng latitude ay ~ 111 km (bahagyang pagkakaiba-iba dahil ang lupa ay bahagyang bilog, ngunit sapat para sa hangaring ito). londiff = distansya / (abs (cos (deg2rad (latitude)) * 111)) - o 69 para sa mga milya (maaari kang kumuha ng isang bahagyang mas malaking parisukat upang maituring ang mga pagkakaiba-iba). Pagkatapos kunin ang resulta niyan at pakainin ito sa radial select. Huwag kalimutan na account para sa labas ng mga hangganan koordinasyon - ibig sabihin ang saklaw ng katanggap-tanggap na longitude ay -180 hanggang +180 at ang saklaw ng katanggap-tanggap na latitude ay -90 hanggang +90 - kung sakaling tumakbo ang iyong latdiff o londiff sa labas ng saklaw na ito . Tandaan na sa karamihan ng mga kaso maaaring hindi ito naaangkop dahil nakakaapekto lamang ito sa mga kalkulasyon sa isang linya sa pamamagitan ng pasipiko na karagatan mula sa poste patungo sa poste, bagaman sumalubong ito sa bahagi ng chukotka at bahagi ng alaska.
Ang nagawa namin sa pamamagitan nito ay isang makabuluhang pagbawas sa bilang ng mga puntos laban sa kung saan mo ginawa ang pagkalkula na ito. Kung mayroon kang isang milyong pandaigdigang mga puntos sa database na ibinahagi nang pantay-pantay at nais mong maghanap sa loob ng 100 km, kung gayon ang iyong unang (mabilis) na paghahanap ay isang lugar na 10000 sq km at marahil ay magbubunga ng 20 mga resulta (batay sa pamamahagi sa isang ibabaw na lugar ng halos 500M sq km), na nangangahulugang patakbuhin mo ang kumplikadong pagkalkula ng distansya ng 20 beses para sa query na ito sa halip na isang milyong beses.
Maliit na pagkakamali sa halimbawa ... na para sa loob ng 50 km (hindi 100) dahil tinitingnan namin ang "radius" ng aming… parisukat.
Kamangha-manghang payo! Talagang nagtrabaho ako sa isang developer na nagsulat ng isang pagpapaandar na hinila ang loob ng parisukat at pagkatapos ay isang recursive function na gumawa ng 'mga parisukat' sa paligid ng perimeter upang isama at ibukod ang natitirang mga puntos. Ang resulta ay isang hindi kapani-paniwalang mabilis na resulta - maaari niyang suriin ang milyun-milyong mga puntos sa microseconds.
Ang aking diskarte sa itaas ay tiyak na 'krudo' ngunit may kakayahang. Salamat ulit!
doug,
Sinusubukan kong gumamit ng MySQL at php upang suriin kung ang isang lat long point ay nasa loob ng isang polygon. Alam mo ba kung ang iyong kaibigan sa developer ay nag-publish ng anumang mga halimbawa sa kung paano makamit ang gawaing ito. O may alam ka bang mabuting halimbawa. Salamat nang maaga
Kumusta ang lahat ng ito ang aking pagsubok SQL pahayag:
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
at sinasabi sa akin ni Mysql ang distansya na iyon, ay hindi umiiral bilang isang haligi, maaari kong gamitin ang order sa pamamagitan ng, magagawa ko ito nang hindi SAAN, at ito ay gumagana, ngunit hindi kasama nito ...
Palitan ang "WHERE distansya" ng "pagkakaroon ng distansya".
Gumagana tulad ng isang alindog, salamat, Douglas!
Magaling ito, subalit ito ay tulad ng paglipad ng mga ibon. Mahusay na subukan at isama ang google maps API sa ito kahit papaano (maaaring gumagamit ng mga kalsada atbp.) Upang makapagbigay ng ideya gamit ang ibang paraan ng transportasyon. Hindi pa rin ako makakagawa ng isang simulate na pagpapaandar ng pagsusubo sa PHP na maaaring mag-alok ng isang mahusay na solusyon sa problema sa naglalakbay na salesman. Ngunit sa palagay ko maaari kong magamit muli ang ilan sa iyong code upang magawa ito.
Kumusta Douglas,
maraming salamat sa artikulong ito - nai-save mo lang ako ng maraming oras.
ingat,
nimrod @Israel
Magandang artikulo! Natagpuan ko ang maraming mga artikulo na naglalarawan kung paano makalkula ang distansya sa pagitan ng dalawang puntos ngunit talagang hinahanap ko ang SQL snippet.
Maraming salamat sa iyo
Maraming salamat sa pormulang ito. Nag-ahit ito ng kaunting oras sa isang proyekto ng lokasyon ng tindahan na kumakain sa akin.
Salamat sa isang bundle. Ang maliit na linya ng code na ito ay nai-save sa akin ng kaunting oras sa isang proyekto ng lokasyon ng tindahan!
# 1054 - Hindi kilalang haligi 'distansya' sa 'kung saan sugnay'
aprubahan
Parehas dito! Ano ang problema :-/? kung paano malutas ang "distansya" - problema sa Column? Tulungan mo kami, mangyaring !! 🙂
Subukang gamitin ang MAYROON sa halip na SAAN
2 araw ng pagsasaliksik upang sa wakas mahanap ang pahinang ito na malulutas ang aking problema. Mukhang mas mahusay kong mabasura ang aking WolframAlpha at magsipilyo sa aking matematika. Ang pagbabago mula saANAN sa MAYROON ay ang aking script sa pagkakasunud-sunod. SALAMAT
sa halip na SAAN gamitin ang sugnay:
MAY distansya <50
Salamat Georgi. Patuloy akong nakakuha ng hindi nahanap na halayo 'distansya'. Kapag binago ko na ang SAAN SA MAYUNIT gumana ito tulad ng isang alindog!
Nais kong ito ang unang pahina na nakita ko dito. Matapos subukan ang maraming iba't ibang mga utos na ito lamang ang gagana nang maayos, at may kaunting mga pagbabago na kinakailangan upang magkasya sa aking sariling database.
Salamat ng marami!
Nais kong ito ang unang pahina na nakita ko dito. Matapos subukan ang maraming iba't ibang mga utos na ito lamang ang gagana nang maayos, at may kaunting mga pagbabago na kinakailangan upang magkasya sa aking sariling database.
Salamat ng marami!
Maraming salamat!
Maraming salamat!
Sa palagay ko hindi na nagpapakita ang code. Baka firefox yun?
Sinubukan ko lang pareho sa Firefox at Chrome at lilitaw ito. Subukan ulit?
Hi Maraming salamat. Gumagana ito tulad ng isang alindog.
Maraming salamat Douglas. Ito ay gumagana nang perpekto.
Alam kong gumagana ang formula na ito, ngunit hindi ko makita kung saan isinasaalang-alang ang radius ng mundo. Maaari bang may isang nagpapaliwanag sa akin, mangyaring?
Tim, para sa isang buong paliwanag ng Haversine formula (hindi iyon code), tingnan ang artikulo ng Wikipedia: http://en.wikipedia.org/wiki/Haversine_formula
Maganda! Napakalaking tulong nito sa akin!
Mahusay na bagay Douglas. Nasubukan mo na bang makuha ang intersection point na binigyan ng Long / Lat / Bearing ng dalawang puntos?
Hindi ko pa nagagawa iyon, Khanh!
Salamat Douglas, ang SQL Query ay eksaktong kailangan ko, at naisip kong isulat ko ito mismo. Na-save mo ako mula sa posibleng mga oras ng latitude curve ng pag-aaral ng longitude!
Patuloy akong nakakakuha ng Errormessage: Hindi kilalang haligi 'Distansya' sa 'kung saan sugnay' sa MySQL Query.
Peter, mangyaring basahin ang iba pang mga komento. Lumilitaw na ang ilang mga tao ay kailangang gumamit ng ibang syntax para SAAN / MAYROON.
Salamat sa mahusay na artikulong ito! Sinubukan lamang ang code sa aking DB at nagtrabaho nang mahusay!
Douglas, salamat sa kamangha-manghang code na ito. Na-crack ang aking ulo sa kung paano ito gawin sa aking portal ng komunidad sa GPS. Nai-save mo ako ng mga oras.
Mahusay pakinggan, Ash!
salamat sa pag-post ng kapaki-pakinabang na artikulong ito,
ngunit sa ilang kadahilanan nais kong magtanong
kung paano makuha ang distansya sa pagitan ng mga coord sa loob ng MySQL db at coords na ipinasok sa php ng gumagamit?
para sa mas malinaw na ilarawan:
Ang 1.user ay kailangang magsingit ng [id] para sa pagpili ng tinukoy na data mula sa db at mga coord mismo ng gumagamit
2. makuha ng php file ang target na data (coords) gamit ang [id] at pagkatapos ay kalkulahin ang distansya sa pagitan ng user at target point
o maaari lamang makakuha ng distansya mula sa code sa ibaba?
$ qry = “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) bilang distansya MULA sa `MyTable` WHERE distansya> =". $ Distansya. " >>>> Maaari ko bang "ilabas" ang distansya mula dito?
Salamat ulit,
Timmy S
bale, naisip ko kung paano gumagana ang "pagpapaandar" sa php
$ dis = getDistanceBet AntaraPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
maraming salamat!!
ok, lahat ng sinubukan ko ay hindi gumagana. Ibig kong sabihin, kung ano ang mayroon akong mga gawa, ngunit ang mga distansya ay malayo.
Maaari bang may makakita ng kung ano ang mali sa code na ito?
kung (mag-isyu ($ _ POST ['isinumite'])) {$ z = $ _POST ['zipcode']; $ r = $ _POST ['radius']; echo "Mga resulta para sa". $ z; $ sql = mysql_query ("SELECT DISTINCT m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m. napatunayan, z1.lat, z2.lon, z1. lungsod, z1.state MULA sa mrk m, zip z1, zip z2 SAAN m.zipcode = z1.zipcode AT z2.zipcode = $ z AT (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 ") o mamatay (mysql_error ()); habang ($ 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']; $ longitude2 = $ row ['x1']; $ city = $ row ['city']; $ state = $ row ['state']; $ dis = getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi'); // $ dis = distansya ($ lat1, $ lon1, $ lat2, $ lon2); $ verified = $ row ['verified']; kung ($ verified == '1') {echo “”; echo "". $ store. ""; echo $ dis. " milya ang layo"; echo ""; } iba pa {echo “”. $ store. ””; echo $ dis. " milya ang layo"; echo ""; }}}
ang aking mga function.php code
function getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2; $ distansya = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ); $ distansya = acos ($ distansya); $ distansya = rad2deg ($ distansya); $ distansya = $ distansya * 60 * 1.1515; switch ($ unit) {case 'Mi': masira; case 'Km': $ distansya = $ distansya * 1.609344; } pagbalik (bilog ($ distansya, 2)); }
Salamat sa advance
Salamat sa artikulong ito. Nagtatrabaho ng mabuti sa aking code. 🙂
Hoy Douglas, mahusay na artikulo. Natagpuan ko ang iyong paliwanag ng mga heograpikong konsepto at ang code na talagang kawili-wili. Ang aking mungkahi lamang ay ang puwang at indent ang code para sa pagpapakita (tulad ng Stackoverflow, halimbawa). Naiintindihan ko na nais mong makatipid ng espasyo, ngunit ang maginoo na spacing ng code / indentation ay gagawing mas madali para sa akin, bilang isang programmer, na basahin at ihiwalay. Gayunpaman, ito ay isang maliit na bagay. Ipagpatuloy ang mahusay na gawain.
Salamat! Binago ko nang kaunti ang post ... ngunit ang mga equation ay tumatagal ng maraming silid at napakahaba na hindi ako sigurado na masyadong makakatulong ito.
Maraming salamat.
dito habang ginagamit gamit ang pag-andar nakakakuha kami ng isang uri ng distansya..samantalang ginagamit ang query sa darating na iba pang uri ng distansya
Hindi ko kinakalkula ang distansya sa pagitan ng dalawang estado
Manyas gracias por tan hermoso codigo…
Ito ay mahusay na paggana ng cosinus. Hindi ko alam ang matematika, ngunit salamat!
Mahusay na Trabaho ... 🙂 (y)
tila mas mabilis (MySQL 5.9) na gumamit ng dalawang beses ang pormula sa piliin at kung saan:
$ formula = “(((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) ”;
$ sql = 'SELECT *,'. $ formula. ' bilang distansya MULA sa talahanayan KUNG SAAN '.. $ formula.' <= '. $ distansya;
salamat ...
hindi gumagana kung
"SAAN ang distansya"
nagtatrabaho kung
"MAY pagkakaroon ng distansya"
Maraming salamat sa pagggupit ng artikulong ito. Napakatulong nito.
Ang PHP ay nilikha noong una bilang isang simpleng platform ng scripting na tinatawag na "Personal na Home Page". Ngayon ang PHP (ang maikli para sa Hypertext Preprocessor) ay isang kahalili ng teknolohiyang Aktibo ng Mga Server ng Microsoft (ASP) na teknolohiya.
Ang PHP ay isang bukas na mapagkukunang wika ng panig ng server na ginagamit para sa paglikha ng mga pabuong web page. Maaari itong mai-embed sa HTML. Karaniwang ginagamit ang PHP kasabay ng isang MySQL database sa mga web server ng Linux / UNIX. Marahil ito ang pinakatanyag na wika ng pag-script.
Natagpuan ko ang solusyon sa itaas na hindi gumagana nang maayos.
Kailangan kong baguhin sa:
$ qqq = "SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((". $ latitude. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos ((("$ longitude." - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) bilang distansya MULA sa `register`“;
Salamat Kupendra!
salamat sir wroking perpekto .. ngunit mayroon akong isang katanungan kung nais kong output nang walang decimal point kung ano ano ang maaari kong gawin ..?
Salamat nang maaga.
Kumusta, mangyaring kakailanganin ko ang iyong tulong dito.
Nag-request ako ng get sa aking web-server http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $ latitude
-2.23389 = $ longitude
at 20 = ang distansya na nais kong kunin
Gayunpaman gamit ang pormula sa iyo, kinukuha nito ang lahat ng mga hilera sa aking db
$ mga resulta = DB :: pumili (DB :: raw ("SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((lat * pi () / 180 )) + cos ((". $ latitude." * pi () / 180)) * cos ((lat * pi () / 180)) * cos (((". $ longitude." - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) bilang distansya MULA sa mga marker MAY distansya> = “. $ Distansya));
[{“Id”: 1, ”name”: ”Frankie Johnnie & Luigo too”, ”address”: ”939 W El Camino Real, Mountain View, CA”, ”lat”: 37.386337280273, ”lng”: - 122.08582305908, ”Distansya”: 16079.294719663}, {“id”: 2, ”pangalan”: ”Amici's East Coast Pizzeria”, ”address”: ”790 Castro St, Mountain View, CA”, ”lat”: 37.387138366699, ”lng”: -122.08323669434, ”distansya”: 16079.175940152}, {“id”: 3, ”pangalan”: ”Kapp's Pizza Bar & Grill”, ”address”: ”191 Castro St, Mountain View, CA”, ”lat”: 37.393886566162, ”Lng”: - 122.07891845703, ”distansya”: 16078.381373826}, {“id”: 4, ”pangalan”: ”Round Table Pizza: Mountain View”, ”address”: ”570 N Shoreline Blvd, Mountain View, CA”, ”Lat”: 37.402652740479, ”lng”: - 122.07935333252, ”distansya”: 16077.420540582}, {“id”: 5, ”pangalan”: ”Tony & Alba's Pizza & Pasta”, ”address”: ”619 Escuela Ave, Mountain Tingnan, CA ”,” lat ”: 37.394012451172,” lng ”: - 122.09552764893,” distansya ”: 16078.563225154}, {“ id ”: 6,” pangalan ”:” Oregano's Wood-Fired Pizza ”,” address ”:” 4546 El Camino Real, Los Altos, CA ”,” lat ”: 37.401725769043,” lng ”: - 122.11464691162,” distansya ”: 16077.937560795}, {“ id ”: 7,” name ”:” The bar and grills ”,” address ”:” 24 Whiteley Street, Manchester ”,” lat ”: 53.485118865967,” lng ”: - 2.1828699111938,” distansya ”: 8038.7620112314}]
Nais kong kunin ang mga hilera lamang na may 20 milya ngunit dinadala nito ang lahat ng mga hilera. Mangyaring ano ang mali kong ginagawa
Naghahanap ako para sa isang katulad na query ngunit medyo tumaas - sa maikling salita ay upang i-grupo ang lahat ng mga coordinate sa loob ng 2 milya ng bawat coordinate at pagkatapos ay bilangin kung gaano karaming mga coordinate sa bawat pangkat at maglabas lamang ng isang pangkat na may pinakamaraming mga coordinate - kahit na mayroon kang higit sa isang pangkat sa mga pangkat na mayroong pinakamaraming bilang ng mga coordinate - i-output lang ang random na pangkat mula sa mga pangkat na may parehong pinakamalaking bilang -
Maraming salamat sa pagbabahagi.