Хаверсин формуласын колдонуу менен кеңдик жана узундук чекиттеринин ортосундагы чоң тегерек аралыкты эсептеңиз же сураңыз (PHP, Python, MySQL, MSSQL мисалдары)

Haversine Formula - Great Circle Distance - PHP, Python, MySQL

Ушул айда мен PHP жана MySQL программаларында ГИС боюнча бир аз программаладым. Торду аңдып отуруп, чындыгында, айрымдарын таба албай кыйналдым Географиялык эсептөөлөр эки жердин ортосундагы аралыкты табуу үчүн, аларды ушул жерде бөлүшкүм келди.

Учуунун узактыгы менен Европанын учуу картасы

Эки чекиттин ортосундагы аралыкты эсептөөнүн жөнөкөй жолу - үч бурчтуктун гипотенузасын эсептөө үчүн Пифагор формуласы (A² + B² = C²). Бул белгилүү Евклид аралык.

Бул кызыктуу башталыш, бирок географияга туура келбейт, анткени кеңдик жана узундук сызыктарынын ортосундагы аралык ушул бирдей аралыктар эмес бөлөк. Экваторго жакындаган сайын, кеңдик сызыктары бири-биринен алыстай берет. Эгерде сиз кандайдыр бир жөнөкөй триангуляция теңдемесин колдонгон болсоңуз, анда ал Жердин кыйшайып кетишинен улам бир жерде аралыкты так өлчөп, экинчисинде өтө туура эмес болушу мүмкүн.

Чоң тегерек аралык

Жерди айланып өткөн узак аралыктарга чыккан маршруттар катары белгилүү Чоң тегерек аралык. Башкача айтканда... шардагы эки чекиттин ортосундагы эң кыска аралык жалпак картадагы чекиттерден башкача. Муну кеңдик менен узундуктун сызыктары бирдей эместиги менен айкалыштырсаңыз… жана сизде кыйын эсептөө бар.

Бул жерде Great Circles кандайча иштей тургандыгы жөнүндө фантастикалык видео түшүндүрмө бар.

Гаверсин формуласы

Жердин ийрилигин колдонгон аралык аралык Гаверсин формуласы, жердин кыйшайышына мүмкүнчүлүк берүүчү тригонометрияны колдонот. Жердеги 2 жердин ортосундагы аралыкты (карга учуп баратканда) тапканыңызда, түз сызык - бул жаа.

Бул аба каттамында колдонулат - сиз учуулардын чыныгы картасын карап көрдүңүз беле? Себеби аркада учуп учкан жериңизге караганда кыска.

PHP: Кеңдик менен Узундуктун 2 пунктунун ортосундагы аралыкты эсептөө

Бул жерде эки чекиттин ортосундагы аралыкты эсептөө үчүн РНР формуласы (Mile vs. Kilometre конверсиясы менен бирге) эки ондук белгиге тегеректелет.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
  $theta = $longitude1 - $longitude2; 
  $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
  $distance = acos($distance); 
  $distance = rad2deg($distance); 
  $distance = $distance * 60 * 1.1515; 
  switch($unit) { 
    case 'miles': 
      break; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($distance,2)); 
}

өзгөрмөлөр болуп төмөнкүлөр саналат:

  • $Latitude1 – биринчи жайгашкан жериңиздин кеңдиги үчүн өзгөрмө.
  • $Узундук1 – биринчи жайгашкан жериңиздин узундугу үчүн өзгөрмө
  • $Latitude2 – экинчи жайгашкан жериңиздин кеңдиги үчүн өзгөрмө.
  • $Узундук2 – экинчи жайгашкан жериңиздин узундугу үчүн өзгөрмө.
  • $бирдик – демейки болуу ми. Бул жаңыртылышы же катары өтүшү мүмкүн километр.

Python: кеңдик менен узундуктун 2 чекитинин ортосундагы аралыкты эсептеңиз

Кандай болгон күндө да, бул жерде эки чекиттин ортосундагы аралыкты эсептөө үчүн Python формуласы (Милге каршы Километрге айландыруу менен бирге) эки ондук орунга тегеректелет. Менин уулума, Билл Каррга, ал маалымат таануучу болуп саналат OpenINSIGHTS, код үчүн.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * pi / 180
    return radians

