2012-01-10 137 views
2

我想獲得覆蓋某個區域(我的城市)的網格的地理組合。網格是500米* 500米。所以我想輸入開始長/緯度組合,距離(500米),度(90或270),並獲得下一個長/緯度組合。獲取基於距離和度數的經度緯度組合

我很不知道數學公式,也很難找到解決方案。我發現一些PHP函數可以在兩個長/緯度組合之間返回距離。

http://www.zipcodeworld.com/samples/distance.php.html http://www.phpro.org/tutorials/Geo-Targetting-With-PHP-And-MySQL.html#3

但我仍無法重建根據我需要這個東西(我真的很討厭COS,罪惡,棕褐色)。真的很感激,如果有人幫助我。

回答

5

這裏是圍繞一箇中心點

<script type="text/javascript"> 
      function toRad (value) { 
       return value * Math.PI/180; 
      } 

      function toDeg (value) { 
       return value * 180/Math.PI; 
      } 
      function computePoint(){     
       var radius = 6371; //in kms 
       var lat1 = checkField(document.getElementById("lat")); 
       var lon1 = checkField(document.getElementById("long")); 
       var dist = document.getElementById("distance").value; 

       dist = typeof(dist)=='number' ? dist : typeof(dist)=='string' && dist.trim()!='' ? +dist : NaN; 
       //    alert("Dist "+ dist+" kms"); 
       var angularDist = dist/radius; 
       lat1= toRad(lat1); 
       lon1=toRad(lon1); 

       var lat2,lon2, angle = 0; 

       for(i=1; i<5; i++,angle+=90){     
        var brng = toRad(angle); 
        lat2=lon2=0; 
        // second latitude 
        lat2 = Math.asin(Math.sin(lat1) * Math.cos(angularDist) + 
         Math.cos(lat1) * Math.sin(angularDist) * Math.cos(brng)); 

        // second longitude 
        lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(angularDist) * 
         Math.cos(lat1), Math.cos(angularDist) - Math.sin(lat1) * Math.sin(lat2)); 

        if (isNaN(lat2) || isNaN(lon2)) alert("Something is null"); 

        //    lon2 = (lon2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180º 
        lat2 = toDeg(lat2); 
        lon2 = toDeg(lon2); 
//     alert("latitude: "+lat2 +",Longitude "+lon2); 
        document.getElementById("lat"+i).innerHTML=lat2; 
        document.getElementById("long"+i).innerHTML=lon2; 
        document.getElementById("ang"+i).innerHTML=angle; 
       } 

      } 
      function checkField(field){ 
       var str=field.name 
       var latlon1 
       latlon=field.value;//parselatlon(field.value) 
       if (str.substring(0,3)=="lat") { 
        if (latlon > 90.) { 
         alert ("Latitudes cannot exceed 90 degrees") 
         field.focus() // Doesn't work! 
         field.select() 
        } 
       } 
       if (str.substring(0,3)=="long") { 
        if (latlon > 180.) { 
         alert ("Longitudes cannot exceed 180 degrees") 
         field.focus() 
         field.select()  
        } 
       } 
       return latlon 
      } 

      function parselatlon(instr){ 
       // Parse strings dd.dd dd:mm.mm dd:mm:ss.ss 
       var deg,min,sec,colonIndex,degstr,minstr,str 
       str=instr 
       colonIndex=str.indexOf(":") 
       if (colonIndex==-1){ // dd.dd? 
        if (!isPosNumber(str)){ 
         badLLFormat(instr) 
         return 0. 
        } else { 
         return parseFloat(str) 
        } 
       } 
      } 
      function isPosNumber(instr){ //integer or float 
       str=""+instr // force to string type 
       oneDecimal=false 
       for (var i=0;i<str.length;i++) { 
        var oneChar=str.charAt(i) 
        if (oneChar=="." && !oneDecimal){ 
         oneDecimal=true 
         continue 
        } 
        if (oneChar < "0" || oneChar > "9") { 
         return false 
        } 
       } 
       return true 
      } 
      function badLLFormat(str){ 
       alert(str+ " is an invalid lat/lon format\n"+ 
        "Use DD.DD DD:MM.MM or DD:MM:SS.SS") 
      } 
     </script> 

和HTML看起來像發現4個極值點(緯度,經度)的代碼....

<body> 
     <div>Enter the details </div> 
     Latitude : <input type="text" id="lat" name="lat" value="" /> <br/> 
     Longitude : <input type="text" id="long" name="long" value="" /> <br/> 
     <!--  Bearing : <input type="text" id="bearing" name="bearing" value="" placeholder="Enter angle in degrees" /> <br/>--> 
     Distance : <input type="text" id="distance" name="distance" value="" placeholder ="Enter distance in Kms. " /> <br/> 
     <input type="submit" value="Find Points" name="findPts" onclick="computePoint();"/> 
     <div><h3><span> <strong>Results Will be displayed here</strong></span></h3></div>    
     <table border="1" style="text-align: center"> 
      <tr> 
       <th>Latitude</th> 
       <th>Longitude</th> 
       <th>Angle (in degrees) </th> 
      </tr> 
      <tr> 
       <td><label id="lat1" value=""></label> </td> 
       <td><label id="long1" value=""></label> </td> 
       <td><label id="ang1" value=""></label> </td> 
      </tr> 
      <tr> 
       <td><label id="lat2" value=""></label> </td> 
       <td><label id="long2" value=""></label> </td> 
       <td><label id="ang2" value=""></label> </td> 
      </tr> 
      <tr> 
       <td><label id="lat3" value=""></label> </td> 
       <td><label id="long3" value=""></label> </td> 
       <td><label id="ang3" value=""></label> </td> 
      </tr> 
      <tr> 
       <td><label id="lat4" value=""></label> </td> 
       <td><label id="long4" value=""></label> </td> 
       <td><label id="ang4" value=""></label> </td> 
      </tr> 
     </table> 
    </body> 

我這裏由捐我的代碼在GPL下....享受!

+0

很多感謝在這裏。這真的對我有用。我只需要將它轉換爲PHP,爲我的蛋糕和平。 – Ariks 2012-01-10 09:56:08

1

該站點具有用於許多緯度/經度/距離/方位計算實例代碼:

http://www.movable-type.co.uk/scripts/latlong.html

的公式是:

LAT2 = ASIN(SIN(LAT1)* COS(d/R)+ cos(lat1)* sin(d/R)* cos(θ))

lon2 = sin1 + atan2(sin(θ)* sin(d/R)* cos(lat1),cos/R)-sin(lat1)* sin(lat2))

θ是th e軸承(以弧度,從北方順時針方向);

d/R是角距離(弧度),其中d是移動的距離,R是地球半徑

相關的代碼,你感興趣的是,在JavaScript中,但應該很容易轉換:

var lat2 = Math.asin(Math.sin(lat1)*Math.cos(d/R) + 
         Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng)); 
var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), 
          Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2)); 
+0

非常感謝。這個答案解決了我的問題。 – Ariks 2012-01-10 09:58:04