គណនា ឬសាកសួរចម្ងាយរង្វង់ដ៏អស្ចារ្យរវាងចំណុចនៃរយៈទទឹង និងរយៈបណ្តោយដោយប្រើរូបមន្ត Haversine (PHP, Python, MySQL, ឧទាហរណ៍ MSSQL)

រូបមន្ត Haversine - ចម្ងាយរង្វង់ដ៏អស្ចារ្យ - PHP, Python, MySQL

ខែនេះខ្ញុំបានសរសេរកម្មវិធីក្នុងកម្មវិធី PHP និង MySQL បន្តិចទាក់ទងទៅនឹងជីអេសអាយអេស។ ក្រឡេកជុំវិញសំណាញ់ខ្ញុំពិតជាមានការលំបាកក្នុងការស្វែងរករបស់ខ្លះ ការគណនាភូមិសាស្ត្រ ដើម្បីស្វែងរកចម្ងាយរវាងទីតាំងពីរដូច្នេះខ្ញុំចង់ចែករំលែកវានៅទីនេះ។

ផែនទីហោះហើរអ៊ឺរ៉ុបដែលមានចំងាយឆ្ងាយ

វិធីសាមញ្ញក្នុងការគណនាចំងាយរវាងចំនុចពីរគឺការប្រើរូបមន្តពីតាហ្គ័រដើម្បីគណនាអ៊ីប៉ូតេនុសនៃត្រីកោណ (A² + B² = C²) ។ នេះត្រូវបានគេស្គាល់ថាជា ចម្ងាយ Euclidean.

នោះគឺជាការចាប់ផ្តើមគួរឱ្យចាប់អារម្មណ៍ប៉ុន្តែវាមិនអនុវត្តជាមួយភូមិសាស្ត្រទេព្រោះចម្ងាយរវាងបន្ទាត់រយៈទទឹងនិងរយៈបណ្តោយ ចម្ងាយមិនស្មើគ្នា ដាច់ពីគ្នា។ នៅពេលអ្នកកាន់តែខិតទៅជិតខ្សែអេក្វាទ័របន្ទាត់រយៈទទឹងដាច់ឆ្ងាយពីគ្នា។ ប្រសិនបើអ្នកប្រើសមីការត្រីកោណប្រភេទខ្លះវាអាចវាស់ចម្ងាយបានយ៉ាងត្រឹមត្រូវនៅក្នុងទីតាំងមួយនិងខុសយ៉ាងខ្លាំងនៅកន្លែងមួយទៀតដោយសារតែភាពកោងនៃផែនដី។

ចម្ងាយរង្វង់ដ៏អស្ចារ្យ

ផ្លូវដែលធ្វើដំណើរឆ្ងាយពីផែនដីត្រូវបានគេស្គាល់ថាជាផ្លូវធ្វើដំណើរ ចម្ងាយរង្វង់ដ៏អស្ចារ្យ. នោះគឺ… ចម្ងាយខ្លីបំផុតរវាងចំណុចពីរនៅលើស្វ៊ែរគឺខុសពីចំនុចនៅលើផែនទីរាបស្មើ។ ផ្សំវាជាមួយនឹងការពិតដែលថាខ្សែរយៈទទឹង និងរយៈបណ្តោយមិនស្មើគ្នា... ហើយអ្នកមានការពិបាកគណនា។

នេះគឺជាការពន្យល់ជាវីដេអូដ៏អស្ចារ្យអំពីរបៀបដែលមហារង្វង់។

រូបមន្តហាវ៉េន

ចម្ងាយដោយប្រើកោងនៃផែនដីត្រូវបានដាក់បញ្ចូលនៅក្នុងឯកសារ រូបមន្តហាវ៉េនដែលប្រើត្រីកោណមាត្រដើម្បីអនុញ្ញាតឱ្យកោងនៃផែនដី។ នៅពេលអ្នករកឃើញចម្ងាយរវាង ២ កន្លែងនៅលើផែនដី (ដូចជាសត្វក្អែករុយ) បន្ទាត់ត្រង់គឺពិតជាធ្នូ។

នេះអាចអនុវត្តបាននៅក្នុងការហោះហើរតាមអាកាស - តើអ្នកធ្លាប់បានមើលផែនទីនៃជើងហោះហើរពិតប្រាកដហើយបានកត់សម្គាល់ឃើញថាវាមានកាំជណ្ដើរ? នោះដោយសារតែវាខ្លីជាងមុនក្នុងការហោះហើរនៅក្នុងសំខាន់មួយរវាងពីរចំនុចជាងទីតាំងដោយផ្ទាល់។

PHP: គណនាចំងាយរវាង ២ ចំនុចនៃរយៈទទឹងនិងរយៈបណ្តោយ

