Hilabete honetan PHP eta MySQL programetan dezente programatu dut GISari dagokionez. Sarean barrena zebilen, egia esan, zaila izan nuen zenbait Kalkulu geografikoak bi kokapenen arteko distantzia aurkitzeko, beraz, hemen partekatu nahi nuen.

Bi punturen arteko distantzia kalkulatzeko modu sinplea formula pitagorikoa erabiliz triangelu baten hipotenusa kalkulatzeko da (A² + B² = C²). Hau izenarekin ezagutzen da Distantzia euklidearra.
Hasiera interesgarria da, baina ez da aplikatzen Geografiarekin, latitudearen eta longitudearen arteko distantzia baita ez distantzia berdinak aparte. Ekuatorera hurbildu ahala, latitudearen marrak aldendu egiten dira. Triangulazio ekuazio sinpleen bat erabiltzen baduzu, distantzia kokapen batean zehatz neur dezake eta bestean oso okerra, Lurraren kurbatura dela eta.
Zirkulu Handiko Distantzia
Lurraren inguruan distantzia luzeak egiten dituzten ibilbideak Zirkulu Handiko Distantzia. Hau da... esfera bateko bi punturen arteko distantziarik laburrena mapa lau bateko puntuen aldean desberdina da. Konbinatu hori latitude- eta longitude-lerroak berdin-distanteak ez izatearekin... eta kalkulu zaila duzu.
Hemen duzue zirkulu bikainak nola funtzionatzen duen azaltzen duen bideo zoragarria.
Haversine Formula
Lurraren kurbatura erabiliz distantzia sartzen da Havesine formula, trigonometria erabiltzen duena lurraren kurbadura ahalbidetzeko. Lurreko 2 lekuren arteko distantzia aurkitzen ari zarenean (beleak hegan egiten duen heinean), lerro zuzena arku bat da.
Hori aireko hegaldietan aplika daiteke. Inoiz begiratu al duzu hegaldien benetako mapa eta arkuak direla ikusi duzu? Bi punturen arteko arku batean hegan egitea laburragoa delako kokapenera zuzenean baino.
PHP: Kalkulatu Latitudearen eta Longitudearen 2 Puntuen arteko Distantzia
Hona hemen bi punturen arteko distantzia (Mile vs. Kilometer bihurketarekin batera) kalkulatzeko PHP formula bi hamartarrekin biribilduta.
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));
}
Aldagaiak hauek dira:
- $Latitude1 – zure lehen kokapenaren latituderako aldagai bat.
- $Longitude1 – zure lehen kokapenaren longitudearen aldagaia
- $Latitude2 – zure bigarren kokapenaren latituderako aldagai bat.
- $Longitude2 – zure bigarren kokapenaren longitudearen aldagaia.
- $unitatea – lehenetsia izatea mila. Hau eguneratu edo gisa pasa daiteke kilometro.
Python: Kalkulatu 2 Latitude eta Luzera punturen arteko distantzia
Dena den, hona hemen bi puntu hamartarrekin biribilduta bi punturen arteko distantzia (Mile vs. Kilometer bihurketarekin batera) kalkulatzeko Python formula. Zorionak nire semeari, Bill Karr-i, datu-zientzialaria dena OpenINSIGHTS, kodearako.
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)
Aldagaiak hauek dira:
- latitudea1 – zure lehen kokapenaren aldagai bat latitude.
- longitudea 1 – zure lehen kokapenaren aldagai bat longitudea
- latitudea2 – Zure bigarren kokapenaren aldagai bat latitude.
- longitudea 2 – Zure bigarren kokapenaren aldagai bat longitudea.
- unitate – lehenetsia izatea mila. Hau eguneratu edo gisa pasa daiteke kilometro.
MySQL: barruti bateko erregistro guztiak berreskuratzea milietan distantzia kalkulatuz, latitudea eta luzera erabiliz
SQL erabil daiteke erregistro guztiak distantzia jakin batean aurkitzeko kalkulua egiteko. Adibide honetan, MyTable kontsultatuko dut MySQL-n, $ latitude eta $ longitudean kokapenarekiko $ distantzia aldakorreko (miletan) baino txikiagoak edo berdinak diren erregistro guztiak aurkitzeko:
Erregistro guztiak zehatz baten barruan berreskuratzeko kontsulta distantzia bi latitudearen eta longitudearen arteko distantzia miliatan kalkulatuz hauek dira:
$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."
Hau pertsonalizatu beharko duzu:
- $ longitudea - Hau PHP aldagaia da, non puntuaren longitudea pasatzen ari naizen.
- $ latitudea - Hau PHP aldagaia da, non puntuaren longitudea pasatzen ari naizen.
- $ distantzia - hau da erregistro guztiak txikiagoak edo berdinak aurkitzea gustatuko litzaizukeen distantzia.
- taula - Taula hau da ... zure mahaiaren izenarekin ordezkatu nahi duzu.
- latitude - hau da zure latitudearen eremua.
- longitudea - hau da zure longitudearen eremua.
MySQL: barruti bateko erregistro guztiak berreskuratzea kilometrotan distantzia kalkulatuz latitudea eta luzera erabiliz
Hemen duzu SQL kontsulta MySQL-n kilometroak erabiliz:
$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."
Hau pertsonalizatu beharko duzu:
- $ longitudea - Hau PHP aldagaia da, non puntuaren longitudea pasatzen ari naizen.
- $ latitudea - Hau PHP aldagaia da, non puntuaren longitudea pasatzen ari naizen.
- $ distantzia - hau da erregistro guztiak txikiagoak edo berdinak aurkitzea gustatuko litzaizukeen distantzia.
- taula - Taula hau da ... zure mahaiaren izenarekin ordezkatu nahi duzu.
- latitude - hau da zure latitudearen eremua.
- longitudea - hau da zure longitudearen eremua.
Kode hau Ipar Amerika osoan 1,000 kokapen baino gehiago dituen txikizkako denda baterako erabiltzen genuen enpresa mapen plataforman erabili nuen eta ederki funtzionatu zuen.
Microsoft SQL Server distantzia geografikoa: STDistance
Microsoft SQL Server erabiltzen ari bazara, bere funtzioa eskaintzen dute, STDistantzia Geografia datu-mota erabiliz bi punturen arteko distantzia kalkulatzeko.
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);
Txapel-aholkua Manash Sahoo-ri, VP eta arkitektoari Highbridge.
Mila esker partekatzeagatik. Kopiatu eta itsatsi lan erraza izan zen eta bikain funtzionatzen du. Denbora asko gorde didazu.
FYI C-ra eramaten duenarentzat:
bikoitza deg2rad (bikoitza deg) {return Deg * (3.14159265358979323846 / 180.0); }
Argitalpen oso polita - oso polita lan egin du - lat-luzea duen mahaiaren izena aldatu behar nuen. Nahiko azkar funtzionatzen du .. Lat-longs (<400) kopuru nahiko txikia daukat, baina uste dut hau polita eskalatuko litzatekeela. Gune polita ere - del.icio.us kontuan gehitu berri dut eta aldizka begiratuko dut.
Mila esker Peter eta Kerry! GIS proiektuetan lan egitea gustuko baduzu, gomendatuko nuke:
Mila esker ... 😀
Egun osoan bilatu nuen distantziaren kalkuluak eta harversine algoritmoa aurkitu nuen, eskerrik asko sql adierazpen batean nola jarri adibidea emateagatik. Eskerrik asko eta agur, Daniel
Laguntzen pozik, errail lagun!
Orain, 'Poligonoan' PHP funtzioaren bila nago, sekuentziaatutako latitudearen eta longitudearen koordenatuen multzoa hartuko duena eta poligonoaren barruan edo kanpoan beste puntu bat dagoen jakiteko.
aurkitu dut ekuazioa poligono bateko puntu bat den jakiteko!
Uste dut zure SQL-k adierazpen bat behar duela.
WHERE distance <= $ distance beharko zenukeen ordez
erabili HAVING distance <= $ distance
bestela, eskerrik asko denbora eta energia pila bat aurrezteagatik.
Kaixo, David
GROUP BY instrukzioren bat egiten ari bazara, IZATEA beharko duzu. Ez dut hori egiten goiko adibidean.
Doug
MySQL 5.x-etik aurrera, ezin duzu aliasik erabili WHERE klausulan ikus http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Erabili HAWING ordez WHERE ordez aurreko kontsultetan
Eskerrik asko. Lan bikaina egin duzu Hori da benetan nahi dudana. Mila esker.
Mila esker kode hau partekatzeagatik. Garapen denbora asko aurreztu ninduen. Gainera, eskerrik asko zure irakurleei adierazi didatenez, HAVING adierazpena beharrezkoa da MySQL 5.x-rako. Oso lagungarria.
Irakurleak ni baino askoz adimentsuagoak izatea zorionekoa naiz!
🙂
Goiko formulak denbora asko aurrezten nau. Eskerrik asko.
NMEA formatuaren eta tituluen artean ere aldatu behar dut. URL honetan formula bat aurkitu dut orriaren behealdean. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Ba al daki inork hori egiaztatzen?
Eskerrik asko!
Harry
Kaixo,
Beste galdera bat. Ba al dago formula beheko NMEA kateetarako?
1342.7500, N, 10052.2287, E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Eskerrik asko,
Harry
WHEREk niretzat ez zuela funtzionatu ere aurkitu nuen. HAVING izatera aldatu da eta dena primeran funtzionatzen du. Hasieran ez nituen iruzkinak irakurri eta habia aukeratutako bat erabiliz berridatzi. Biek ondo funtzionatuko dute.
Mila esker mysql-n idatzitako gidoiagatik, doikuntza txiki batzuk egin behar izan ditut (IZATEA) 🙂
Gret lana
Izugarri lagungarria, mila esker! Zenbait arazo izan nituen "IZATEA" berriarekin, "NON" baino, baina hemen iruzkinak irakurrita (ordu erdi inguru hortzak frustrazioarekin zapuztu ondoren = P), ondo funtzionatu nuen. Eskerrik asko ^ _ ^
eskerrik asko lan bikaina
Gogoan izan horrelako adierazpen hautatuak oso konputazionalki biziak eta, beraz, motelak izango direla. Galdera horietako asko baldin badituzu, gauzak nahiko azkar galarazi ditzake.
Askoz ere hurbilagoa ez den ikuspegia lehenengo hautaketa (gordina) bat egitea da kalkulatutako distantziaz definitutako SQUARE eremua erabiliz, hau da, "hautatu * taula izenetik non latitudea lat1 eta lat2 artekoa eta lon1 eta lon2 arteko longitudea". lat1 = targetlatitude - latdiff, lat2 = targetlatitude + latdiff, lon-ren antzekoa. latdiff ~ = distantzia / 111 (km-rako) edo distantzia / 69 miliatarako latitudea 1 ~ ~ km-ra dagoenez (aldakuntza txikia lurra apur bat obalatua denez, baina nahikoa da horretarako). londiff = distance / (abs (cos (deg111rad (latitude)) * 2)) - edo 111 kilometrotan (benetan karratu handiago bat har dezakezu aldakuntzak kontutan hartzeko). Ondoren, hartu horren emaitza eta elikatu erradialaren aukerara. Ez ahaztu mugaz kanpoko koordenatuak kontutan hartzea - hau da, longitudea onargarria -69 eta +180 bitartekoa da eta latitudea onargarria -180 eta +90 artekoa da - zure latdiff edo londresak barruti honetatik kanpo badaude. . Kontuan izan kasu gehienetan agian ez dela aplikagarria, ozeano barea zeharkatzen duen lerro baten gaineko kalkuluei soilik eragiten baitie polo batetik polo batera, nahiz eta txukotka zati bat eta Alaska zati bat ebakitzen dituen.
Horrekin lortzen duguna kalkulu hau egiten duzun puntu kopurua murriztea da. Datu-basean milioi bat puntu global badituzu gutxi gorabehera banatuta eta 100 km-ra bilatu nahi baduzu, zure lehen bilaketa (azkarra) 10000 km karratukoa da eta 20 emaitza inguru lortuko ditu seguruenik (banaketa uniformean oinarrituta azalera 500 M² inguru), horrek esan nahi du distantzia kalkulu konplexua 20 aldiz egiten duzula kontsulta honetarako milioi bat aldiz egin beharrean.
Adibiderako akats txikia ... hori 50 kilometrotan egongo litzateke (ez 100), gure ... karratuaren "erradioa" aztertzen ari garelako.
Aholku zoragarria! Egia esan, barruko laukia ateratzen zuen funtzio bat idatzi zuen garatzaile batekin eta gero perimetroaren inguruan "laukiak" egiten zituen funtzio errekurtsibo bat gainontzeko puntuak sartu eta baztertzeko. Emaitza emaitza izugarri azkarra izan zen: milioika puntu ebaluatzen zituen mikrosegundotan.
Nire goiko ikuspegia "gordina" da, zalantzarik gabe, baina gai da. Eskerrik asko berriro!
Doug,
Mysql eta php erabiltzen saiatu naiz puntu luze lat bat poligono baten barruan dagoen ala ez ebaluatzeko. Ba al dakizu zure garatzaile lagunak zeregin hori betetzeko adibiderik argitaratu duen. Edo adibide onik ezagutzen al duzu? Eskerrik asko aldez aurretik.
Kaixo guztioi, hau da nire test SQL adierazpena:
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
eta Mysql-k esaten dit distantzia hori ez dela zutabe gisa existitzen, ordena arabera erabil dezaket, NONDIK gabe egin dezaket eta funtzionatzen du, baina ez horrekin ...
Ordeztu "NON distantzia" "DISTANTZIA IZAN".
Xarma bezala funtzionatzen du, eskerrik asko, Douglas!
Hori bikaina da, hala ere, txoriek hegan egiten duten moduan. Oso ondo legoke google maps APIa nolabait sartzen saiatzea (agian errepideak erabiliz, etab.) Garraiobide desberdin bat erabiliz ideia bat ematea besterik ez. Oraindik ez dut PHP-n uztartze simulatu bat egin, saltzaile ibiltariaren arazoari irtenbide eraginkorra eskaintzeko gai izango zena. Baina uste dut agian zure koderen bat berrerabiltzeko gai izango naizela horretarako.
Kaixo Douglas,
mila esker artikulu honengatik - denbora asko aurreztu didazu.
Kontuz ibili,
nimrod @Israel
Artikulu ona! Bi punturen arteko distantzia nola kalkulatzen duten deskribatzen duten artikulu ugari aurkitu ditut baina benetan SQL zatiaren bila nenbilen.
Eskerrik asko asko funtzionatzen du
Mila esker formula honengatik. Denbora pixka bat mozten ari zitzaidan jaten ari zen denda baten kokapenean.
Eskerrik asko sorta bat. Kode lerro txiki honek denbora dezente aurreztu dit denda kokatzeko proiektu batean!
# 1054 - "distantzia" zutabe ezezaguna "non klausulan"
onestea
Hemen ere berdina! Zein da arazoa :-/? nola konpondu "distantzia" - Zutabearen arazoa? Lagundu iezaguzu, mesedez !! 🙂
Saiatu HAU edukitzen NON ordez
2 eguneko ikerketa, azkenean nire arazoa konpontzen duen orrialde hau aurkitzeko. Badirudi hobe dudala WolframAlpha kentzea eta nire matematika garbitzea. NON izatetik izatera pasatzeak nire gidoia funtzionamenduan du. ESKERRIK ASKO
WHERE klausula erabili beharrean:
Distantzia <50 izanda
Eskerrik asko Georgi. Zutabearen "distantzia" aurkitu gabe jarraitzen nuen. NONDIK IZATEA aldatu nuenean xarma bezala funtzionatu zuen!
Nahiago nuke hau izan zen honetan aurkitu nuen lehen orria. Hainbat komando probatu ondoren hau izan zen behar bezala funtzionatzen zuen bakarra eta nire datu-basera egokitzeko gutxieneko aldaketekin.
Eskerrik asko!
Nahiago nuke hau izan zen honetan aurkitu nuen lehen orria. Hainbat komando probatu ondoren hau izan zen behar bezala funtzionatzen zuen bakarra eta nire datu-basera egokitzeko gutxieneko aldaketekin.
Eskerrik asko!
Mila esker!
Mila esker!
Ez dut uste kodea jada agertzen denik. Agian firefox da?
Bai Firefoxen bai Chrome-n probatu berri dut eta agertzen ari da. Saiatu berriro?
Kaixo. Mila esker. Honek xarma bezala funtzionatzen du.
Mila esker Douglas. Hau primeran dabil.
Badakit formula horrek funtzionatzen duela, baina ezin dut ikusi lurraren erradioa non hartzen den kontuan. Norbaitek argitu al dezake, mesedez?
Tim, Haversine formularen azalpen osoa lortzeko (hori ez da kodea), ikusi Wikipediaren artikulua: http://en.wikipedia.org/wiki/Haversine_formula
Ederra! Horrek izugarri lagundu dit!
Gauza bikainak Douglas. Bi punturen luzera / lat / errodamendua kontuan hartuta ebakidura puntua lortzen saiatu al zara?
Oraindik ez dut hori egin, Khanh!
Eskerrik asko Douglas, SQL kontsulta da behar nuena eta nik idatzi beharko nuela pentsatu nuen. Horrek salbatu nauzu, ziur aski, latitudea eta longitudea ikasteko kurba orduetatik!
MySQL kontsultako Errormessage: "Distantzia" zutabe ezezaguna jasotzen jarraitzen dut.
Peter, irakurri beste iruzkinak. Badirudi jende batzuek sintaxi desberdina erabili behar zutela NON / DUTEN.
Eskerrik asko artikulu bikain honengatik! Kodea nire DBn probatu eta primeran funtzionatu!
Douglas, eskerrik asko kode harrigarri honengatik. Nire GPS komunitate atarian hori nola egin jakiteko buruan egon naiz. Orduak aurreztu dizkidazu.
Oso ondo entzutea, Ash!
eskerrik asko artikulu lagungarri hau argitaratzeagatik,
baina arrazoiren batengatik galdetu nahiko nuke
nola lortu mysql db barruko koorden eta erabiltzaileek php-ra txertatutako koorden arteko distantzia?
argiago deskribatzeko:
1. erabiltzaileak [id] txertatu behar du db eta erabiltzailearen beraren koordenetatik zehaztutako datuak hautatzeko
2. php fitxategiak xede datuak (koordeak) lortzen ditu [id] erabiliz eta gero kalkulatu erabiltzailearen eta xede puntuaren arteko distantzia
edo besterik gabe beheko kodetik distantzia lor dezakezu?
$ qry = “SELECT *, (((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` Latitude` * pi () / 180)) + cos ((“. $ latitudea. "* pi () / 180)) * cos ((` Latitudea * * pi () / 180)) * cos (((". $ longitudea." - `Longitudea ') * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) distance gisa `MyTable` WHERE distance> =“. $ Distance. ” >>>> hemendik distantzia "atera" dezaket?
eskerrik asko berriro,
Timmy S
ez dio axola, asmatu dut nola funtzionatzen duen php-n "funtzioak"
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
Mila esker!!
ados, saiatu naizen guztia ez dabil. Esan nahi dut, dudana funtzionatzen du, baina distantziak urrun daude.
Ezin al luke inork ikusi kode honekin zer gertatzen den?
if (isset ($ _ POST ['bidalita'])) {$ z = $ _POST ['posta-kodea']; $ r = $ _POST ['erradioa']; oihartzuna "Emaitzak". $ 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. hiria, z1.state FROM mrk m, zip z1, zip z2 WHERE 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 ") edo hil (mysql_error ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. "”; $ store = $ row ['LocAddSt']. ””; $ store. = $ row ['LocAddCity']. ",". $ row ['LocAddState']. " “. $ Row ['postal kodea']; $ latitude1 = $ errenkada ['lat']; $ longitudea1 = $ errenkada ['lon']; $ latitude2 = $ errenkada ['y1']; $ longitudea2 = $ errenkada ['x1']; $ hiria = $ errenkada ['hiria']; $ egoera = $ errenkada ['egoera']; $ dis = getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi'); // $ dis = distantzia ($ lat1, $ lon1, $ lat2, $ lon2); $ egiaztatua = $ errenkada ['egiaztatua']; if ($ Verified == '1') {echo ""; echo "". $ store. ""; echo $ dis. ”Milia (k) urrun”; oihartzuna ""; } bestela {oihartzuna "". $ denda. ""; echo $ dis. ”Milia (k) aldera”; oihartzuna ""; }}}
nire funtzioak.php kodea
function getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2; $ distantzia = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ); $ distantzia = acos ($ distantzia); $ distantzia = rad2deg ($ distantzia); $ distantzia = $ distantzia * 60 * 1.1515; switch ($ unit) {case 'Mi': break; 'Km' kasua: $ distantzia = $ distantzia * 1.609344; } itzulera (txanda ($ distantzia, 2)); }
Eskerrik asko aldez aurretik
Eskerrik asko artikulu honengatik. Nire kodearekin ondo funtzionatzen. 🙂
Aupa Douglas, artikulu bikaina. Kontzeptu geografikoen eta kodearen inguruko azalpena oso interesgarria iruditu zait. Iradokizun bakarra bistaratzeko kodea tartekatzea eta koska egitea izango litzateke (Stackoverflow, adibidez). Ulertzen dut espazioa gorde nahi duzula, baina ohiko kodeen arteko tartea / koska asko erraztuko nuke, programatzaile gisa, irakurtzea eta disekzioa egitea. Dena den, gauza txikia da. Segi lan bikainarekin.
Eskerrik asko! Argitalpena apur bat aldatu dut ... baina ekuazioek hainbeste leku hartzen dute eta hain luzeak dira, ez nagoen ziur gehiegi laguntzen duenik.
Eskerrik asko.
Hemen funtzioarekin erabiltzen ari garen bitartean distantzia mota bat lortzen ari gara .. beste distantzia mota kontsultatzen ari garen bitartean
Ez dut bi egoeren arteko distantzia kalkulatuko
Eskerrik asko esker ona codigo ...
Cosinus funtzio onak ditut. Ez dakit matematika, baina eskerrik asko!
Lan bikaina ... 🙂 (y)
badirudi azkarragoa dela (mysql 5.9) hautatzeko eta non formula bikoitza erabiltzea:
$ formula = "((((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` Latitude` * pi () / 180)) + cos ((". $ latitude. "* Pi () / 180)) * cos ((` Latitudea` * pi () / 180)) * cos (((". $ Longitudea." - `Longitudea ') * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ”;
$ sql = 'SELECT *,'. $ formula. ' distantzia gisa TAULATIK NORA '.. $ formula.' <= '. $ distantzia;
eskerrik asko ...
funtzionatzen ez badu
“NON distantzia”
lan eginez gero
“Distantzia IZATEA”
Mila esker artikulu hau mozteagatik. Oso lagungarria da.
PHP hasieran "Home Page pertsonala" izeneko scripting plataforma soil gisa sortu zen. Gaur egun PHP (Hypertext Preprocessor laburdura) Microsoft-en Active Server Pages (ASP) teknologiaren alternatiba da.
PHP kode irekiko zerbitzariaren aldeko hizkuntza da, web orri dinamikoak sortzeko erabiltzen dena. HTMLan txertatu daiteke. PHP Linux / UNIX web zerbitzarietan MySQL datu-basearekin batera erabili ohi da. Seguru asko scripting hizkuntza ezagunena da.
Goiko soluzioa ondo ez dabilela aurkitu dut.
Honako hauetara aldatu behar dut:
$ qqq = "SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((". $ latitudea. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((". $ longitudea.“ - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) distantzia gisa `register'-tik";
Eskerrik asko Kupendra!
eskerrik asko, jauna, primeran ari zaren ... baina galdera bat daukat puntu hamartarrik gabe atera nahi badut, zer egin dezaket ..?
Eskerrik asko, aldez aurretik.
Kaixo, mesedez, zure laguntza beharko dut horretarako.
Lortu eskaera bat egin nuen nire web zerbitzarira http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $ latitudea
-2.23389 = $ longitudea
eta 20 = berreskuratu nahi dudan distantzia
Hala ere, zure formula erabiliz, nire db-ko errenkada guztiak berreskuratzen ditu
$ emaitzak = DB :: select (DB :: raw ("SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((lat * pi () / 180 )) + cos ((". $ latitude." * pi () / 180)) * cos ((lat * pi () / 180)) * cos (((". $ longitudea." - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) distantzia gisa MARKATURETIK DUTE distantzia> = ". $ Distantzia));
[{"Id": 1, "name": "Frankie Johnnie & Luigo Too", "address": "939 W El Camino Real, Mountain View, CA", "lat": 37.386337280273, "lng": - 122.08582305908, "Distance": 16079.294719663}, {"id": 2, "name": "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 Ikusi, CA "," lat ": 37.394012451172," lng ": - 122.09552764893," distance ": 16078.563225154}, {" id ": 6," name ":" Oregano's Wood-Fired Pizza "," address ":" 4546 El Camino Real, Los Altos, CA "," lat ": 37.401725769043," lng ": - 122.11464691162," distance ": 16077.937560795}, {" id ": 7," name ":" The bars and parrilles "," address ":" 24 Whiteley Street, Manchester "," lat ": 53.485118865967," lng ": - 2.1828699111938," distance ": 8038.7620112314}]
20 kilometroko errenkadak berreskuratu nahi ditut baina ilara guztiak ekartzen ditu. Mesedez, zer egiten ari naiz gaizki
Antzeko kontsultaren bila nabil, baina pixka bat areagotu nintzen. Laburbilduz, koordenatu guztiak koordenatu bakoitzetik 2 miliatara bildu eta gero talde bakoitzeko zenbat koordenatu zenbatu eta koordenatu gehien dituen talde bakarra atera behar da, nahiz eta talde bat baino gehiago dituzu koordenatu kopuru gehien duten taldeen artean - ausazko taldea atera kopuru handiena bera duten taldeetatik -