2014-07-17 2 views
1

AS3에서 Adobe Flash Pro로 AIR 응용 프로그램을 만들고 있습니다.사용자 지점에 가장 가까운 것을 감지합니다.

내가 그런 식으로 자신의 좌표를 여러 POI 점을 넣어했습니다 사용자가 나는 점을 배치하기 위해 위치 정보 기능을 넣었습니다

var myIcon2:MapIcon = new MapIcon(); 

       myIcon2.setImage(new pizzaImg(),22,32); 
       embeddedIconPoi = new Poi(new LatLng(-50.231838, 194.023561)); 
       embeddedIconPoi.rolloverAndInfoTitleText = "Pizza"; 
       embeddedIconPoi.icon = myIcon2; 

      PoiColl.add(embeddedIconPoi); 

(나는지도가 사용하고) 어디든지 :

if (Geolocation.isSupported){ 
my_geo.addEventListener(GeolocationEvent.UPDATE, onGeoUpdate); 
} 
function onGeoUpdate(e:GeolocationEvent):void{ 
    embeddedIconPoi.latLng = new LatLng(e.latitude, e.longitude); 
} 

이제 버튼을 클릭 할 때 사용자에게 가장 가까운 지점을 보여주는 함수를 만드는 방법이 있습니까? 같은

뭔가 :

buttonClosest.addEventListener(MouseEvent.CLICK, goClosest, false, 0, true); 

function goClosest(event:MouseEvent):void{ 
// Don't know what should I put here.... 
} 

귀하의 답변을 주셔서 감사합니다,

스테파니

하버 사인 공식 ( http://en.wikipedia.org/wiki/Haversine_formula)는 위도와 경도에 의해 정의 된 두 점 사이의 거리를 확인하는 데 사용할 수 있습니다

답변

0

. ActionScript 3.0에서 구현, 내가 http://snipplr.com/view/58443/

private const RADIUS_OF_EARTH_IN_MILES:int = 3963; 
private const RADIUS_OF_EARTH_IN_FEET:int =20925525; 
private const RADIUS_OF_EARTH_IN_KM:int =6378; 
private const RADIUS_OF_EARTH_IN_M:int =6378000; 

private function distanceBetweenCoordinates(lat1:Number,lon1:Number, 
             lat2:Number,lon2:Number, 
             units:String="miles"):Number{ 

var R:int = RADIUS_OF_EARTH_IN_MILES; 
if (units == "km"){ 
    R = RADIUS_OF_EARTH_IN_KM; 
} 
if (units == "meters"){ 
    R = RADIUS_OF_EARTH_IN_M; 
} 
if (units =="feet"){ 
    R= RADIUS_OF_EARTH_IN_FEET; 
} 

var dLat:Number = (lat2-lat1) * Math.PI/180; 
var dLon:Number = (lon2-lon1) * Math.PI/180; 

var lat1inRadians:Number = lat1 * Math.PI/180; 
var lat2inRadians:Number = lat2 * Math.PI/180; 

var a:Number = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.sin(dLon/2) * Math.sin(dLon/2) * 
        Math.cos(lat1inRadians) * Math.cos(lat2inRadians); 
var c:Number = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d:Number = R * c; 

return d; 
} 

당신이, 당신은 단순히 당신이 가지고있는 점을 반복하고 각 사이의 거리와 사용자의 지점을 찾을 수 있다고 일단으로부터 얻은이 코드 조각처럼 보일 것이다 그런 다음 최소값을 얻으십시오.

아마 (내가 AS3의 MapQuests API에 익숙하지 해요,하지만 당신은 제대로이 코드를 적용 할 수 있어야한다)과 같이 보일 것이다 루프에 대한 당신이있어 실행 된 후

function goClosest(e:MouseEvent):void 
{ 
    var minDistance:Number = int.MAX_VALUE; 
    var poiWithSmallestDistanceFromUser:Poi = null; 
    for each(var poi:POI in pois) 
    { 
     var distance:Number = distanceBetweenCoordinates(poi.lat, poi.lon, userPoi.lat, userPoi.lon); 
     if (distance < minDistance) 
     { 
      minDistance = distance; 
      poiWithSmallestDistanceFromUser = poi; 
     } 
    } 

} 

minDistance 및 poiWithSmallestDistanceFromUser로 남겨 둡니다.

희망이 도움이됩니다.

관련 문제