នេះជារូបមន្ត PHP សម្រាប់គណនាចម្ងាយរវាងចំណុចពីរ (រួមជាមួយការបំប្លែង Mile vs. Kilometer) បង្គត់ទៅខ្ទង់ទសភាគពីរ។

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 - អថេរសម្រាប់រយៈទទឹងទីតាំងដំបូងរបស់អ្នក។
  • $Longitude1 - អថេរសម្រាប់រយៈបណ្តោយទីតាំងដំបូងរបស់អ្នក។
  • $Latitude2 - អថេរសម្រាប់រយៈទទឹងទីតាំងទីពីររបស់អ្នក។
  • $Longitude2 - អថេរសម្រាប់រយៈបណ្តោយទីតាំងទីពីររបស់អ្នក។
  • $ ឯកតា - លំនាំដើម រាប់ពាន់នាក់. នេះអាចត្រូវបានធ្វើបច្ចុប្បន្នភាពឬឆ្លងកាត់ គីឡូម៉ែត្រ។.

Python៖ គណនាចម្ងាយរវាង 2 ចំនុចនៃរយៈទទឹង និងរយៈបណ្តោយ

យ៉ាង​ណា​ក៏​ដោយ នេះ​ជា​រូបមន្ត Python សម្រាប់​គណនា​ចម្ងាយ​រវាង​ចំណុច​ពីរ (រួម​នឹង​ការ​បំប្លែង Mile vs. Kilometer) ដែល​បង្គត់​ទៅ​ខ្ទង់​ទសភាគ​ពីរ។ ផ្តល់កិត្តិយសដល់កូនប្រុសរបស់ខ្ញុំ លោក Bill Karr ដែលជាអ្នកវិទ្យាសាស្ត្រទិន្នន័យសម្រាប់ បើកការយល់ដឹងសម្រាប់លេខកូដ។

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)

អថេរគឺ៖

  • រយៈទទឹង ១ - អថេរសម្រាប់ទីតាំងដំបូងរបស់អ្នក។ latitude.
  • រយៈបណ្តោយ ១ - អថេរសម្រាប់ទីតាំងដំបូងរបស់អ្នក។ រយៈបណ្តោយ
  • រយៈទទឹង ១ - អថេរសម្រាប់ទីតាំងទីពីររបស់អ្នក។ latitude.
  • រយៈបណ្តោយ ១ - អថេរសម្រាប់ទីតាំងទីពីររបស់អ្នក។ រយៈបណ្តោយ.
  • អង្គភាព - លំនាំដើម រាប់ពាន់នាក់. នេះអាចត្រូវបានធ្វើបច្ចុប្បន្នភាពឬឆ្លងកាត់ គីឡូម៉ែត្រ។.

MySQL: ទាញយកកំណត់ត្រាទាំងអស់ក្នុងជួរមួយដោយគណនាចម្ងាយជាម៉ាយដោយប្រើរយៈទទឹង និងរយៈបណ្តោយ

វាក៏អាចប្រើ SQL ដើម្បីធ្វើការគណនាដើម្បីរកកំណត់ត្រាទាំងអស់នៅចំងាយជាក់លាក់មួយ។ ក្នុងឧទាហរណ៍នេះខ្ញុំនឹងសាកសួរ MyTable នៅក្នុង MySQL ដើម្បីរកកំណត់ត្រាទាំងអស់ដែលតូចជាងឬស្មើអថេរ $ distance (គិតជាម៉ែល) ទៅកាន់ទីតាំងរបស់ខ្ញុំនៅ $ latitude និង $ 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 ដែលខ្ញុំកំពុងឆ្លងកាត់រយៈបណ្តោយនៃចំនុច។
  • ចម្ងាយ $ - នេះគឺជាចម្ងាយដែលអ្នកចង់ស្វែងរកកំណត់ត្រាទាំងអស់តិចឬស្មើ។
  • តារាង - នេះជាតារាង ... អ្នកនឹងចង់ជំនួសឈ្មោះតុរបស់អ្នក។
  • latitude - នេះគឺជាវាលនៃរយៈទទឹងរបស់អ្នក។
  • រយៈបណ្តោយ - នេះគឺជាវិស័យនៃរយៈបណ្តោយរបស់អ្នក។

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 ដែលខ្ញុំកំពុងឆ្លងកាត់រយៈបណ្តោយនៃចំនុច។
  • ចម្ងាយ $ - នេះគឺជាចម្ងាយដែលអ្នកចង់ស្វែងរកកំណត់ត្រាទាំងអស់តិចឬស្មើ។
  • តារាង - នេះជាតារាង ... អ្នកនឹងចង់ជំនួសឈ្មោះតុរបស់អ្នក។
  • latitude - នេះគឺជាវាលនៃរយៈទទឹងរបស់អ្នក។
  • រយៈបណ្តោយ - នេះគឺជាវិស័យនៃរយៈបណ្តោយរបស់អ្នក។

