
Bi Bikaranîna Formula Haversine (Nimûneyên PHP, JavaScript, Java, Python, MySQL, MSSQL) Dûrahiya çembera Mezin di navbera Xalên Latahî û Drêjiyê de Bihejmêre an Bipirse
Di vê mehê de ez pir hindik bername dimeşînim PHP û MySQL bi rêzgirtina ji GIS. Li dora torê digeriyam, bi rastî min zehmetî kişand ku ez hin ji wan bibînim Hesabên erdnigarî ji bo dîtina mesafeya navbera du cihan lewma min xwest ez wan li vir parve bikim.

Awayê hêsan ê hesabkirina mesafeya di navbera du xalan de karanîna formula Pythagorean e ku hîpotenûsa sêgoşeyê (A² + B² = C²) hesab dike. Ev wekî tê zanîn Mesafeya Euklîdiyan.
Ew destpêkek balkêş e lê ew ji bo Erdnîgariyê derbas nabe ji ber ku dûrahiya di navbera xêzên firehî û dirêjahî de ji hev dûr ne wekhev in. Her ku hûn nêzikî ekvatorê dibin, xêzên firehiyê ji hev dûr dikevin. Ger hûn hevokek sêgoşeya sade bikar bînin, dibe ku ew ji ber kulbûna Dinyayê dûrbûnê li cihekî rast û li cîhek din xelet bipîve.
Dûrra Mezin a Mezin
Rêyên ku dûr û dirêj li dora Erdê geriyan wekî Dûrahiya Çerkerê Mezin têne zanîn. Yanî… dûrahiya herî kurt a di navbera du xalên li ser qadekê de ji xalên li ser nexşeyek davî cûda dibe. Vê yekê bi rastiya ku xêzên dirêjahî û dirêjahî ji hev dûr nagirin re bikin yek… û we hesabek dijwar heye.
Li vir vegotinek vîdyoyek fantastîk a karanîna Çerxên Mezin heye.
Formula Haversine
Dûrahiya ku kêşeya Dinyayê bi kar tîne di formula Haversine de cih digire, ku trîgonometryê bikar tîne da ku rê li ber ziravbûna Erdê bide. Dema ku hûn dûrahiya di navbera 2 cihên li ser rûyê erdê de bibînin (wek qijik difire), xetek rast bi rastî kevanek e.
Ev di firîna hewayê de derbasdar e - we qet li nexşeya rastîn a firînan nihêrî û ferq kir ku ew kemer in? Ji ber vê yekê ye ku firîna di kemerek di navbera du xalan de ji rasterast ji cîhê kurttir e.
PHP: Dûrahiya Di Navbera 2 Pûanên Latitude û Dirêjbûnê de hesab bikin
Li vir formula PHP-ê ye ji bo hesabkirina dûrahiya di navbera du xalan de (ligel veguheztina Mile beramberî Kîlometerê) ku bi du deh dehsalan ve hatî dorpêç kirin.
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));
}
Guherbar ev in:
- $Latitude1 - guherbarek ji bo firehiya cîhê weya yekem.
- $Longitude1 - guherbarek ji bo dirêjahiya cîhê weya yekem
- $Latitude2 - guherbarek ji bo firehiya cîhê weya duyemîn.
- $Longitude2 - guherbarek ji bo dirêjahiya cîhê weya duyemîn.
- $ unit - hebûna xwerû hezaran. Ev dikare were nûve kirin an wekî derbas bibe kîlometre.
Java: Dûrahiya Di Navbera 2 Xalên Dirêjahî û Dirêjiyê Bihesibîne
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;
}
}
Guherbar ev in:
- latitude1 - guherbarek ji bo firehiya cîhê weya yekem.
- dirêjahî1 - guherbarek ji bo dirêjahiya cîhê weya yekem
- latitude2 - guherbarek ji bo firehiya cîhê weya duyemîn.
- dirêjahî2 - guherbarek ji bo dirêjahiya cîhê weya duyemîn.
- yekbûn - hebûna xwerû hezaran. Ev dikare were nûve kirin an wekî derbas bibe kîlometre.
Javascript: Dûrahiya Di Navbera 2 Xalên Latahî û Drêjiyê de Bihejmêre
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);
}
}
Guherbar ev in:
- latitude1 - guherbarek ji bo firehiya cîhê weya yekem.
- dirêjahî1 - guherbarek ji bo dirêjahiya cîhê weya yekem
- latitude2 - guherbarek ji bo firehiya cîhê weya duyemîn.
- dirêjahî2 - guherbarek ji bo dirêjahiya cîhê weya duyemîn.
- yekbûn - hebûna xwerû hezaran. Ev dikare were nûve kirin an wekî derbas bibe kîlometre.
Python: Dûrahiya Di Navbera 2 Xalên Dirêjahî û Dirêjiyê Bihesibîne
Lêbelê, li vir formula Python-ê ye ji bo hesabkirina dûrahiya di navbera du xalan de (ligel veguheztina Mile û Kîlometre) ku bi du deh dehsalan ve hatî dorpêç kirin. Krediya kurê min, Bill Karr ku ji bo Zanyarê Daneyê ye OpenINSIGHTS, ji bo kodê.
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)
Guherbar ev in:
- latitude1 - guherbarek ji bo cîhê weya yekem firehî.
- dirêjahî1 - guherbarek ji bo cîhê weya yekem dirêjî
- latitude2 - guherbarek ji bo cîhê weya duyemîn firehî.
- dirêjahî2 - guherbarek ji bo cîhê weya duyemîn dirêjî.
- yekbûn - hebûna xwerû hezaran. Ev dikare were nûve kirin an wekî derbas bibe kîlometre.
MySQL: Bi Hesabkirina Dûrahiya Di Mîlan de Bi Bikaranîna Latahî û Drêjahî ve Hemî Qeydên Di nav Rêzeyekê de Vedigire
Di heman demê de gengaz e ku meriv SQL bikar bîne da ku hemî tomar di nav dûrek taybetî de hesab bike. Di vê nimûneyê de, ez ê li MyTable li MySQL bipirsim da ku hemî tomarên ku ji guhêrbar $distance (bi Miles) kêmtir an wekhev in ji cîhê min re li $lititude û $longitude bibînim:
Pirsa ji bo vegerandina hemî tomarên di nav taybetî de dûrî bi hesibandina mesafeya bi mîlî di navbera du xalên firehî û dirêjahî de ev in:
$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."
Hûn ê hewce bikin ku vê yekê xwerû bikin:
- $ dirêjî - ev guhêrbar a PHP-ê ye ku ez dirêjiya xalê derbas dikim.
- $ latitude - ev guhêrbar a PHP-ê ye ku ez dirêjiya xalê derbas dikim.
- $ dûr - ev dûrahiya ku hûn dixwazin bibînin ku hemî tomar kêmtir an jî wekhev dibînin.
- table - ev tablo ye… hûn ê bixwazin wê bi navê masa xwe veguherînin.
- firehî - ev qada firehiya we ye.
- dirêjî - ev qada dirêjiya we ye.
MySQL: Bi Hesabkirina Dûrahiya Bi Kîlometeran Bi Bikaranîna Drav û Drêjahî ve Hemî Qeydên Di nav Rêzeyekê de Vedigire
Here li vir pirsa SQL bi karanîna kîlometran di MySQL de heye:
$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."
Hûn ê hewce bikin ku vê yekê xwerû bikin:
- $ dirêjî - ev guhêrbar a PHP-ê ye ku ez dirêjiya xalê derbas dikim.
- $ latitude - ev guhêrbar a PHP-ê ye ku ez dirêjiya xalê derbas dikim.
- $ dûr - ev dûrahiya ku hûn dixwazin bibînin ku hemî tomar kêmtir an jî wekhev dibînin.
- table - ev tablo ye… hûn ê bixwazin wê bi navê masa xwe veguherînin.
- firehî - ev qada firehiya we ye.
- dirêjî - ev qada dirêjiya we ye.
Min vê kodê di platforma nexşeya pargîdanî de bikar anî ku me li seranserê Amerîkaya Bakur bi ser 1,000 cîh re ji bo firoşgehek firotanê bikar anî û ew xweş xebitî.
Dûrahiya erdnîgarî ya Microsoft SQL Server: STDistance
Heke hûn Microsoft SQL Server bikar tînin, ew fonksiyona xwe pêşkêş dikin, STDistance ji bo hesabkirina dûrahiya di navbera du xalan de bi karanîna tîpa daneya Erdnîgariyê.
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 ji Manash Sahoo, VP û Mîmarê Highbridge.
Gelek spas ji bo parvekirinê. Ev karekî kopî û pêvek hêsan bû û pir baş dixebite. We gelek wext ji min xilas kir.
FYI ji bo her kesê ku li C vediguhezîne:
ducar deg2rad(du qat) {deg vegere*(3.14159265358979323846/180.0); }
Parçeyek pir xweş a şandinê - pir xweş xebitî - min tenê neçar ma ku navê maseya ku lat-dirêj digire biguherim. Ew pir zû dixebitî.. Min hejmareke hindik maqûl ya lat-dirêj hene (< 400) lê ez difikirim ku ev ê bi rengek xweş mezin bibe. Malpera xweş jî - min ew nû li hesabê xwe yê del.icio.us zêde kir û dê bi rêkûpêk vegere.
Gelek spas Peter û Kerry! Heke hûn dixwazin li ser projeyên GIS-ê bixebitin, ez ê pêşniyar bikim:
Gelek spas… 😀
Min tevahiya rojê li hesabên dûrbûnê geriya û algorîtmaya harversine dît, spas ji we re ku we mînak da ka meriv wê çawa di danezanek sql de datîne. Spas û silavan, Daniel
Ji bo alîkariyê kêfxweş im, hevalê rails!
Naha ez li fonksiyonek PHP-ê ya 'di Polygon' de digerim ku dê rêzek hevrêzên dirêjahî û dirêjahiya rêzkirî bigire û fêhm bike ka xalek din li hundur an derveyî pirgoşe ye.
Min dît hevkêşeyek ji bo fêmkirina ka xalek di pirgoşeyekê de ye!
Ez difikirim ku SQL-ya we hewceyê daxuyaniyek hebe.
li şûna WHERE dûrbûn <= $distan dibe ku hûn hewce bikin
dûrahiya HAVING <= $distan bikar bînin
wekî din spas ji bo ku min komek dem û enerjiyê xilas kir.
Hi David,
Ger hûn her cûre daxuyaniya GROUP BY dikin, hûn ê hewceyê HAVING bibin. Ez di mînaka li jor de wiya nakim.
Doug
Li gorî MySQL 5.x, hûn nekarin navekî li ser xalek WHERE bikar bînin bibînin http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Di pirsên jorîn de li şûna WHERE HAVING bikar bînin
Gelek spas. We karekî mezin kiriye Ya ku ez bi rastî dixwazim ev e. Gelek sipas.
Gelek spas ji bo parvekirina vê kodê. Ew ji min re gelek wextê pêşveçûnê xilas kir. Di heman demê de, spas ji xwendevanên we re ku destnîşan kirin ku daxuyaniyek HAVING ji bo MySQL 5.x hewce ye. Pir alîkar.
Xwezî ku xwendevanên min ji min pir jîrtir hebin!
🙂
Formula jorîn ji min re gelek wext xilas dike. Gelek spas.
Di heman demê de pêdivî ye ku ez di navbera formata NMEA û Dereceyan de biguherim. Min li vê URL-ê li binê rûpelê formulek dît. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Ma kes dizane ku meriv vê yekê çawa rast bike?
Spas dikim!
Harry
Slav,
Pirsek din. Ji bo rêzikên NMEA formulek mîna ya jêrîn heye?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Spas,
Harry
Min jî dît ku WHERE ji min re nexebitî. Ew li HAVING guhert û her tişt bêkêmasî dixebite. Di destpêkê de min şîrove nexwend û wê bi karanîna hilbijarkek hêlînek ji nû ve nivîsand. Her du jî dê baş bixebitin.
Gelek spas ji bo skrîpta ku di mysql de hatî nivîsandin, tenê neçar ma ku çend verastkirinên piçûk çêbike (HAVING) 🙂
Karê xweş
Pir arîkar, gelek spas! Min bi "HAVING"-a nû re ji "WHERE" re hin pirsgirêk hebûn, lê gava ku min şîroveyên li vir xwend (piştî bi qasî nîv saetê ku diranên xwe ji dilşikestî xwar =P), min ew bi rengek xweş xebitand. Spas dikim ^_^
gelek spas pir baş dixebite
Bînin bîra xwe ku gotinek bijartî ya mîna wê dê ji hêla hesabkirinê ve pir zehf û ji ber vê yekê hêdî be. Ger we pir ji wan pirsan hebin, ew dikare bi lez tiştan bişewitîne.
Nêzîkbûnek pir hindiktir ew e ku meriv hilbijarkek yekem (xav) bi karanîna deverek SQUARE ku ji hêla dûrahiyek hesabkirî ve hatî destnîşan kirin bimeşîne, ango "* ji navê tabloyê hilbijêrin ku lê dirêjahiya di navbera lat1 û lat2 û dirêjahiya di navbera lon1 û lon2 de". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, mîna lon. latdiff ~= dûr / 111 (ji bo km), an dûr / 69 ji bo mîlan ji ber ku 1 dereceya firehiyê ~ 111 km ye (guherînek hindik ji ber ku erd hinekî ovalî ye, lê ji bo vê armancê bes e). londiff = dûr / (abs (cos (deg2rad (fireh)) * 111)) - an 69 ji bo mîl (hûn dikarin bi rastî çarçoveyek piçûktir bigirin da ku guheztinan bihesibînin). Dûv re encama wê bistînin û wê bixin nav hilbijarka radial. Tenê ji bîr nekin koordînatên der-sînor hesab bikin – ango rêza dirêjahiya pejirandî -180 heta +180 e û rêjeya firehiya pejirandî -90 heya +90 e – heke latdiff an londiff we li derveyî vê rêzê be. . Bala xwe bidinê ku di pir rewşan de dibe ku ev neyê sepandin ji ber ku ew tenê bandorê li hesabên li ser xetek di nav Okyanûsa Pasîfîkê de ji stûnek ber bi stûnê dike, her çend ew beşek ji chukotka û beşek ji Alaskayê diqetîne.
Ya ku em bi vê yekê pêk tînin kêmbûnek girîng e di hejmara xalên ku hûn li hember wan vê hesabkirinê dikin. Heke di databasê de mîlyonek gerdûnî ya ku bi qasî 100 km digere, paşê lêgerîna weya yekem (zû) li qadek 10000 sq km e û dê li ser 20 encaman (li ser bingeha belavkirinê jî li ser a rûbera bi qasî 500M km çargoşe), ku tê vê wateyê ku hûn ji bo vê pirsê li şûna mîlyon carî 20 carî hesabê dûrahiya tevlihev dimeşînin.
Di nimûneyê de xeletiyek piçûk… ew ê di nav 50 km de be (ne 100) ji ber ku em li "radyus" çargoşeya xwe digerin.
Şîreta fantastîk! Ez bi rastî bi pêşdebirek re xebitîm ku fonksiyonek ku çargoşeya hundur dikişand û dûv re fonksiyonek vegerî ya ku li dora perimeterê 'çargoşeyan' dinivîsî da ku xalên mayî tê de bigire û derxe. Encam encamek pir bilez bû - wî dikaribû bi mîlyonan xalan di mîkroçirkeyan de binirxîne.
Nêzîkatiya min a li jor bê guman 'xav' e lê jêhatî ye. Dîsa spas!
dog,
Ez hewl didim ku mysql û php-ê bikar bînim da ku binirxînim ka xalek dirêj a lat di nav polîgonek de ye. Ma hûn dizanin ka hevalê weya pêşdebir li ser çawaniya pêkanîna vî karî mînakek weşand. An jî hûn mînakên baş dizanin. Me evîn peyda kir.
Silav her kes ev daxuyaniya min a testa SQL ye:
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 ji min re dibêje ku dûrbûn, wekî stûnek tune, ez dikarim rêzê bikar bînim, ez dikarim bêyî WHERE bikim, û ew dixebite, lê ne bi wê re…
Li şûna "WHERE dûr" bi "HAVING dûr".
Mîna xweşikek dixebite, spas, Douglas!
Ev pir xweş e, di heman demê de ew mîna ku çûk difirin. Dê pir baş be ku hûn API-ya nexşeyên google-ê bi vî rengî bi hev re tevbigerin (dibe ku riyan bikar bînin û hwd.) Tenê ku hûn bi karanîna celebek veguheztinê ramanek bidin. Hîn jî min neçar e ku di PHP-ê de fonksiyonek annealkirina simulasyonê çêkim ku dê bikaribe ji pirsgirêka firoşkarê gerok re çareseriyek bikêr pêşkêşî bike. Lê ez difikirim ku ez dikarim hin kodên we ji nû ve bikar bînim da ku wiya bikim.
Silav Douglas,
gelek spas ji bo vê gotarê - we tenê ji min re pir dem xilas kir.
şîyarbe,
nimrod @Israel
Gotara baş! Min gelek gotar dîtin ku rave dikin ka meriv çawa dûrahiya di navbera du xalan de hesab dike lê ez bi rastî li pişka SQL digeriyam.
Gelek spas baş dixebite
Gelek spas ji bo vê formula. Demek li ser projeyek cîhê dikanê ku li min dixwar, tirş kir.
Spas a bundle. Vê rêzika piçûk a kodê min di projeyek cîhê firotgehê de demek girîng xilas kir!
#1054 - Stûna nenas 'dûr' di 'where clause'
destûrdan
Rast vir! Pirsgirêk çi ye :-/? meriv çawa "dûr" - Pirsgirêka stûnê çareser dike? Ji kerema xwe alîkariya me bikin!! 🙂
Biceribînin ku li şûna WHERE HAVING bikar bînin
2 rojên lêkolînê ku di dawiyê de vê rûpelê ku pirsgirêka min çareser dike bibînim. Wusa dixuye ku ez çêtir e ku ez WolframAlpha-ya xwe derxim û matematîkê xwe firçe bikim. Guhertina ji WHERE bo HAVING nivîsara min di rêza xebatê de ye. SIPAS JI WERE
li şûna WHERE bendê bikar bînin:
DAWÎ <50
Spas Georgi. Min stûna 'dûr' nehat dîtin. Carekê ez WHERE-yê biguherim HAVING-ê ew mîna xweşikek xebitî!
Xwezî ev rûpela yekem bûya ku min li ser vê dîtibû. Piştî ceribandina gelek fermanên cihêreng, ev yek tenê bû ku bi rêkûpêk xebitî, û bi guheztinên hindiktirîn re hewce bû ku databasa min bicîh bîne.
Gelek sipas!
Xwezî ev rûpela yekem bûya ku min li ser vê dîtibû. Piştî ceribandina gelek fermanên cihêreng, ev yek tenê bû ku bi rêkûpêk xebitî, û bi guheztinên hindiktirîn re hewce bû ku databasa min bicîh bîne.
Gelek sipas!
Gelek sipas!
Gelek sipas!
Ez nafikirim ku kod êdî xuya dike. Dibe ku ew firefox e?
Min tenê hem di Firefox û Chrome de ceriband û ew xuya dike. Dubare bixebitin?
Merheba. Gelek sipas. Ev kar wek charm.
Gelek spas Douglas. Ev bêkêmasî dixebite.
Ez dizanim ku ev formula kar dike, lê ez nikarim bibînim ku tîrêjê erdê li ku tê hesibandin. Kes dikare min ronî bike, ji kerema xwe?
Tim, ji bo ravekirinek bêkêmasî ya formula Haversine (ew ne kod e), gotara Wikipedia-yê binihêrin: http://en.wikipedia.org/wiki/Haversine_formula
Bedew! Vê yekê pir alîkariya min kir!
Tiştên mezin Douglas. Ma we ceriband ku xala xaçerêzê ya ku Du Xala Dirêj / Lat / Bide dayîn?
Hîn wiya nekiriye, Xan!
Spas dikim Douglas, SQL Query tam ya ku ji min re hewce bû ye, û min fikirîn ku divê ez bixwe binivîsim. We ez ji belkî demjimêrên fêrbûna dirêjahiya dirêjahîyê xilas kirim!
Ez bi berdewamî Peyama Xeletiyê distînim: Stûna nenas 'Dûra' di 'benda ku' de li ser Pirsa MySQL.
Peter, ji kerema xwe şîroveyên din bixwînin. Wusa dixuye ku hin kes neçar bûn ku ji bo WHERE/HAVING hevoksaziyek cûda bikar bînin.
Spas ji bo vê gotara mezin! Tenê koda li ser DB-ya min ceriband û pir baş xebitî!
Douglas, spas ji bo vê koda ecêb. Ez serê xwe dişikînim ka meriv çawa vê yekê li ser portalê civaka xweya GPS-ê dike. Te min saet xilas kir.
Bi bihîstina xweş, Ash!
spas ji bo şandina vê gotara alîkar,
lê ji ber hin sedeman ez dixwazim bipirsim
meriv çawa dûrahiya di navbera hevrêzên hundurê mysql db û hevrêzên ku ji hêla bikarhêner ve di php-ê de têne danîn bistînin?
ji bo zelaltir diyar bike:
1.bikarhêner ji bo hilbijartina daneyên diyarkirî ji db û hevrêzên bikarhêner bixwe divê [id] têxe
2.Pelê php bi karanîna [id] daneya armancê (koordan) digire û dûv re dûrahiya di navbera bikarhêner û xala armanc de hesab dike
an jî hûn dikarin tenê ji koda jêrîn dûr bigirin?
$qry = "BIJÊRE *,(((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“. $fireh."*pi()/180)) * cos((`Pi () )))*180/pi())*180*180*60) wek dûrbûna ji `MyTable` WHERE dûrahî >= ".$distan." >>>>Ez dikarim dûrahiya ji vir "derxim"?
dîsa spas,
Timmy S
qet ne xem e, min fêhm kir ku "fonksiyona" di php-ê de çawa dixebite
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
gelek sipas!!
ok, her tiştê ku min ceriband nexebite. Yanî tiştê ku min heye dixebite, lê dûr dûr in.
Ma kes dikare bibîne ka vê kodê çi xelet e?
if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['radyus']; echo "Encamên ji bo ".$z; $sql = mysql_query(“Helbet DISTINCT m.zipcode, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. bajar,z1.state JI mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode Û z2.zipcode = $z Û (3963 * acos( truncate( guneh( z2.lat / 57.2958 ) * guneh( m. y1 / 57.2958) + cos( z2.lat / 57.2958) * cos( m.y1 / 57.2958) * cos( m.x1 / 57.2958 – z2.lon / 57.2958), 8) ") an jî die (mysql_error()); while($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['bajar']; $state = $row['state']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = dûr ($lat1, $lon1, $lat2, $lon2); $verified = $row['verastkirî']; if($verified == '1'){ echo ""; echo "".$store.""; echo $dis . "mile(yên) dûr"; echo ""; } else { echo "".$store.""; echo $dis . "mile(yên) dûr"; echo ""; } }}
koda min fonksiyonên.php
fonksiyona getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $theta = $longitude1 – $longitude2; $dûr = (guneh(deg2rad($latitude1)) * guneh(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $dûr = acos($dûr); $dûr = rad2deg($dûr); $distan = $dûr * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } vegere (dor($dûr,2)); }
Berî pêşî spas
Spas ji bo vê gotarê. Bi koda min re baş dixebite. 🙂
Hey Douglas, gotara mezin. Min ravekirina te ya têgehên erdnîgarî û kodê bi rastî balkêş dît. Pêşniyara min tenê ew e ku cîh û kodê ji bo pêşandanê veqetînin (wek mînak Stackoverflow). Ez fêm dikim ku hûn dixwazin cîhê biparêzin, lê cîhê koda kevneşopî / vekêşana kevneşopî dê ji min re, wekî bernamenûs, xwendin û veqetandinê pir hêsantir bike. Herçi jî, ew tiştek piçûk e. Karê mezin berdewam bikin.
Spas! Min post hinekî guhertiye… lê hevkêşan ew qas cîh digirin û ew qas dirêj in ku ez ne bawer im ku ew pir zêde dibe alîkar.
Gelek sipas.
Li vir dema ku bi fonksiyonê re bikar tînin em celebek dûrbûnê digirin.. dema ku pirsê bikar tînin cûreyek dûrbûna wê ya din tê
Ez dûrahiya di navbera du dewletan de hesab nakim
Gelek spas ji bo tan hermoso codigo…
Thisd i fonksiyonên cosinus baş. Ez matematîkê nizanim, lê spas!
Karê Mezin… 🙂 (y)
Zûtir xuya dike (mysql 5.9) ku di hilbijartinê de du caran formula bikar bîne û li ku derê:
$formula = "(((acos(sin((".$latitude."*pi()/180)) * sin((`Pergalî"*pi()/180))+cos((".$latitude. ”*pi()/180)) * cos((`Gerahî`*pi()/180)) * cos(((“.$dirêjahî.”-`Dengî`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'HILBIJARTIN *, '.$formula.' wek dûrbûna JI tabloya WHERE '..$formula.' <= '.$distance;
spas…
nexebite eger
"WHERE dûr"
kar eger
"Dûra HEBÛN"
Gelek spas ji bo parvekirina vê gotarê. ew pir alîkar e.
PHP di destpêkê de wekî platformek nivîsandinê ya hêsan a bi navê "Rûpela Mala Kesane" hate afirandin. Naha PHP (kurteya Pêşkêşkera Hypertext) alternatîfek teknolojiya Rûpelên Pêşkêşkara Çalak (ASP) ya Microsoft-ê ye.
PHP zimanek çavkaniya vekirî ya serverê ye ku ji bo afirandina rûpelên malperê yên dînamîkî tê bikar anîn. Ew dikare di nav HTML-ê de were bicîh kirin. PHP bi gelemperî bi databasek MySQL re li ser serverên malperê Linux/UNIX tê bikar anîn. Dibe ku ew zimanê nivîsandinê yê herî populer e.
Min dît ku çareseriya jorîn bi rêkûpêk naxebite.
Divê ez biguherim:
$qqq = "BIJÊRE *,(((acos(sin((".$latitude."*pi()/180)) * sin((`latt`*pi()/180))+cos((" . $latitude . "*pi()/180)) * cos((`latt`*pi()/180)) * cos(((" . $longitude. "- `dirêj`)*pi()/180) )))*180/pi())*60*1.1515) wek dûrbûna FROM `qeyd` “;
Spas Kupendra!
spas dikim birêz ku bêkêmasî dixebitî.. lê pirsek min heye ger ez bixwazim bêyî xala dehiyê derxim wê hingê ez dikarim çi bikim..?
Me evîn peyda kir.
Silav, ji kerema xwe ez ê bi rastî li ser vê yekê hewceyê alîkariya we bikim.
Min ji servera xweya webê re daxwazek wergirt
53.47792 = $latitude
-2.23389 = dirêjahiya $
û 20 = dûrahiya ku ez dixwazim bigirim
Lêbelê bi karanîna formula we, ew hemî rêzikên di db-ya min de vedigire
$results = DB::hilbijêre(DB::raw("HILBIJARTIN *, (((acos(sin((".$latitude."pi()/180)) * guneh((latpi()/180))+cos((."$latitude."pi()/180)) * cos((latpi()/180)) * cos(((".$dirêj."- lng)pi()/180))))180/pi())601.1515*1.609344) wek dûrbûna nîşankeran HAVING dûr >= “.$distance ));
[{“id”:1,”nav”:”Frankie Johnnie & Luigo Too”,”navnîşan”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, "dûr":16079.294719663},{"id":2,"nav":"Pîzzeryaya Amici's East Coast","navnîşan":"790 Castro St, Mountain View, CA","lat":37.387138366699,"lng": -122.08323669434,"dûr":16079.175940152},{"id":3,"nav":"Kapp's Pizza Bar & Grill","navnîşan":"191 Castro St, Mountain View, CA","lat":37.393886566162, "lng":-122.07891845703,"dûr":16078.381373826},{"id":4,"nav":"Pîzza Maseya Dor: Çiyayê View","navnîşan":"570 N Shoreline Blvd, Mountain View, CA", ”lat”:37.402652740479,”lng”:-122.07935333252,”dûr”:16077.420540582},{“id”:5,”nav”:”Tony & Alba's Pizza & Pasta”,”navnîşana Çiyayê619,Escu”: Nêrîn, CA","lat":37.394012451172,"lng":-122.09552764893,"dûr":16078.563225154},{"id":6,"nav":"Pîzza 4546-ê ya oreganoyê:"37.401725769043adresa Pîzayê bi dara Oregano:"122.11464691162 El Camino Real, Los Altos, CA","lat":16077.937560795,"lng":-7,"dûr":24},{" id":53.485118865967,""nav":"Bar û grill","navnîşan":"2.1828699111938 Whiteley Street, Manchester","lat":8038.7620112314,"lng":-XNUMX,"dûr":XNUMX]]
Ez dixwazim tenê rêzên bi 20 mîlî vegerînim lê ew hemî rêzan tîne. Ji kerema xwe ez çi xelet dikim
Ez li pirseke bi heman rengî digerim lê piçekî pêş de çûm - bi kurtî ev e ku meriv hemî koordînatan di nav 2 mîl ji her koordînatekê de kom bike û dûv re di her komê de çend koordînatan bijmêre û tenê komeke ku xwediyê herî zêde koordînatan e - derxe. di nav komên ku herî zêde koordînatên wan hene de ji yek komê zêdetir hene - bi tenê koma tesadufî ji komên bi heman hejmara herî mezin derdixin -
Ji bo parvekirina gelekî spas.