def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
    
    theta = longitude1 - longitude2
    
    distance = 60 * 1.1515 * rad2deg(
        arccos(
            (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + 
            (cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

өзгөрмөлөр болуп төмөнкүлөр саналат:

  • кеңдик1 – биринчи жайгашкан жериңиз үчүн өзгөрмө тууралык.
  • узундук1 – биринчи жайгашкан жериңиз үчүн өзгөрмө узактык
  • кеңдик2 – экинчи жайгашкан жериңиз үчүн өзгөрмө тууралык.
  • узундук2 – экинчи жайгашкан жериңиз үчүн өзгөрмө узактык.
  • бирдиги – демейки болуу ми. Бул жаңыртылышы же катары өтүшү мүмкүн километр.

MySQL: Кеңдик жана узундукту колдонуу менен мильдердеги аралыкты эсептөө менен диапазондогу бардык жазууларды алуу

Бардык жазууларды белгилүү аралыкта табуу үчүн эсептөө үчүн SQL колдонсо болот. Бул мисалда, MyTable'ден сураныч, My $ Табулатура жана $ Longitude боюнча жайгашкан жериме чейинки аралыктын өзгөрүшү $ (Майлс) аз же барабар болгон бардык жазууларды табуу үчүн:

Белгилүү бир жазуунун бардыгын алуу суроосу аралык узундуктун жана узундуктун эки чекитинин ортосундагы чакырым аралыкты эсептөө менен:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."

Сиз муну жөндөшүңүз керек болот:

  • $ узундук - бул PHP өзгөрмөсү, мен чекиттин узунунан өтүп жатам.
  • $ туурасы - бул PHP өзгөрмөсү, мен чекиттин узунунан өтүп жатам.
  • $ аралык - бул бардык жазууларды азыраак же барабар тапкыңыз келген аралык.
  • стол - бул таблица ... аны таблицанын аты менен алмаштыргың келет.
  • тууралык - бул сенин кеңдигиңдин талаасы.
  • узактык - бул сенин узун талааң.

MySQL: Кеңдик жана узундукту колдонуу менен километрде аралыкты эсептөө аркылуу диапазондогу бардык жазууларды алуу

Бул жерде SQL сурамы MySQLде километрди колдонуп:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."

Сиз муну жөндөшүңүз керек болот:

  • $ узундук - бул PHP өзгөрмөсү, мен чекиттин узунунан өтүп жатам.
  • $ туурасы - бул PHP өзгөрмөсү, мен чекиттин узунунан өтүп жатам.
  • $ аралык - бул бардык жазууларды азыраак же барабар тапкыңыз келген аралык.
  • стол - бул таблица ... аны таблицанын аты менен алмаштыргың келет.
  • тууралык - бул сенин кеңдигиңдин талаасы.
  • узактык - бул сенин узун талааң.

Мен бул кодду Түндүк Америка боюнча 1,000ден ашуун жайгашкан чекене дүкөн үчүн пайдаланган ишкана картасын түзүүчү платформада колдондум жана ал сонун иштеди.

Microsoft SQL Server Geographic Distance: STDistance

Эгер сиз Microsoft SQL Server колдонуп жатсаңыз, алар өз функцияларын сунушташат, STDistance 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);  

Манаш Сахого шляпа учу, VP жана архитектор Highbridge.

77 Comments

  1. 1

    Бөлүшкөнүңүз үчүн чоң рахмат. Бул көчүрүү жана чаптоо оңой жумуш болчу жана сонун иштейт. Сиз мага көп убакытты сактап калдыңыз.
    Маалым болгондой, Cге өтүүчү кимдир бирөө үчүн:
    double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }

  2. 2

    Посттун абдан жакшы бөлүгү - абдан жакшы иштеди - мен бир гана лат-узун кармап турган столдун атын өзгөртүүгө туура келди. Бул абдан тез иштейт.. Менде аз сандагы лат-лонгдор бар (<400), бирок бул жакшы масштабда болот деп ойлойм. Жакшы сайт - мен аны del.icio.us аккаунтума коштум жана дайыма текшерип турам.

  3. 4
  4. 5

    Мен бир күн бою аралыкты эсептөө үчүн издедим жана harversine алгоритмин таптым, аны sql билдирүүсүнө кантип киргизүүгө мисал келтиргениңиз үчүн рахмат. Рахмат жана салам, Даниел

  5. 8

    Менимче, сиздин SQLиңизге ээ билдирүү керек.
    ордуна WHERE аралык <= $distance сизге керек болушу мүмкүн
    HAVING аралыкты колдонуңуз <= $distance

    болбосо мага бир топ убакытты жана энергияны үнөмдөгөнүңүз үчүн рахмат.

    • 9

      Салам Давид,

      Эгер сиз GROUP BY операторунун кандайдыр бир түрүн жасап жатсаңыз, сизге HAVING керек болот. Мен жогорудагы мисалда муну кылбайм.

      Даг

  6. 10
  7. 11
  8. 12

    Бул кодду бөлүшүү үчүн чоң рахмат. Бул мага өнүктүрүү үчүн көп убакытты сактап калды. Ошондой эле, MySQL 5.x үчүн HAVING билдирүүсү зарыл экенин көрсөткөн окурмандарыңызга рахмат. Абдан пайдалуу.

  9. 14

    Жогорудагы формула мага көп убакытты үнөмдөп жатат. Чоң рахмат.
    Мен дагы NMEA форматы менен Даражалардын ортосунда которулушум керек. Мен барактын ылдый жагындагы бул URL дарегинен формула таптым. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    Кимдир бирөө муну кантип текшерүүнү билет?

    Рахмат сага!
    Гарри

  10. 15
  11. 16

    Мен дагы WHERE мен үчүн иштебегенин таптым. Аны HAVING деп өзгөртүп, баары мыкты иштейт. Башында комментарийлерди окуган жокмун жана аны уяча тандоо аркылуу кайра жаздым. Экөө тең жакшы иштейт.

  12. 17

    MySQLде жазылган скрипт үчүн чоң рахмат, бир нече кичине оңдоолорду киргизүүгө туура келди (БАР) 🙂
    Салам жумуш

  13. 18

    Абдан пайдалуу, чоң рахмат! Мен "КАЙДА" эмес, жаңы "HAVING" менен көйгөйлөргө туш болуп жаткам, бирок бул жердеги комментарийлерди окуп чыккандан кийин (жарым саатка жакын тишимди кычыраткандан кийин =P), мен анын жакшы иштеп калдым. Рахмат ^_^

  14. 19
  15. 20

    Мындай тандалган билдирүү абдан эсептөө интенсивдүү жана ошондуктан жай болорун унутпаңыз. Эгер сизде мындай суроолор көп болсо, анда ал бат эле нерселерди батып кетиши мүмкүн.

    Бир кыйла азыраак интенсивдуу ыкма болуп эсептелген аралык менен аныкталган SQUARE аймагын колдонуу менен биринчи (чийки) тандоону жүргүзүү болуп саналат, башкача айтканда, "таблица аталышынан * тандоо, мында lat1 жана lat2 ортосундагы кеңдик жана узундук 1 менен узундук2 ортосундагы узундук". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, lon менен окшош. latdiff ~= расстояние / 111 (км үчүн), же расстояние/69 миля, анткени кеңдиктин 1 даражасы ~ 111 км (бир аз өзгөрүү, анткени жер бир аз сүйрү, бирок бул үчүн жетиштүү). лондифф = расстояние / (abs(cos(deg2rad(latitude))*111)) — же миль үчүн 69 (чынында вариацияларды эсепке алуу үчүн бир аз чоңураак квадратты ала аласыз). Андан кийин натыйжаны алып, аны радиалдык тандоого киргизиңиз. Жөн гана чектен тышкаркы координаттарды эсепке алууну унутпаңыз, башкача айтканда, алгылыктуу узундуктун диапазону -180ден +180ге чейин жана алгылыктуу кеңдиктин диапазону -90дон +90го чейин - эгерде сиздин латдифф же лондиффиңиз бул диапазондун чегинен чыгып кетсе . Көпчүлүк учурларда бул колдонулбашы мүмкүн, анткени ал Тынч океан аркылуу уюлдан уюлга чейинки сызык боюнча эсептөөлөргө гана таасирин тийгизет, бирок ал Чукотканын бир бөлүгүн жана Алясканын бир бөлүгүн кесип өтөт.

    Муну менен биз жасай турган нерсе бул сиз эсептеген упайлардын санын олуттуу кыскартуу. Эгерде сизде маалымат базасында болжол менен бирдей бөлүштүрүлгөн миллион глобалдык чекиттер болсо жана сиз 100 км аралыкта издөөнү кааласаңыз, анда сиздин биринчи (тез) издөөңүз 10000 чарчы км аянтты түзөт жана болжол менен 20га жакын натыйжаларды берет (бир жерде бирдей бөлүштүрүүнүн негизинде). бетинин аянты болжол менен 500M чарчы км), бул татаал аралыкты эсептөөнү бул суроо үчүн миллион жолу эмес, 20 жолу иштетесиз дегенди билдирет.

    • 21

      Мисалдагы кичинекей ката… бул 50 км (100 эмес) үчүн болмок, анткени биз… чарчыбыздын “радиусун” карап жатабыз.

      • 22

        Фантастикалык кеңеш! Мен чындыгында иштеп чыгуучу менен иштедим, ал ички квадратты тарткан функцияны, андан кийин калган чекиттерди кошуу жана алып салуу үчүн периметрдин айланасында "квадраттарды" түзгөн рекурсивдүү функцияны жазган. Натыйжада укмуштуудай тез натыйжа болду - ал миллиондогон упайларды микросекундтарда баалай алган.

        Жогорудагы менин мамилем, албетте, "орой", бирок жөндөмдүү. Дагы бир жолу рахмат!

        • 23

          Даг,

          Мен лат узун чекиттин көп бурчтуктун ичинде экендигине баа берүү үчүн MySQL жана PHP колдонууга аракет кылып жатам. Иштеп чыгуучу досуңуз бул тапшырманы кантип аткаруу керектиги боюнча кандайдыр бир мисалдарды жарыялаганын билесизби. Же жакшы мисалдарды билесизби. Алдын ала рахмат.

  16. 24

    Баарына салам, бул менин сыноо SQL билдирүүм:

    SELECT DISTINCT area_id, (
    (
    (
    acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
    `lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
    `lat_dec` * pi( ) /180 )
    ) * cos( (
    ( 51.02 - `lon_dec` ) * pi( ) /180 )
    )
    )
    ) *180 / pi( )
    ) *60 * 1.1515 * 1.609344
    ) AS distance
    FROM `post_codes` WHERE distance <= 50

    жана Mysql мага бул аралыкты айтып жатат, мамыча катары жок, мен буйрукту колдоно алам, мен аны WHERE жок кыла алам, ал иштейт, бирок аны менен эмес…

    • 25

      "WHERE расстояние" дегенди "HAVING расстояние" менен алмаштырыңыз.
      Шарм сыяктуу иштейт, рахмат, Дуглас!

  17. 26

    Бул сонун, бирок канаттуулар учуп жүргөндөй. Бул кандайдыр бир жол менен (балким, жолдорду колдонуу ж. Мен дагы эле PHPде кыдыруучу сатуучу көйгөйүн натыйжалуу чечүүнү сунуш кыла турган симуляцияланган күйдүрүү функциясын жасай элекмин. Бирок мен сиздин кодуңуздун айрымдарын кайра колдоно алам деп ойлойм.

  18. 27
  19. 28

    Жакшы макала! Мен эки чекиттин ортосундагы аралыкты кантип эсептөө керектигин сүрөттөгөн көптөгөн макалаларды таптым, бирок мен чындап эле SQL үзүндүсүн издеп жүргөм.

  20. 29
  21. 30
  22. 31
  23. 32
  24. 36

    Менин көйгөйүмдү чечкен бул баракты табуу үчүн 2 күндүк изилдөө. Мен WolframAlphaны жок кылып, математикамды тереңдеткеним жакшы окшойт. WHEREден HAVINGге өзгөртүү менин сценарийим иштөө тартибинде. РАХМАТ

  25. 37
    • 38

      Рахмат Георги. Мен 'дистанция' тилкеси табылган жок. Бир жолу мен КАЙДА дегенди өзгөртүп, ал тумар сыяктуу иштеди!

  26. 39

    Бул мен бул жөнүндө тапкан биринчи бет болушун каалайм. Көптөгөн ар кандай буйруктарды сынап көргөндөн кийин, бул жалгыз гана туура иштеген жана менин жеке маалымат базасына туура келүү үчүн минималдуу өзгөртүүлөр керек болчу.
    Рахмат абдан көп!

  27. 40

    Бул мен бул жөнүндө тапкан биринчи бет болушун каалайм. Көптөгөн ар кандай буйруктарды сынап көргөндөн кийин, бул жалгыз гана туура иштеген жана менин жеке маалымат базасына туура келүү үчүн минималдуу өзгөртүүлөр керек болчу.
    Рахмат абдан көп!

  28. 41
  29. 42
  30. 43
  31. 45
  32. 46
  33. 47

    Мен бул формула иштей турганын билем, бирок жердин радиусу кайсы жерде эске алынганын көрө албайм. Кимдир бирөө мени түшүндүрүп бере алат, сураныч?

  34. 49
  35. 50

    Дуглас сонун нерселер. Эки чекиттин Узун / Лат / подшипниктерин эске алып, кесилиш чекитин алууга аракет кылдыңызбы?

  36. 52

    Рахмат Дуглас, SQL Query так мага керектүү нерсе жана мен аны өзүм жазыш керек деп ойлогом. Сиз мени бир нече саат бою кеңдикти үйрөнүү ийри сызыгынан куткардыңыз!

  37. 53
  38. 55

    Бул улуу макала үчүн рахмат! Жөн эле менин DBдагы кодду сынап көрдүм жана сонун иштедим! 

  39. 56

    Дуглас, бул укмуштуу код үчүн рахмат. Менин GPS жамааттык порталымда муну кантип кылуу керек деп башымды жарып жаттым. Сиз мага сааттарды сактап калдыңыз.

  40. 58

    бул пайдалуу макаланы жайгаштыруу үчүн рахмат,  
    бирок эмнегедир сурагым келет
    MySQL db ичиндеги коорддор менен колдонуучу PHPге киргизген коорддордун ортосундагы аралыкты кантип алса болот?
    айкыныраак сүрөттөп берүү үчүн:
    1.колдонуучу DB жана колдонуучунун өзүнүн коорддорунан көрсөтүлгөн маалыматтарды тандоо үчүн [id] киргизиши керек
    2.PHP файлы [id] аркылуу максаттуу маалыматтарды (коорддорду) алат, андан кийин колдонуучу менен максаттуу чекиттин ортосундагы аралыкты эсептейт

    же жөн гана төмөнкү коддон аралыкты ала аласызбы?

    $qry = "SELECT *,(((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((". $latitude.”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$longitude.”- `Uzunluk`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) `MyTable` FROM ДАСТЫК катары WHERE расстояние >= “.$distance.” >>>>Мен бул жерден алыстыкка "чыгарып" алсам болобу?
    дагы бир жолу рахмат,
    Тимми С

  41. 60

    макул, мен аракет кылгандын баары иштебей жатат. Айтайын дегеним, менде бар нерсе иштейт, бирок аралыктар алыс.

    Кимдир бирөө бул код менен эмне туура эмес экенин көрө алабы?

    if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['радиус']; echo ““.$z үчүн натыйжалар; $sql = mysql_query(“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 WHERE m.zipcode = z1.zipcode ЖАНА z2.zipcode = $z ЖАНА (3963 * acos( truncate( sin( z2.lat / 57.2958 ) .) * sin(m) y1 / 57.2958 ) + cos( z2.lat / 57.2958 ) * cos( m.y1 / 57.2958 ) * cos( m.x1 / 57.2958 – z2.lon / 57.2958 ) , 8 <) = $ r )" (mysql_error()); while($row = mysql_fetch_array( $sql )) { $store1 = $row['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$row['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 = аралык($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo ""; echo “”.$store.””; echo $dis . ” миля(лар) алыстыкта”; echo ""; } else { echo “”.$store.””; echo $dis . ” миля(лар) алыстыкта”; echo ""; } }}

    my functions.php коду
    функция getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $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); $дистанция = $дистанция * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } return (round($distance,2)); }

    Алдын ала рахмат

  42. 61
  43. 62

    Эй Дуглас, сонун макала. Географиялык түшүнүктөр жана код боюнча түшүндүрмөңүз мага абдан кызыктуу болду. Менин жалгыз сунушум мейкиндик жана дисплей үчүн кодду чегинүү (мисалы, Stackoverflow сыяктуу). Сиз мейкиндикти үнөмдөөнү каалап жатканыңызды түшүнөм, бирок кадимки код аралыгы / чегинүү мага программист катары окууну жана бөлүүнү бир топ жеңилдетет. Эмнеси болсо да, бул кичинекей нерсе. Эң сонун ишти уланта бер.

    • 63

      Рахмат! Мен постту бир аз өзгөртүп койдум... бирок теңдемелер ушунчалык көп орунду ээлеп, ушунчалык узун болгондуктан, бул өтө көп жардам берерине ишенбейм.

  44. 64
  45. 65

    бул жерде функция менен колдонууда биз аралыктын бир түрүн алабыз..суроону колдонууда анын башка түрү келе жатат

  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    тандоодо формуланы эки жолу колдонуу тезирээк көрүнөт (mysql 5.9) жана бул жерде:
    $formula = "(((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((".$latitude." ”*pi()/180)) * cos((`Кондук`*pi()/180)) * cos(((“.$узундук.”- `Узундук`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
    $sql = 'SELECT *, '.$формула.' '..$формула'.' <= '.$distance;

  51. 71
  52. 72

    Бул макаланы ачканыңыз үчүн чоң рахмат. Бул абдан пайдалуу.
    PHP алгач "Жеке Башкы бет" деп аталган жөнөкөй скрипт платформасы катары түзүлгөн. Бүгүнкү күндө PHP (Hypertext Preprocessor дегендин кыскасы) Microsoftтун Active Server Pages (ASP) технологиясына альтернатива болуп саналат.

    PHP - бул динамикалык веб-баракчаларды түзүү үчүн колдонулган ачык булак сервер тарабы. Аны HTMLге киргизсе болот. PHP көбүнчө Linux/UNIX веб-серверлеринде MySQL маалымат базасы менен бирге колдонулат. Бул, балким, эң популярдуу скрипт тили.

  53. 73

    Мен жогорудагы чечим туура иштебей жатканын таптым.
    Мен төмөнкүгө өзгөрүшүм керек:

    $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) `register` FROM аралыкта “;

  54. 75

    рахмат мырза мыкты иштеп жатат .. бирок менде бир суроо бар, эгерде мен ондук чексиз чыгаргым келсе, анда эмне кылсам болот ..?

    Алдын ала рахмат.

  55. 76

    Саламатсызбы, сураныч, мага бул боюнча сиздин жардамыңыз керек болот.

    Мен веб-сервериме алуу өтүнүчүн жасадым http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $ кеңдик
    -2.23389 = $узундук
    жана 20 = мен алгым келген аралык

    Бирок сиз формуланы колдонуп, ал менин ДБдеги бардык саптарды чыгарат

    $results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude."*pi()/180)) * sin((lat*pi()/180) ))+cos((“.$ кеңдик.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$узундук.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) катары маркерлерден аралыкта HAVING расстояние >= “.$distance ));

    [{“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”,”дареги”:”Alave Escu View, CA”,”lat”:619,”lng”:-37.394012451172,”distance”:122.09552764893},{“id”:16078.563225154,”name”:”Oregano's Wood-Fired Pizza”,”6”: El Camino Real, Los Altos, CA”,”lat”:4546,”lng”:-37.401725769043,”distance”:122.11464691162},{“ id”:16077.937560795,”name”:”The bars and grills”,”address”:”7 Whiteley Street, Манчестер”,”lat”:24,”lng”:-53.485118865967,”distance”:2.1828699111938}]

    Мен 20 миль менен катарларды алгым келет, бирок ал бардык саптарды алып келет. Сураныч, мен эмне туура эмес кылып жатам

  56. 77

    Мен окшош суроону издеп жатам, бирок бир аз ылдамдадым – кыскасы, бул ар бир координаттан 2 миль аралыкта бардык координаттарды топтоп, андан кийин ар бир топтун канча координаттарын санап, эң көп координаттары бар бир гана топту чыгарат – эгерде Сизде эң көп координаттары бар топтордун арасында бирден ашык топ бар – жөн гана эң көп сандагы топтордон туш келди топту чыгарыңыз -

Эмне деп ойлойсуң?

Бул сайт спам азайтуу Akismet колдонот. Сиздин комментарий маалымат кандайча иштелишин Үйрөнүү.