ខ្ញុំបានប្រើលេខកូដនេះនៅក្នុងកម្មវិធីធ្វើផែនទីសហគ្រាសដែលយើងបានប្រើសម្រាប់ហាងលក់រាយដែលមានទីតាំងជាង ១០០០ កន្លែងនៅអាមេរិកខាងជើងហើយវាដំណើរការបានយ៉ាងល្អ។

ចម្ងាយភូមិសាស្ត្ររបស់ Microsoft SQL Server: STDistance

ប្រសិនបើអ្នកកំពុងប្រើប្រាស់ Microsoft SQL Server ពួកគេផ្តល់មុខងារផ្ទាល់ខ្លួនរបស់ពួកគេ ចម្ងាយផ្លូវ សម្រាប់ការគណនាចម្ងាយរវាងចំណុចពីរដោយប្រើប្រភេទទិន្នន័យភូមិសាស្ត្រ។

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);  

ព័ត៌មានជំនួយដល់ Manash Sahoo, VP និងស្ថាបត្យករនៃ Highbridge.

77 យោបល់

  1. 1

    អរគុណច្រើនសម្រាប់ការចែករំលែក។ នេះជាការងារចម្លង និងបិទភ្ជាប់ដ៏ងាយស្រួល ហើយដំណើរការល្អណាស់។ អ្នក​បាន​សង្គ្រោះ​ខ្ញុំ​ពេល​វេលា​យ៉ាង​ច្រើន។
    FYI សម្រាប់នរណាម្នាក់ដែលបញ្ជូនទៅកាន់ C:
    double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }

  2. 2

    បំណែកនៃការបង្ហោះល្អណាស់ - ដំណើរការល្អណាស់ - ខ្ញុំគ្រាន់តែប្តូរឈ្មោះតុដែលកាន់ឡាតាំង។ វាដំណើរការលឿនណាស់ទៅ.. ខ្ញុំមានបន្ទះបណ្តោយតិចតួច (<400) ប៉ុន្តែខ្ញុំគិតថាវានឹងធ្វើមាត្រដ្ឋានបានល្អ។ គេហទំព័រល្អផងដែរ - ខ្ញុំទើបតែបានបញ្ចូលវាទៅក្នុងគណនី del.icio.us របស់ខ្ញុំ ហើយនឹងពិនិត្យមើលឡើងវិញជាទៀងទាត់។

  3. 4
  4. 5

    ខ្ញុំបានស្វែងរកពេញមួយថ្ងៃសម្រាប់ការគណនាចម្ងាយ ហើយបានរកឃើញ harversine algorithm សូមអរគុណចំពោះអ្នកដែលបានផ្តល់ឧទាហរណ៍អំពីរបៀបដាក់វានៅក្នុងសេចក្តីថ្លែងការណ៍ sql ។ សូមអរគុណ និងជំរាបសួរ ដានីយ៉ែល

  5. 8

    ខ្ញុំគិតថា SQL របស់អ្នកត្រូវការសេចក្តីថ្លែងការណ៍ដែលមាន។
    ជំនួសឱ្យ WHERE distance <= $distance អ្នកប្រហែលជាត្រូវការ
    ប្រើចម្ងាយ HAVING <= $distance

    បើមិនដូច្នេះទេ អរគុណសម្រាប់ការសន្សំពេលវេលា និងថាមពលរបស់ខ្ញុំ។

    • 9

      សួស្តីដាវីឌ

      ប្រសិនបើអ្នកកំពុងធ្វើប្រភេទនៃ GROUP BY សេចក្តីថ្លែងការណ៍ណាមួយ អ្នកនឹងត្រូវការ HAVING ។ ខ្ញុំមិនធ្វើដូចក្នុងឧទាហរណ៍ខាងលើទេ។

      លោក Doug

  6. 10
  7. 11
  8. 12

    អរគុណច្រើនសម្រាប់ការចែករំលែកលេខកូដនេះ។ វា​ជួយ​ខ្ញុំ​ពេលវេលា​អភិវឌ្ឍន៍​បាន​ច្រើន។ ដូចគ្នានេះផងដែរ សូមអរគុណអ្នកអានរបស់អ្នកសម្រាប់ការចង្អុលបង្ហាញថា HAVING statement គឺចាំបាច់សម្រាប់ MySQL 5.x ។ មាន​ប្រយោជន៍​ណាស់។

  9. 14

    រូបមន្ត​ខាង​លើ​ជួយ​សន្សំ​សំចៃ​ពេល​វេលា​បាន​ច្រើន។ អរគុណ​ច្រើន។
    ខ្ញុំក៏ត្រូវប្តូររវាងទម្រង់ NMEA និង Degrees ផងដែរ។ ខ្ញុំបានរកឃើញរូបមន្តមួយនៅ URL នេះនៅខាងក្រោមទំព័រ។ http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    មានអ្នកណាដឹងពីរបៀបផ្ទៀងផ្ទាត់នេះទេ?

    អរគុណ!
    លោក Harry

  10. 15

    ជំរាបសួរ,

    សំណួរមួយទៀត។ តើមានរូបមន្តសម្រាប់ខ្សែអក្សរ NMEA ដូចរូបខាងក្រោមដែរឬទេ?

    1342.7500,N,10052.2287,E

    $GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B

    សូមអរគុណ,
    លោក Harry

  11. 16

    ខ្ញុំក៏បានរកឃើញថា WHERE មិនដំណើរការសម្រាប់ខ្ញុំទេ។ ប្តូរវាទៅជា HAVING ហើយអ្វីៗដំណើរការល្អឥតខ្ចោះ។ ដំបូង​ឡើយ ខ្ញុំ​មិន​បាន​អាន​មតិយោបល់​ទេ ហើយ​សរសេរ​វា​ឡើង​វិញ​ដោយ​ប្រើ​ការ​ជ្រើស​រើស​ដែល​បាន​ដាក់​ជាប់​គ្នា។ ទាំងពីរនឹងដំណើរការល្អ។

  12. 17
  13. 18

    មានប្រយោជន៍មិនគួរឱ្យជឿ សូមអរគុណច្រើន! ខ្ញុំកំពុងមានបញ្ហាខ្លះជាមួយ "HAVING" ថ្មី ជាជាង "WHERE" ប៉ុន្តែនៅពេលដែលខ្ញុំបានអានមតិនៅទីនេះ (បន្ទាប់ពីប្រហែលកន្លះម៉ោងនៃការកិនធ្មេញរបស់ខ្ញុំដោយខកចិត្ត =P) ខ្ញុំទទួលបានវាដំណើរការល្អ។ សូមអរគុណ ^_^

  14. 19
  15. 20

    សូមចាំថា សេចក្តីថ្លែងការដែលបានជ្រើសរើសបែបនេះនឹងមានលក្ខណៈគណនាខ្លាំង ហើយដូច្នេះយឺត។ ប្រសិនបើអ្នកមានសំណួរទាំងនោះច្រើន វាអាចធ្វើអោយអ្វីៗធ្លាក់ចុះយ៉ាងឆាប់រហ័ស។

    វិធីសាស្រ្តមិនសូវខ្លាំងគឺដំណើរការការជ្រើសរើសដំបូង (ឆៅ) ដោយប្រើតំបន់ SQUARE ដែលកំណត់ដោយចម្ងាយគណនា ពោលគឺ “ជ្រើសរើស * ពីតារាងឈ្មោះ ដែលរយៈទទឹងរវាង lat1 និង lat2 និងបណ្តោយរវាង lon1 និង lon2”។ lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff ស្រដៀងនឹង lon ។ latdiff ~= ចម្ងាយ / 111 (សម្រាប់គីឡូម៉ែត្រ) ឬចម្ងាយ / 69 សម្រាប់ម៉ាយល៍ចាប់តាំងពី 1 ដឺក្រេនៃរយៈទទឹងគឺ ~ 111 គីឡូម៉ែត្រ (ការប្រែប្រួលបន្តិចបន្តួចចាប់តាំងពីផែនដីមានរាងពងក្រពើបន្តិចប៉ុន្តែគ្រប់គ្រាន់សម្រាប់គោលបំណងនេះ) ។ londiff = ចម្ងាយ / (abs(cos(deg2rad(រយៈទទឹង))*111)) — ឬ 69 សម្រាប់ម៉ាយល៍ (តាមពិតអ្នកអាចយកការ៉េធំជាងនេះបន្តិច ដើម្បីគណនាការប្រែប្រួល)។ បន្ទាប់មកយកលទ្ធផលនៃនោះហើយបញ្ចូលវាទៅក្នុងការជ្រើសរើសរ៉ាឌីកាល់។ គ្រាន់តែកុំភ្លេចគិតគូរពីកូអរដោនេក្រៅព្រំដែន – ពោលគឺ ជួរនៃរយៈបណ្តោយដែលអាចទទួលយកបានគឺ -180 ដល់ +180 ហើយជួរនៃរយៈទទឹងដែលអាចទទួលយកបានគឺ -90 ដល់ +90 — ក្នុងករណីដែល latdiff ឬ londiff របស់អ្នករត់នៅខាងក្រៅជួរនេះ . សូមចំណាំថា ក្នុងករណីភាគច្រើន វាមិនអាចអនុវត្តបានទេ ព្រោះវាប៉ះពាល់តែការគណនាលើខ្សែបន្ទាត់ឆ្លងកាត់មហាសមុទ្រប៉ាស៊ីហ្វិកពីប៉ូលទៅប៉ូល ទោះបីជាវាកាត់ផ្នែកមួយនៃ Chukotka និងផ្នែកនៃអាឡាស្កាក៏ដោយ។

    អ្វី​ដែល​យើង​សម្រេច​បាន​ដោយ​ការ​នេះ​គឺ​ជា​ការ​កាត់​បន្ថយ​យ៉ាង​ខ្លាំង​នូវ​ចំនួន​ពិន្ទុ​ដែល​អ្នក​ធ្វើ​ការ​គណនា​នេះ។ ប្រសិនបើអ្នកមានចំណុចសកលមួយលាននៅក្នុងមូលដ្ឋានទិន្នន័យដែលបានចែកចាយស្មើៗគ្នា ហើយអ្នកចង់ស្វែងរកក្នុងចម្ងាយ 100 គីឡូម៉ែត្រ នោះការស្វែងរកដំបូងរបស់អ្នក (លឿន) មានផ្ទៃដី 10000 គីឡូម៉ែត្រការ៉េ ហើយប្រហែលជានឹងផ្តល់លទ្ធផលប្រហែល 20 (ផ្អែកលើការចែកចាយសូម្បីតែនៅលើ ផ្ទៃដីប្រហែល 500M sq km) ដែលមានន័យថាអ្នកដំណើរការការគណនាចម្ងាយស្មុគស្មាញ 20 ដងសម្រាប់សំណួរនេះជំនួសឱ្យការរាប់លានដង។

    • 21

      កំហុសតូចតាចនៅក្នុងឧទាហរណ៍… ដែលនឹងស្ថិតនៅក្នុងចម្ងាយ 50 គីឡូម៉ែត្រ (មិនមែន 100) ចាប់តាំងពីយើងកំពុងសម្លឹងមើល “កាំ” នៃ… ការ៉េរបស់យើង។

      • 22

        ដំបូន្មានដ៏អស្ចារ្យ! ខ្ញុំពិតជាបានធ្វើការជាមួយអ្នកអភិវឌ្ឍន៍ដែលសរសេរមុខងារដែលទាញការ៉េខាងក្នុង ហើយបន្ទាប់មកមុខងារដែលបង្កើតឡើងវិញដែលបង្កើត 'ការេ' ជុំវិញបរិវេណដើម្បីរួមបញ្ចូល និងដកចេញចំណុចដែលនៅសល់។ លទ្ធផលនេះគឺជាលទ្ធផលលឿនមិនគួរឱ្យជឿ - គាត់អាចវាយតម្លៃរាប់លានពិន្ទុក្នុងមីក្រូវិនាទី។

        វិធីសាស្រ្តរបស់ខ្ញុំខាងលើគឺពិតជា 'ឆៅ' ប៉ុន្តែមានសមត្ថភាព។ អរគុណ​ម្តង​ទៀត!

        • 23

          ឌុក,

          ខ្ញុំបានព្យាយាមប្រើ mysql និង php ដើម្បីវាយតម្លៃថាតើ lat long point ស្ថិតនៅក្នុងពហុកោណ។ តើ​អ្នក​ដឹង​ទេ​ថា​តើ​មិត្ត​អ្នក​អភិវឌ្ឍន៍​របស់​អ្នក​បាន​បោះពុម្ព​ឧទាហរណ៍​ណា​មួយ​អំពី​របៀប​ដើម្បី​សម្រេច​កិច្ចការ​នេះ​ឬ​អត់។ ឬ​អ្នក​ស្គាល់​គំរូ​ល្អ​ណា​មួយ។ អរគុណ​យ៉ាង​ជ្រាលជ្រៅ។

  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 ហើយវាដំណើរការ ប៉ុន្តែមិនមែនជាមួយវា...

  17. 26

    វាពិតជាអស្ចារ្យណាស់ ទោះជាសត្វស្លាបហើរក៏ដោយ។ វាជាការប្រសើរណាស់ក្នុងការព្យាយាមបញ្ចូល Google maps API ទៅក្នុងវិធីនេះ (ប្រហែលជាប្រើផ្លូវជាដើម) ដោយគ្រាន់តែផ្តល់ជាគំនិតដោយប្រើមធ្យោបាយដឹកជញ្ជូនផ្សេង។ ខ្ញុំនៅតែមិនទាន់បង្កើតមុខងារ annealing ក្លែងធ្វើនៅក្នុង PHP ដែលនឹងអាចផ្តល់នូវដំណោះស្រាយប្រកបដោយប្រសិទ្ធភាពចំពោះបញ្ហាអ្នកលក់ធ្វើដំណើរ។ ប៉ុន្តែខ្ញុំគិតថាខ្ញុំប្រហែលជាអាចប្រើលេខកូដរបស់អ្នកឡើងវិញដើម្បីធ្វើដូច្នេះបាន។

  18. 27

    សួស្តី Douglas,
    សូមអរគុណច្រើនសម្រាប់អត្ថបទនេះ - អ្នកទើបតែបានរក្សាទុកខ្ញុំពេលវេលាយ៉ាងច្រើន។
    ថែរក្សា,
    nimrod @ អ៊ីស្រាអែល

  19. 28

    អត្ថបទល្អ! ខ្ញុំ​បាន​រក​ឃើញ​អត្ថបទ​ជា​ច្រើន​ដែល​រៀប​រាប់​ពី​របៀប​គណនា​ចម្ងាយ​រវាង​ចំណុច​ពីរ ប៉ុន្តែ​ខ្ញុំ​ពិត​ជា​កំពុង​ស្វែង​រក​អត្ថបទ​ខ្លីៗ SQL។

  20. 29
  21. 30

    សូមអរគុណច្រើនចំពោះរូបមន្តនេះ។ វា​បាន​កោរ​សក់​មួយ​រយៈ​លើ​គម្រោង​ទីតាំង​ហាង​ដែល​កំពុង​ញ៉ាំ​អាហារ​ជាមួយ​ខ្ញុំ។

  22. 31

    អរគុណមួយកញ្ចប់។ បន្ទាត់​កូដ​តូច​មួយ​នេះ​បាន​ជួយ​សន្សំ​ពេល​វេលា​ដ៏​ច្រើន​ដល់​ខ្ញុំ​ក្នុង​គម្រោង​ទីតាំង​ហាង!

  23. 32
  24. 36

    2 ថ្ងៃនៃការស្រាវជ្រាវដើម្បីទីបំផុតរកឃើញទំព័រនេះដែលដោះស្រាយបញ្ហារបស់ខ្ញុំ។ មើលទៅខ្ញុំប្រសើរជាងយក WolframAlpha របស់ខ្ញុំចេញ ហើយជក់ចិត្តនឹងគណិតវិទ្យារបស់ខ្ញុំ។ ការផ្លាស់ប្តូរពីកន្លែងទៅ HAVING មានស្គ្រីបរបស់ខ្ញុំតាមលំដាប់លំដោយ។ សូមអរគុណ

  25. 37
  26. 39

    ខ្ញុំប្រាថ្នាថានេះជាទំព័រដំបូងដែលខ្ញុំបានរកឃើញនៅលើនេះ។ បន្ទាប់ពីបានសាកល្បងប្រើពាក្យបញ្ជាផ្សេងៗគ្នាជាច្រើន វាគឺជាកម្មវិធីតែមួយគត់ដែលដំណើរការបានត្រឹមត្រូវ ហើយជាមួយនឹងការផ្លាស់ប្តូរតិចតួចដែលត្រូវការដើម្បីឱ្យសមនឹងមូលដ្ឋានទិន្នន័យផ្ទាល់ខ្លួនរបស់ខ្ញុំ។
    សូមអរគុណច្រើន!

  27. 40

    ខ្ញុំប្រាថ្នាថានេះជាទំព័រដំបូងដែលខ្ញុំបានរកឃើញនៅលើនេះ។ បន្ទាប់ពីបានសាកល្បងប្រើពាក្យបញ្ជាផ្សេងៗគ្នាជាច្រើន វាគឺជាកម្មវិធីតែមួយគត់ដែលដំណើរការបានត្រឹមត្រូវ ហើយជាមួយនឹងការផ្លាស់ប្តូរតិចតួចដែលត្រូវការដើម្បីឱ្យសមនឹងមូលដ្ឋានទិន្នន័យផ្ទាល់ខ្លួនរបស់ខ្ញុំ។
    សូមអរគុណច្រើន!

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

    ខ្ញុំដឹងថារូបមន្តនេះដំណើរការ ប៉ុន្តែខ្ញុំមិនអាចមើលឃើញកន្លែងដែលកាំនៃផែនដីត្រូវបានយកមកពិចារណានោះទេ។ តើមានអ្នកណាអាចបំភ្លឺខ្ញុំបានទេ?

  34. 49
  35. 50
  36. 52

    សូមអរគុណលោក Douglas សំណួរ SQL គឺពិតជាអ្វីដែលខ្ញុំត្រូវការ ហើយខ្ញុំគិតថាខ្ញុំត្រូវតែសរសេរវាដោយខ្លួនឯង។ អ្នកបានសង្គ្រោះខ្ញុំពីខ្សែកោងរៀនរយៈបណ្តោយរយៈទទឹងជាច្រើនម៉ោង!

  37. 53
  38. 55
  39. 56

    Douglas អរគុណសម្រាប់លេខកូដដ៏អស្ចារ្យនេះ។ កំពុងបំបែកក្បាលរបស់ខ្ញុំអំពីរបៀបធ្វើវានៅលើវិបផតថលសហគមន៍ GPS របស់ខ្ញុំ។ អ្នកបានសន្សំខ្ញុំរាប់ម៉ោង។

  40. 58

    អរគុណសម្រាប់ការបង្ហោះអត្ថបទមានប្រយោជន៍នេះ,  
    ប៉ុន្តែសម្រាប់ហេតុផលខ្លះខ្ញុំចង់សួរ
    តើធ្វើដូចម្តេចដើម្បីទទួលបានចម្ងាយរវាង coords នៅខាងក្នុង mysql db និង coords បញ្ចូលទៅក្នុង php ដោយអ្នកប្រើប្រាស់?
    សម្រាប់ពណ៌នាឱ្យកាន់តែច្បាស់៖
    1.user ត្រូវតែបញ្ចូល [id] សម្រាប់ជ្រើសរើសទិន្នន័យដែលបានបញ្ជាក់ពី db និង coords របស់អ្នកប្រើប្រាស់ខ្លួនឯង
    2. ឯកសារ php ទទួលបានទិន្នន័យគោលដៅ (coords) ដោយប្រើ [id] ហើយបន្ទាប់មកគណនាចម្ងាយរវាងអ្នកប្រើប្រាស់ និងចំណុចគោលដៅ

    ឬគ្រាន់តែអាចទទួលបានចំងាយពីលេខកូដខាងក្រោម?

    $qry = “SELECT *,(((acos(sin((“.$latitude.”*)/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) ជាចម្ងាយពី `MyTable` កន្លែងណាចម្ងាយ>= “.$distance” >>>> តើខ្ញុំអាច "ដក" ចម្ងាយពីទីនេះបានទេ?
    អរគុណ​ម្តង​ទៀត,
    Timmy S

  41. 60

    យល់ព្រម អ្វីគ្រប់យ៉ាងដែលខ្ញុំបានសាកល្បងគឺមិនដំណើរការទេ។ ខ្ញុំចង់មានន័យថា អ្វីដែលខ្ញុំមានការងារ ប៉ុន្តែចម្ងាយគឺឆ្ងាយ។

    តើ​មាន​នរណា​ម្នាក់​អាច​មើល​ឃើញ​ថា​មាន​អ្វី​ខុស​ជាមួយ​នឹង​កូដ​នេះ?

    if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['កាំ']; បន្ទរ “លទ្ធផលសម្រាប់ “.$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 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 ) ") ឬ <= $ (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']; ប្រសិនបើ($ផ្ទៀងផ្ទាត់ == '1'){ បន្ទរ “”; បន្ទរ “”.$store””; បន្ទរ $dis ។ "ម៉ាយល៍ (s) ឆ្ងាយ"; អេកូ ""; } else { បន្ទរ “”.$store.””; បន្ទរ $dis ។ "ម៉ាយល៍ (s) ឆ្ងាយ"; អេកូ ""; } }}

    កូដ 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); $distance = $distance * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } ត្រឡប់ (ជុំ($ចម្ងាយ,២)); }

    សូម​អរគុណ​ជាមុន

  42. 61
  43. 62

    ហេ Douglas អត្ថបទដ៏អស្ចារ្យ។ ខ្ញុំបានរកឃើញការពន្យល់របស់អ្នកអំពីគោលគំនិតភូមិសាស្ត្រ និងកូដពិតជាគួរឱ្យចាប់អារម្មណ៍ណាស់។ សំណូមពរតែមួយគត់របស់ខ្ញុំគឺដាក់ដកឃ្លា និងចូលបន្ទាត់កូដសម្រាប់បង្ហាញ (ឧទាហរណ៍ Stackoverflow)។ ខ្ញុំយល់ថាអ្នកចង់រក្សាលំហ ប៉ុន្តែគម្លាតកូដ/ការចូលបន្ទាត់ធម្មតានឹងធ្វើឱ្យវាកាន់តែងាយស្រួលសម្រាប់ខ្ញុំ ក្នុងនាមជាអ្នកសរសេរកម្មវិធី ដើម្បីអាន និងបំបែក។ ទោះយ៉ាងណាក៏ដោយ នោះជារឿងតូចតាច។ បន្តការងារដ៏អស្ចារ្យ។

  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(((".$longitude")*pi()/180)))) * 180/pi()*60*1.1515*1.609344)";
    $sql = 'SELECT *, '.$formula.' ជាចម្ងាយពីតារាងដែល '..$formula.' <= '.$distance;

  51. 71
  52. 72

    អរគុណច្រើនសម្រាប់ការ shear អត្ថបទនេះ វាមានប្រយោជន៍ខ្លាំងណាស់។
    PHP ត្រូវ​បាន​បង្កើត​ឡើង​ដំបូង​ជា​វេទិកា​ស្គ្រីប​សាមញ្ញ​មួយ​ដែល​មាន​ឈ្មោះ​ថា "ទំព័រ​ដើម​ផ្ទាល់​ខ្លួន"។ សព្វថ្ងៃនេះ PHP (ខ្លីសម្រាប់ Hypertext Preprocessor) គឺជាជម្រើសនៃបច្ចេកវិទ្យា Active Server Pages (ASP) របស់ Microsoft ។

    PHP គឺ​ជា​ភាសា​ខាង​ម៉ាស៊ីន​មេ​ប្រភព​បើក​ចំហ ដែល​ត្រូវ​បាន​ប្រើ​សម្រាប់​ការ​បង្កើត​គេហទំព័រ​ថាមវន្ត។ វាអាចត្រូវបានបង្កប់នៅក្នុង HTML ។ PHP ជាធម្មតាត្រូវបានប្រើប្រាស់ដោយភ្ជាប់ជាមួយមូលដ្ឋានទិន្នន័យ MySQL នៅលើម៉ាស៊ីនមេគេហទំព័រ Linux/UNIX ។ វាប្រហែលជាភាសាស្គ្រីបដ៏ពេញនិយមបំផុត។

  53. 73

    ខ្ញុំបានរកឃើញដំណោះស្រាយខាងលើមិនដំណើរការត្រឹមត្រូវ។
    ខ្ញុំត្រូវប្តូរទៅជា៖

    $qqq = “SELECT *,(((acos(sin((“.$latitude.”*)/180)))) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((”. $longitude. “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) ជាចម្ងាយពី `ចុះឈ្មោះ` “;

  54. 75

    អរគុណលោកគ្រូ wroking ល្អឥតខ្ចោះ.. ប៉ុន្តែខ្ញុំមានសំណួរមួយ ប្រសិនបើខ្ញុំចង់ចេញដោយគ្មានចំនុចទសភាគ តើខ្ញុំអាចធ្វើអ្វីបាន..?

    អរគុណ​យ៉ាង​ជ្រាលជ្រៅ។

  55. 76

    សួស្តី សូមខ្ញុំពិតជាត្រូវការជំនួយរបស់អ្នកលើបញ្ហានេះ។

    ខ្ញុំ​បាន​ធ្វើ​សំណើ​សុំ​ទៅ​កាន់ web-server របស់​ខ្ញុំ http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $ latitude
    -2.23389 = $longitude
    និង 20 = ចម្ងាយដែលខ្ញុំចង់ទៅយក

    ទោះ​ជា​យ៉ាង​ណា​ក៏​ដោយ​ការ​ប្រើ​រូបមន្ត​អ្នក វា​ទាញ​យក​ជួរ​ដេក​ទាំង​អស់​ក្នុង db របស់​ខ្ញុំ

    $results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”)”)។”)/180)))))) * sin((lat*pi()/180 ))+cos((".$ latitude."*pi()/180)) * cos((lat*pi()/180)) * cos(((".$longitude."- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) ជាចម្ងាយពីសញ្ញាសម្គាល់មានចម្ងាយ >= “.$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”,619”Adresse, Mountain”:” View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza:”4546,”ad El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distance”:16077.937560795},{“ id”:7,”name”:”The bars and grills”,”address”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distance”:8038.7620112314}

    ខ្ញុំ​ចង់​ទាញ​យក​តែ​ជួរ​ដេក​ដែល​មាន​ចម្ងាយ 20 ម៉ាយ ប៉ុន្តែ​វា​នាំ​មក​នូវ​ជួរ​ដេក​ទាំង​អស់។ សូម​ខ្ញុំ​ធ្វើ​អ្វី​ខុស

  56. 77

    ខ្ញុំកំពុងស្វែងរកសំណួរស្រដៀងគ្នា ប៉ុន្តែបានបង្កើនបន្តិច - និយាយឱ្យខ្លីគឺដើម្បីដាក់ក្រុមកូអរដោនេទាំងអស់ក្នុងចម្ងាយ 2 ម៉ាយនៃកូអរដោនេនីមួយៗ ហើយបន្ទាប់មករាប់ចំនួនកូអរដោណេក្នុងក្រុមនីមួយៗ ហើយចេញតែក្រុមមួយដែលមានកូអរដោណេច្រើនជាងគេ - បើទោះបីជា អ្នក​មាន​ក្រុម​ច្រើន​ជាង​មួយ​ក្នុង​ចំណោម​ក្រុម​ដែល​មាន​ចំនួន​កូអរដោណេ​ច្រើន​បំផុត – គ្រាន់​តែ​បញ្ចេញ​ក្រុម​ចៃដន្យ​ពី​ក្រុម​ដែល​មាន​ចំនួន​ច្រើន​ជាង​គេ​ដូចគ្នា –

តើ​អ្នក​គិត​អ្វី?

តំបន់បណ្ដាញនេះប្រើ Akismet ដើម្បីកាត់បន្ថយសារឥតបានការ។ សិក្សាអំពីរបៀបដែលទិន្នន័យរបស់អ្នកត្រូវបានដំណើរការ.