2012-09-15 11 views
12

का उपयोग करके एक निश्चित निर्देशांक त्रिज्या के किसी अन्य निर्देशांक में गिरने के लिए कैसे जांच करें, मैंने बहुत सारे फ़ंक्शन देखे हैं लेकिन यह केवल MySQL या Postgresql के लिए काम करता है। मैं PHP के लिए समकक्ष तर्क चाहता हूँ। मैं कुछ तुलना कर रहा हूं, जैसे मेरे पास यह डेटा है जो बनाए जाने पर उत्पादित किया जा रहा था।PHP के केवल

Lat: 56.130366 
Long: -106.34677099999 

बाद में, मैं अगर यह निर्देशांक एक और निर्देशांक के दायरे में गिर जाएगी जाँच करना चाहते हैं तो सही होगा, अन्यथा गलत देता है।

Lat: 57.223366 
Long: -106.34675644699 
radius: 100000 (meters) 

अग्रिम धन्यवाद!

+1

गूगल "Haversine सूत्र" या "Vincenty सूत्र" दो अक्षांश/देशांतर पदों –

उत्तर

28

मदद के लिए धन्यवाद। नीचे एक उदाहरण समारोह है जो रेखांश और अक्षांश समन्वय के दो सेट लेता है और दोनों के बीच की दूरी देता है।

function getDistance($latitude1, $longitude1, $latitude2, $longitude2) { 
    $earth_radius = 6371; 

    $dLat = deg2rad($latitude2 - $latitude1); 
    $dLon = deg2rad($longitude2 - $longitude1); 

    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2); 
    $c = 2 * asin(sqrt($a)); 
    $d = $earth_radius * $c; 

    return $d; 
} 

$distance = getDistance(56.130366, -106.34677099999, 57.223366, -106.34675644699); 
if($distance < 100) { 
    echo "Within 100 kilometer radius"; 
} else { 
    echo "Outside 100 kilometer radius"; 
} 
+2

[समकक्ष, लेकिन जावास्क्रिप्ट में] (https://gist.github.com/moshmage/2ae02baa14d10bd6092424dcef5a1186) क्योंकि मैंने इस के लिए बहुत लंबा रास्ता बिताया। – MoshMage

6

आपको दो बिंदुओं के बीच दूरी की गणना करने के लिए Haversine formula का उपयोग करना चाहिए। आपके पास PHP version here है।

फिर जांचें कि distance < 100000 है या नहीं।

+0

अच्छा कोड तुम वहाँ मिल गया के बीच की दूरी बाहर काम करने के। लेकिन दूरी वास्तव में मीटर या किलोमीटर में है? –

+0

यह पृथ्वी त्रिज्या पर निर्भर करता है। यदि आप 6371 का उपयोग कोड से जुड़े हैं, तो यह किलोमीटर है :) –

+0

मैंने 6367 का उपयोग पृथ्वी त्रिज्या के रूप में कुछ एल्गोरिदम देखा लेकिन उनमें से अधिकांश 6371 वास्तव में मायने रखते हैं या नहीं? वैसे भी धन्यवाद :) –

1

यह मदद करनी चाहिए,

$lat_origin = 56.130366; 
$long_origin = -106.34677099999; 

$lat_dest = 57.223366; 
$long_dest = -106.34675644699; 

$radius  = 3958;  # Earth's radius (miles, convert to meters) 
$deg_per_rad = 57.29578; # Number of degrees/radian (for conversion) 

$distance = ($radius * pi() * sqrt(
      ($lat_origin - $lat_dest) 
      * ($lat_origin - $lat_dest) 
      + cos($lat_origin/$deg_per_rad) # Convert these to 
      * cos($lat_dest/$deg_per_rad) # radians for cos() 
      * ($long_origin - $long_dest) 
      * ($long_origin - $long_dest) 
    )/180); 
1
// Vincenty formula to calculate great circle distance between 2 locations 
//  expressed as Lat/Long in KM 

function VincentyDistance($lat1,$lat2,$lon1,$lon2){ 
    $a = 6378137 - 21 * sin(lat); 
    $b = 6356752.3142; 
    $f = 1/298.257223563; 

    $p1_lat = $lat1/57.29577951; 
    $p2_lat = $lat2/57.29577951; 
    $p1_lon = $lon1/57.29577951; 
    $p2_lon = $lon2/57.29577951; 

    $L = $p2_lon - $p1_lon; 

    $U1 = atan((1-$f) * tan($p1_lat)); 
    $U2 = atan((1-$f) * tan($p2_lat)); 

    $sinU1 = sin($U1); 
    $cosU1 = cos($U1); 
    $sinU2 = sin($U2); 
    $cosU2 = cos($U2); 

    $lambda = $L; 
    $lambdaP = 2*PI; 
    $iterLimit = 20; 

    while(abs($lambda-$lambdaP) > 1e-12 && $iterLimit>0) { 
     $sinLambda = sin($lambda); 
     $cosLambda = cos($lambda); 
     $sinSigma = sqrt(($cosU2*$sinLambda) * ($cosU2*$sinLambda) + ($cosU1*$sinU2-$sinU1*$cosU2*$cosLambda) * ($cosU1*$sinU2-$sinU1*$cosU2*$cosLambda)); 

     //if ($sinSigma==0){return 0;} // co-incident points 
     $cosSigma = $sinU1*$sinU2 + $cosU1*$cosU2*$cosLambda; 
     $sigma = atan2($sinSigma, $cosSigma); 
     $alpha = asin($cosU1 * $cosU2 * $sinLambda/$sinSigma); 
     $cosSqAlpha = cos($alpha) * cos($alpha); 
     $cos2SigmaM = $cosSigma - 2*$sinU1*$sinU2/$cosSqAlpha; 
     $C = $f/16*$cosSqAlpha*(4+$f*(4-3*$cosSqAlpha)); 
     $lambdaP = $lambda; 
     $lambda = $L + (1-$C) * $f * sin($alpha) * ($sigma + $C*$sinSigma*($cos2SigmaM+$C*$cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM))); 
    } 

    $uSq = $cosSqAlpha*($a*$a-$b*$b)/($b*$b); 
    $A = 1 + $uSq/16384*(4096+$uSq*(-768+$uSq*(320-175*$uSq))); 
    $B = $uSq/1024 * (256+$uSq*(-128+$uSq*(74-47*$uSq))); 

    $deltaSigma = $B*$sinSigma*($cos2SigmaM+$B/4*($cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM)- $B/6*$cos2SigmaM*(-3+4*$sinSigma*$sinSigma)*(-3+4*$cos2SigmaM*$cos2SigmaM))); 

    $s = $b*$A*($sigma-$deltaSigma); 
    return $s/1000; 
} 


echo VincentyDistance($lat1,$lat2,$lon1,$lon2); 
संबंधित मुद्दे