2012-05-07 23 views
0

說我有一個GPS座標說A(在經度 - 緯度小數形式,然後我想創建一個30米半徑(一個圓)的區域,以便我可以捕獲任何設備(與GPS座標),它進入該區域,如何做到這一點感謝如何使用GPS座標創建區域

+0

咦?這與JavaScript有什麼關係? –

+0

我嘗試了它,它給了33錯誤 - 對不起,請幫助 – user1379094

回答

2

看看這個JavaScript的例子,但它很容易在任何其他語言來實現

主要代碼:?

var earthRadiusKm = 3437.74677 * 1.1508 * 1.6093470878864446; 

    function GeoArea(centerLat, centerLng, distanceKm, northPoint, southPoint, eastPoint, westPoint) { 
     this.northPoint = northPoint; 
     this.southPoint = southPoint; 
     this.eastPoint = eastPoint; 
     this.westPoint = westPoint; 
     this.inArea = function (lat, lng) { 
      var inBox = southPoint.lat <= lat && lat <= northPoint.lat && westPoint.lng <= lng && lng <= eastPoint.lng; 
      if (inBox) { 
       var distanceFromCenterKm = calcDistance(centerLat, centerLng, lat, lng); 
       return distanceFromCenterKm <= distanceKm; 
      } else { 
       return false; 
      } 
     } 
    } 

    function GeoPoint(lat, lng) { 
     this.lat = lat; 
     this.lng = lng; 
    } 

    function toDegrees(radians) { 
     return radians/(Math.PI/180); 
    } 

    function toRadians(degrees) { 
     return Math.PI/180 * degrees; 
    } 

    function calcDistance(latA, lngA, latB, lngB) { 
     var rLatA = toRadians(latA); 
     var rLatB = toRadians(latB); 
     var rHalfDeltaLat = toRadians((latB - latA)/2); 
     var rHalfDeltaLng = toRadians((lngB - lngA)/2); 

     return 2 * earthRadiusKm * Math.asin(Math.sqrt(Math.pow(Math.sin(rHalfDeltaLat), 2) + Math.cos(rLatA) * Math.cos(rLatB) * Math.pow(Math.sin(rHalfDeltaLng), 2))); 
    } 

    function findPoint(lat, lng, bearing, distance) { 
     var rLat = toRadians(lat); 
     var rLng = toRadians(lng); 
     var rBearing = toRadians(bearing); 
     var rAngDist = distance/earthRadiusKm; 

     var rLatB = Math.asin(Math.sin(rLat) * Math.cos(rAngDist) + Math.cos(rLat) * Math.sin(rAngDist) * Math.cos(rBearing)); 
     var rLngB = rLng + Math.atan2(Math.sin(rBearing) * Math.sin(rAngDist) * Math.cos(rLat), Math.cos(rAngDist) - Math.sin(rLat) * Math.sin(rLatB)); 

     var pLat = toDegrees(rLatB); 
     var pLng = toDegrees(rLngB); 
     return new GeoPoint(pLat, pLng); 
    } 

    function calcArea(lat, lng, distanceKm) { 
     var northPoint = findPoint(lat, lng, 0, distanceKm); 
     var eastPoint = findPoint(lat, lng, 90, distanceKm); 
     var southPoint = findPoint(lat, lng, 180, distanceKm); 
     var westPoint = findPoint(lat, lng, 270, distanceKm); 
     return new GeoArea(lat, lng, distanceKm, northPoint, southPoint, eastPoint, westPoint); 
    } 

使用示例:

// calculate area with center in lat:55.742793 lng:37.615401 
    // and distance in 23 km 
    var area = calcArea(55.742793, 37.615401, 23); 

    //returns true 
    area.inArea(55.714735, 37.629547); 
    //returns false 
    area.inArea(55.693842, 38.015442); 
+0

看起來不錯 - 我會嘗試 - 非常感謝,我希望它能與30米 – user1379094

+0

是的,它的工作原理。在這種情況下distanceKm參數應該等於0.030 –

+0

對不起Nikita,我嘗試過,但我得到了這麼多的錯誤,我應該在我開始這個代碼之前聲明什麼?你使用哪個Java版本?感謝您的幫助 – user1379094