【问题标题】:"Find Nearest" process for mobile device webapp?移动设备 webapp 的“查找最近”过程?
【发布时间】:2010-11-23 16:09:05
【问题描述】:

希望为移动 Web 应用程序实现“查找最近”流程,该流程将根据用户当前位置自动选择下拉列表中项目的最接近匹配项。

假设我们有列表中每个元素的纬度/经度,以及来自移动设备的人员位置,那么找到最近项目的最佳方法是什么?我们将有大约 150-200 个可能的项目,并希望最接近用户的项目,因此我们可以将其设置为默认值。

有没有办法在 JS 中有效地做到这一点,还是更适合服务器端?

【问题讨论】:

    标签: javascript mobile geolocation gps


    【解决方案1】:

    您需要一个循环来计算距离,然后再计算最近的距离。使用 Haversine 公式:

    var R = 6371; // km
    var dLat = (lat2-lat1).toRad();
    var dLon = (lon2-lon1).toRad(); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
            Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var distance = R * c;
    

    最好运行您自己的基准测试,以确定在服务器端还是客户端执行此操作更好。

    【讨论】:

    • 谢谢。在相关的方法中,是否有可能通过 SQL Server TSQL 完成这一切?这样我们就可以创建一个网络服务来接受纬度/经度,然后返回最近项目的 ID?
    • 您当然可以使用CREATE FUNCTION 计算距离并在查询中调用该函数。
    • 再次感谢。设法找到以下内容并根据我们的需要对其进行定制: DECLARE @LATITUDE AS FLOAT DECLARE @LONGITUDE AS FLOAT SET @LATITUDE = 46.2102496001872 SET @LONGITUDE = -62.7978515625 SELECT TOP 1 ID, CoordName FROM (Select ID, CoordName, Lat, Long From Coords)ACOS(SIN(@ Latitude / 57.295779513082323)订购* SIN(LAT / 57.295779513082323)* COS(LAT / 57.295779513082323)* COS(LONG / 57.295779513082323 - @经纬/ 57.295779513082323)
    • 您可能希望将其定义为 TSQL 函数,而不是每次编写查询字符串时都重复该公式
    • 我不确定您的公式有多准确,但请看一下 Haversine 如何以各种语言实现:codecodex.com/wiki/…。这是一个 TSQL 函数:jon.shoberg.net/2009/03/…。也在这里:sqlteam.com/forums/topic.asp?TOPIC_ID=81360
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2020-05-05
    • 2011-01-08
    • 2015-01-30
    • 2014-11-07
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多