
Kalkile oswa rechèch Distans gwo sèk ant pwen latitid ak longè ak fòmil Havesine (PHP, JavaScript, Java, Python, MySQL, MSSQL Egzanp)
Mwa sa a mwen te pwogramasyon byen yon ti jan nan PHP ak miskl ki gen rapò ak GIS. Snooping alantou nèt la, mwen aktyèlman te gen yon tan difisil jwenn kèk nan la Kalkil jewografik jwenn distans ki genyen ant de kote Se konsa, mwen te vle pataje yo isit la.

Fason senp pou kalkile yon distans ant de pwen se lè l sèvi avèk fòmil pitagorik pou kalkile ipotenuz yon triyang (A² + B² = C²). Sa a se ke yo rekonèt kòm la Distans eklidyen.
Sa se yon kòmansman enteresan men li pa aplike avèk Jewografi depi distans ant liy latitid ak lonjitid yo pa egal distans apa. Kòm ou vin pi pre ekwatè a, liy latitid vin pi lwen apa. Si ou itilize kèk kalite ekwasyon triyangilasyon senp, li ka mezire distans avèk presizyon nan yon sèl kote ak fò anpil mal nan lòt la, paske nan deviation a sou Latè a.
Gran distans sèk
Wout yo ke yo vwayaje long distans alantou Latè a yo konnen kòm Gran distans sèk. Sa vle di... distans ki pi kout ant de pwen sou yon esfè diferan de pwen yo sou yon kat jeyografik plat. Konbine sa ak lefèt ke liy latitid ak lonjitid yo pa ekidistan... epi ou gen yon kalkil difisil.
Isit la nan yon eksplikasyon videyo kokenn sou ki jan Gran sèk travay.
Fòmil la Haversine
Distans lè l sèvi avèk koube Latè a enkòpore nan la Fòmil Haversine, ki itilize trigonometri pou pèmèt koub tè a. Lè w ap jwenn distans ki genyen ant 2 kote sou latè (tankou kòk la vole), yon liy dwat se reyèlman yon ark.
Sa a se aplikab nan vòl lè - ou te janm gade kat jeyografik aktyèl la nan vòl ak remake yo vout? Se paske li pi kout vole nan yon vout ant de pwen pase dirèkteman nan kote a.
PHP: Kalkile Distans Ant 2 Pwen Latitid ak Lonjitid
Men fòmil PHP pou kalkile distans ant de pwen (ansanm ak konvèsyon Mile vs Kilomèt) awondi ak de kote desimal.
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));
}
Varyab yo se:
- $Latitid1 – yon varyab pou latitid premye kote ou a.
- $ Longitude1 – yon varyab pou lonjitid premye kote ou a
- $Latitid2 – yon varyab pou dezyèm latitid kote w ye a.
- $ Longitude2 – yon varyab pou lonjitid dezyèm kote ou a.
- $inite - default ke yo te mil. Sa a ka mete ajou oswa pase kòm kilomèt.
Java: Kalkile Distans Ant 2 Pwen Latitid ak Lonjitid
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;
}
}
Varyab yo se:
- latitid1 – yon varyab pou latitid premye kote ou a.
- lonjitid 1 – yon varyab pou lonjitid premye kote ou a
- latitid2 – yon varyab pou dezyèm latitid kote w ye a.
- lonjitid 2 – yon varyab pou lonjitid dezyèm kote ou a.
- inite - default ke yo te mil. Sa a ka mete ajou oswa pase kòm kilomèt.
Javascript: Kalkile Distans Ant 2 Pwen Latitid ak Lonjitid
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);
}
}
Varyab yo se:
- latitid1 – yon varyab pou latitid premye kote ou a.
- lonjitid 1 – yon varyab pou lonjitid premye kote ou a
- latitid2 – yon varyab pou dezyèm latitid kote w ye a.
- lonjitid 2 – yon varyab pou lonjitid dezyèm kote ou a.
- inite - default ke yo te mil. Sa a ka mete ajou oswa pase kòm kilomèt.
Python: Kalkile Distans Ant 2 Pwen Latitid ak Lonjitid
De tout fason, isit la se fòmil Python pou kalkile distans ant de pwen (ansanm ak konvèsyon Mile vs Kilomèt) awondi a de kote desimal. Kredi pou pitit gason m nan, Bill Karr ki se yon syantifik done pou OpenINSIGHTS, pou kòd la.
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)
Varyab yo se:
- latitid1 – yon varyab pou premye kote ou a latitid.
- lonjitid 1 – yon varyab pou premye kote ou a lonjitid
- latitid2 – yon varyab pou dezyèm kote ou a latitid.
- lonjitid 2 – yon varyab pou dezyèm kote ou a lonjitid.
- inite - default ke yo te mil. Sa a ka mete ajou oswa pase kòm kilomèt.
MySQL: Rekipere tout dosye ki nan yon seri lè w kalkile distans an mil ak latitid ak longè
Li posib tou pou itilize SQL pou fè yon kalkil pou jwenn tout dosye nan yon distans espesifik. Nan egzanp sa a, mwen pral mande MyTable nan MySQL pou jwenn tout dosye ki gen mwens pase oswa egal a varyab $ distans (an Kilomèt) kote mwen ye a $ latitid ak $ lonjitid:
Rekèt la pou rekipere tout dosye yo nan yon espesifik distans pa kalkile distans an mil ant de pwen latitid ak lonjitid yo se:
$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."
Ou pral bezwen Customize sa a:
- $ lonjitid - sa a se yon varyab PHP kote mwen pase lonjitid la nan pwen an.
- $ latitid - sa a se yon varyab PHP kote mwen pase lonjitid la nan pwen an.
- $ distans - sa a se distans la ke ou ta renmen jwenn tout dosye yo mwens oswa egal a.
- tab - sa a se tab la ... ou pral vle ranplase sa ak non tab ou.
- latitid - sa a se jaden latitid ou.
- lonjitid - sa a se jaden longitid ou.
MySQL: Rekipere tout dosye ki nan yon seri lè w kalkile distans an kilomèt ak latitid ak longè
Ak isit la nan rechèch la SQL lè l sèvi avèk kilomèt nan miskl:
$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."
Ou pral bezwen Customize sa a:
- $ lonjitid - sa a se yon varyab PHP kote mwen pase lonjitid la nan pwen an.
- $ latitid - sa a se yon varyab PHP kote mwen pase lonjitid la nan pwen an.
- $ distans - sa a se distans la ke ou ta renmen jwenn tout dosye yo mwens oswa egal a.
- tab - sa a se tab la ... ou pral vle ranplase sa ak non tab ou.
- latitid - sa a se jaden latitid ou.
- lonjitid - sa a se jaden longitid ou.
Mwen itilize kòd sa a nan yon platfòm kat antrepriz ke nou itilize pou yon magazen an detay ak plis pase 1,000 kote atravè Amerik di Nò e li te travay trè byen.
Microsoft SQL Server Jeyografik Distans: STDistance
Si w ap itilize Microsoft SQL sèvè, yo ofri pwòp fonksyon yo, STDistans pou kalkile distans ki genyen ant de pwen lè l sèvi avèk kalite done Jeyografi.
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);
Chapo pwent pou Manash Sahoo, VP ak Achitek nan Highbridge.
Mèsi anpil pou pataje. Sa a se te yon travay kopye ak kole fasil epi li travay byen. Ou te sove m anpil tan.
FYI pou nenpòt moun ki pote sou C:
doub deg2rad (double deg) { return deg * (3.14159265358979323846/180.0); }
Trè bèl moso nan afiche - te travay trè bèl - mwen sèlman te oblije chanje non an nan tab la kenbe lat-long la. Li travay trè vit pou .. Mwen gen yon ti kantite lat-longs (< 400) men mwen panse ke sa a ta byen echèl. Bèl sit tou - mwen jis ajoute li nan kont del.icio.us mwen epi mwen pral tcheke tounen regilyèman.
Mèsi anpil Peter ak Kerry! Si ou renmen travay sou pwojè GIS, mwen ta rekòmande:
Mèsi anpil... 😀
Mwen te chèche tout jounen an pou kalkil distans epi mwen te jwenn algorithm harversine a, gras a ou paske w te bay egzanp sou kòman yo mete l nan yon deklarasyon sql. Mèsi ak bonjou, Daniel
M kontan ede w, zanmi rails!
Koulye a, mwen se nan rechèch nan yon 'nan poligòn' fonksyon PHP ki pral pran yon etalaj de kowòdone latitid ak lonjitid sekans ak konnen si yon lòt pwen se nan oswa deyò nan poligòn nan.
Mwen jwenn la ekwasyon pou konnen si yon pwen nan yon poligòn!
Mwen panse ke SQL ou bezwen yon deklarasyon ki gen.
olye de WHERE distans <= $distans ou ta ka bezwen
itilize HAVING distans <= $distans
otreman mèsi pou ekonomize m 'yon pakèt tan ak enèji.
Hi David,
Si w ap fè nenpòt kalite deklarasyon GROUP BY, w ap bezwen HAVING. Mwen pa fè sa nan egzanp ki anwo a.
Doug
Kòm nan MySQL 5.x, ou pa ka itilize yon alyas sou yon kloz WHERE wè http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Sèvi ak HAVING olye de WHERE nan demann ki anwo yo
Mèsi anpil. Ou te fè yon gwo travay Se sa mwen vle aktyèlman. Mèsi anpil.
Mèsi anpil pou pataje kòd sa a. Li te sove m 'anpil tan devlopman. Epitou, gras a lektè ou yo pou fè remake ke yon deklarasyon HAVING nesesè pou MySQL 5.x. Trè itil.
Mwen beni pou gen lektè ki pi entelijan pase mwen!
🙂
Fòmil ki anwo a ap ekonomize m anpil tan. Mèsi anpil.
Mwen gen tou chanje ant fòma NMEA ak Degre. Mwen jwenn yon fòmil nan URL sa a anba paj la. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Èske yon moun konnen kijan pou verifye sa?
Mèsi!
Harry
Hello,
Yon lòt kesyon. Èske gen yon fòmil pou strings NMEA tankou sa ki anba a?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Mèsi,
Harry
Mwen te jwenn tou ke KOTE pa t travay pou mwen. Chanje li an GEN ak tout bagay ap travay pafè. Okòmansman, mwen pa t 'li kòmantè yo ak reekri li lè l sèvi avèk yon seleksyon enbrike. Tou de pral travay jis byen.
Mèsi anpil pou script ki ekri nan mysql, jis te oblije fè kèk ti ajisteman (HAVING) 🙂
Gran travay
Ekstrèmman itil, mèsi anpil! Mwen te gen kèk pwoblèm ak nouvo "HAVING la", olye ke "KOTE", men yon fwa mwen li kòmantè yo isit la (apre yon demi èdtan nan fanm k'ap pile dan mwen nan fristrasyon =P), mwen te jwenn li travay joliman. Mèsi ^_^
mèsi anpil travay anpil
Kenbe nan tèt ou ke yon deklarasyon chwazi tankou sa a pral trè entans enfòmatik epi kidonk ralanti. Si ou gen anpil nan demann sa yo, li ka boure bagay yo byen vit.
Yon apwòch mwens entans se fè yon premye seleksyon (brit) lè l sèvi avèk yon zòn KARE defini pa yon distans kalkile sa vle di "select * soti nan tablename kote latitid ant lat1 ak lat2 ak lonjitid ant lon1 ak lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, menm jan ak lon. latdiff ~= distans / 111 (pou km), oswa distans / 69 pou mil depi 1 degre latitid se ~ 111 km (tijè varyasyon depi tè a se yon ti kras oval, men ase pou objektif sa a). londiff = distans / (abs (cos (deg2rad (latitid)) * 111)) - oswa 69 pou mil (ou ka aktyèlman pran yon kare yon ti kras pi gwo yo nan lòd yo konte pou varyasyon). Lè sa a, pran rezilta a ak manje li nan seleksyon radial la. Jis pa bliye konte pou kowòdone andeyò limit yo - sa vle di ranje lonjitid akseptab se -180 a +180 ak ranje latitid akseptab se -90 a +90 - nan ka latdiff oswa londiff ou a kouri andeyò ranje sa a. . Remake byen ke nan pifò ka sa a ka pa aplikab paske li sèlman afekte kalkil sou yon liy atravè oseyan Pasifik la soti nan poto nan poto, menm si li kwaze yon pati nan chukotka ak yon pati nan Alaska.
Ki sa ki nou akonpli pa sa a se yon rediksyon enpòtan nan kantite pwen kont ki ou fè kalkil sa a. Si ou gen yon milyon pwen mondyal nan baz done a distribye apeprè egalman epi ou vle fè rechèch nan yon distans 100 km, Lè sa a, premye rechèch (vit) ou a se nan yon zòn 10000 km sq epi li pral pwobableman bay apeprè 20 rezilta (ki baze sou distribisyon menm sou yon sifas apeprè 500M sq km), ki vle di ke ou kouri kalkil distans konplèks la 20 fwa pou rechèch sa a olye pou yo yon milyon fwa.
Ti erè nan egzanp lan... sa ta dwe nan 50 km (pa 100) depi n ap gade "reyon" kare nou an.
Kokenn konsèy! Mwen aktyèlman te travay ak yon pwomotè ki te ekri yon fonksyon ki rale kare anndan an ak Lè sa a, yon fonksyon recursive ki te fè 'kare' alantou perimèt la enkli ak eskli pwen ki rete yo. Rezilta a se te yon rezilta ekstrèmman rapid - li te kapab evalye dè milyon de pwen nan mikrosgond.
Apwòch mwen an pi wo a se definitivman 'brit' men ki kapab. Mesi anko!
Doug,
Mwen te eseye sèvi ak mysql ak php pou evalye si yon pwen lat long nan yon poligòn. Èske w konnen si zanmi pwomotè w la pibliye kèk egzanp sou fason pou w akonpli travay sa a. Oswa èske w konnen nenpòt bon egzanp. Mèsi davans.
Bonjou tout moun sa a se deklarasyon SQL tès mwen an:
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
ak Mysql ap di m 'ke distans, pa egziste kòm yon kolòn, mwen ka itilize lòd pa, mwen ka fè li san KOTE, epi li travay, men se pa ak li ...
Ranplase "KOTE distans" ak "HAVING distans".
Travay tankou yon cham, mèsi, Douglas!
Sa a se gwo, sepandan li se menm jan zwazo yo vole. Li ta bon pou eseye ak enkòpore Google Maps API sa a yon jan kanmenm (petèt lè l sèvi avèk wout elatriye) Jis bay yon lide lè l sèvi avèk yon fòm diferan nan transpò. Mwen toujou poko fè yon fonksyon annealing simulation nan PHP ki ta kapab ofri yon solisyon efikas nan pwoblèm nan vandè vwayaje. Men, mwen panse ke mwen ka kapab reitilize kèk nan kòd ou a pou fè sa.
Bonjou Douglas,
Mèsi anpil pou atik sa a - ou jis sove m 'anpil tan.
pran swen,
nimrod @Izrayèl
Bon atik! Mwen te jwenn yon anpil nan atik ki dekri ki jan yo kalkile distans ant de pwen men mwen te reyèlman kap chèche snippet la SQL.
Mèsi anpil travay byen
Mèsi anpil pou fòmil sa a. Li raze kèk tan sou yon pwojè kote magazen ki te manje nan mwen.
Mèsi yon pakèt. Ti liy kòd sa a te sove m 'kèk tan konsiderab nan yon pwojè kote magazen!
#1054 - Enkoni kolòn 'distans' nan 'kote kloz'
apwouve
Menm isit la! Ki pwoblèm nan :-/? ki jan yo rezoud "distans" - pwoblèm nan kolòn? Ede nou, tanpri!! 🙂
Eseye itilize HAVING olye de WHERE
2 jou rechèch poum jwenn finalman paj sa ki rezoud pwoblèm mwen an. Li sanble ke mwen pi bon jarèt soti WolframAlpha mwen epi brose sou matematik mwen an. Chanjman ki soti nan KOTE a HAVING gen script mwen an nan lòd travay. MÈSI
olye de WHERE kloz itilize:
GEN distans <50
Mèsi Georgi. Mwen te kontinye jwenn kolòn 'distans' pa jwenn. Yon fwa mwen chanje KOTE pou GEN li te travay tankou yon cham!
Mwen swete sa a se premye paj mwen ta jwenn sou sa a. Apre w fin eseye anpil kòmandman diferan, sa a se sèlman youn nan travay byen, ak chanjman minimòm ki nesesè yo anfòm pwòp baz done mwen an.
Thanks a lot!
Mwen swete sa a se premye paj mwen ta jwenn sou sa a. Apre w fin eseye anpil kòmandman diferan, sa a se sèlman youn nan travay byen, ak chanjman minimòm ki nesesè yo anfòm pwòp baz done mwen an.
Thanks a lot!
Mèsi anpil!
Mèsi anpil!
Mwen pa panse kòd la ap parèt ankò. Petèt se firefox?
Mwen jis teste tou de nan Firefox ak Chrome epi li parèt. Eseye anko?
Alo. Mèsi anpil. Sa a travay tankou yon cham.
Mèsi anpil Douglas. Sa ap travay pafè.
Mwen konnen fòmil sa a mache, men mwen pa ka wè ki kote reyon tè a pran an kont. Èske yon moun ka eklere mwen, tanpri?
Tim, pou yon eksplikasyon konplè sou fòmil Havesine (sa pa kòd), tcheke atik Wikipedya a: http://en.wikipedia.org/wiki/Haversine_formula
Bèl! Sa te ede m anpil!
Gwo bagay Douglas. Èske w te eseye jwenn pwen entèseksyon an bay Long/Lat/Bearing de pwen?
Poko fè sa, Khanh!
Mèsi Douglas, SQL Query a se egzakteman sa mwen te bezwen, e mwen te panse mwen ta dwe ekri li tèt mwen. Ou te sove m 'nan pètèt èdtan nan koub aprantisaj latitid lonjitid!
Mwen kontinye resevwa Errormessage: Enkoni kolòn 'Distans' nan 'kote kloz' sou Rekèt MySQL la.
Peter, tanpri li nan lòt kòmantè yo. Li parèt ke gen kèk moun ki te oblije sèvi ak yon sentaks diferan pou KOTE / GEN GEN.
Mèsi pou gwo atik sa a! Jis teste kòd la sou DB mwen an ak travay gwo!
Douglas, mèsi pou kòd etonan sa a. Te fann tèt mwen sou kòman yo fè sa sou pòtal kominote GPS mwen an. Ou te sove m 'zèd tan.
Bon pou tande, Ash!
mèsi paske w poste atik itil sa a,
men pou kèk rezon mwen ta renmen mande
ki jan yo ka resevwa distans ki genyen ant koòd andedan mysql db ak koòd yo mete nan php pa itilizatè?
pou dekri pi klè:
1.Itilizatè a dwe mete [id] pou chwazi done espesifye nan db ak kòd itilizatè tèt li.
2.Fisye php la jwenn done sib yo (kowòd) lè l sèvi avèk [id] ak Lè sa a, kalkile distans ant itilizatè ak pwen sib.
oswa ou ka jis jwenn distans ak kòd ki anba a?
$qry = “CHWAZI *,(((acos(sin((“.$latitid.”*pi()/180)) * sin((`Latitid`*pi()/180))+cos((“. $latitid.”*pi()/180)) * cos((`Latitid`*pi()/180)) * cos((((“.$longitud.”- `Lonjitid`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) kòm distans DE `MyTable` WHERE distans >= ".$distans." >>>> Èske mwen ka "pran" distans la soti isit la?
Mesi anko,
Timmy S
pa janm bliye, mwen te konnen ki jan "fonksyon" travay nan PHP
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
mèsi anpil!!
ok, tout sa mwen te eseye pa mache. Mwen vle di, sa mwen genyen travay, men distans yo byen lwen.
Èske yon moun ta ka wè sa ki mal ak kòd sa a?
if(isset($_POST['soumèt'])){ $z = $_POST['kod postal']; $r = $_POST['reyon']; eko “Rezilta pou “.$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. city,z1.state FROM mrk m, zip z1, zip z2 KOTE 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 ) ) ) <= $e ") (mysql_error()); while($row = mysql_fetch_array($sql)) { $store1 = $row['MktName']."”; $magazen = $row ['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState'].” “.$ranje ['kod postal']; $latitid1 = $ranje ['lat']; $longitude1 = $ranje ['lon']; $latitid2 = $ranje ['y1']; $longitud2 = $ranje ['x1']; $vil = $ranje ['vil']; $eta = $ranje ['eta']; $dis = getnew($latitid1, $longitude1, $latitid2, $longitude2, $inite = 'Mi'); // $dis = distans($lat1, $lon1, $lat2, $lon2); $ verifye = $ ranje [ ' verifye ' ] ; si ($ verifye == '1'){ eko “”; eko "".$magazen.""; eko $dis . "mil (yo) lwen"; eko ""; } lòt bagay { eko “”.$magazen.””; eko $dis . "mil (yo) lwen"; eko ""; }}}
kòd functions.php mwen an
fonksyon getnew($latitid1, $longitud1, $latitid2, $longitud2, $inite = 'Mi') { $theta = $longitude1 – $longitude2; $distans = (sin(deg2rad($latitid1)) * sin(deg2rad($latitid2))) + (cos(deg2rad($latitid1)) * cos(deg2rad($latitid2)) * cos(deg2rad($theta)) ); $distans = acos($distans); $distans = rad2deg($distans); $distans = $distans * 60 * 1.1515; switch($inite) { ka 'Mi': kraze; ka 'Km' : $distans = $distans * 1.609344; } retounen (wonn($distans,2)); }
Mèsi davans
Mèsi pou atik sa a. Travay byen ak kòd mwen an. 🙂
Hey Douglas, bèl atik. Mwen te jwenn eksplikasyon ou sou konsèp jeyografik yo ak kòd la vrèman enteresan. Sèl sijesyon mwen ta dwe espas ak endent kòd la pou ekspozisyon (tankou Stackoverflow, pou egzanp). Mwen konprann ke ou vle konsève espas, men espas konvansyonèl kòd / indentation ta fè li pi fasil pou mwen, kòm yon pwogramè, li ak diseksyon. De tout fason, sa se yon ti bagay. Kontinye gwo travay la.
Mèsi! Mwen te modifye pòs la yon ti kras... men ekwasyon yo pran anpil plas epi yo tèlman long ke mwen pa sèten ke li ede twòp.
Mèsi anpil.
isit la pandan w ap itilize ak fonksyon nou ap resevwa yon sèl kalite distans .. pandan w ap itilize rechèch vini li yo lòt kalite distans
Mwen pa pral kalkile distans ant de eta
Muchas gracias por tan hermoso codigo...
Sa a se bon fonksyon cosinus. Mwen pa konn matematik, men mèsi!
Gwo travay... 🙂 (y)
li sanble pi vit (mysql 5.9) yo sèvi ak de fwa fòmil la nan seleksyon an ak ki kote:
$formil = “(((acos(sin((“.$latitid.”*pi()/180)) * sin((`Latitid`*pi()/180))+cos(((“.$latitid. ”*pi()/180)) * cos((`Latitid`*pi()/180)) * cos(((“.$longitud.”- `Lonjitid`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'SELECT *, '.$formil.' kòm distans Apati tab KOTE '..$formil.' <= '.$distans;
mèsi ...
pa travay si
"KOTE distans"
travay si
"GEN distans"
Mèsi anpil pou taye atik sa a.li trè itil.
Okòmansman, PHP te kreye kòm yon senp platfòm script ki rele "Pèson Kay Paj". Sèjousi PHP (ki kout pou Hypertext Preprocessor) se yon altènatif nan teknoloji Microsoft Active Server Pages (ASP).
PHP se yon langaj sous ouvè bò sèvè ki itilize pou kreye paj wèb dinamik. Li ka entegre nan HTML. Anjeneral yo itilize PHP an konjonksyon avèk yon baz done MySQL sou serveurs entènèt Linux/UNIX. Li se pwobableman lang scripting ki pi popilè.
Mwen jwenn solisyon pi wo a pa travay byen.
Mwen bezwen chanje pou:
$qqq = “CHWAZI *,(((acos(sin((“.$latitid.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitid . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitud . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) kòm distans soti nan `register` “;
Mèsi Kupendra!
mèsi mesye wroking parfe .. men mwen gen yon kesyon si mwen vle pwodiksyon san pwen desimal Lè sa a, kisa mwen ka fè ..?
Mèsi davans.
Bonjou, tanpri mwen pral reyèlman bezwen èd ou sou sa.
Mwen te fè yon demann jwenn nan sèvè entènèt mwen an http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $latitid
-2.23389 = $longitud
ak 20 = distans mwen vle rekipere
Sepandan lè l sèvi avèk fòmil ou a, li rekipere tout ranje nan db mwen an
$rezilta = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitid.”*pi()/180)) * sin((lat*pi()/180) ))+cos((“.$latitid.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$longitud.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) as distance FROM markers 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, ”distans”:16079.294719663},{“id”:2,”name”:”Amici's East Coast Pizzeria”,”address”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”address”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”address”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”address”:”619 Escuela Ave, Mountain View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza”,”address4546”:” El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distance”:16077.937560795},{“ id”:7,”name”:”Ba yo ak gri”, “adrès”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distance”:8038.7620112314}]
Mwen vle rekipere jis ranje ak 20 mil men li pote tout ranje. Tanpri, kisa mwen fè mal
Mwen ap chèche yon rechèch menm jan an men mwen te ogmante yon ti kras - an ti bout tan sa a se gwoup tout kowòdone nan 2 mil nan chak kowòdone ak Lè sa a, konte konbyen kowòdone nan chak gwoup ak pwodiksyon sèlman yon gwoup ki gen plis kowòdone - menm si ou gen plis pase yon gwoup nan mitan gwoup ki gen pi gwo kantite kowòdone - tou senpleman soti gwoup o aza nan gwoup yo ki gen menm pi gwo nimewo -
Mèsi anpil pou pataje.