2014-07-17 28 views
1

我在AS3中制作了一个带有Adobe Flash Pro的AIR应用程序。检测距离用户点最近

我已经把多个POI点与它们的坐标这样的:(我使用的MapQuest)

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.... 
} 

谢谢您的解答,

斯蒂芬

回答

0

haversine公式(http://en.wikipedia.org/wiki/Haversine_formula)可以用来确定经度和纬度定义的两个点之间的距离。在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,但你应该能够适应这个代码正确)for循环执行后你

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。

希望这有助于!