2012-01-10 138 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