通过距离位置javascript的距离对结果进行排序

时间:2012-06-15 01:05:48

标签: javascript sql sqlite

我有一张表,例如:

CREATE TABLE places (id UNIQUE, name, latitude, longitude)

然后我遍历我的数据集并计算用户位置和行之间的距离,然后我在HTML中显示为列表。

我的问题是我不知道如何按距离的升序排列这个列表。

我是否将距离保存回“地方”表格,然后再按照“升序”选择*?

我可以不做选择我的结果,但通过运行javascript函数来命令它们。基本上是这样的:

tx.executeSql('select * from places order by ' 
function getdistance(userLat, UserLong, places.latitude, places.longitude)

感谢,

2 个答案:

答案 0 :(得分:1)

我提供了Haversine Distance formula的实现,您可以使用它来计算两个经度/纬度对之间距离的近似近似值。返回的距离可以是任何距离单位,只要您知道所述单位中的地球半径即可。在这个例子中,我提供了公里和英里的地球半径。

注意在索引0处传递Longitude数组,在索引1处传递Latitude数组,因为编写此函数是为了使用GSON样式位置数据。

您必须先执行SQL查询,然后在查询结果可用后计算距离。

var earth_radius = {
  kilometers: 6371,
  miles: 3959
};

function toRad(x) {
  return x * Math.PI / 180;
};

// starting point: [<Float> longitude, <Float> latitude]
// ending point: [<Float> longitude, <Float> latitude]
// units: <Number> earth_radius
function haversineDistance(starting_point, end_point, units) {
  units || (units = 1);

  var lat1 = parseFloat(starting_point[1]),
      lat2 = parseFloat(end_point[1]);

  var lon1 = parseFloat(starting_point[0]),
      lon2 = parseFloat(end_point[0]);

  var dLat = toRad(lat2 - lat1),
      dLon = toRad(lon2 - lon1);

  lat1 = toRad(lat1);
  lat2 = toRad(lat2);

  var arc = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
  return (2 * Math.atan2(Math.sqrt(arc), Math.sqrt(1 - arc))) * units;
};

// LOS ANGELES, CA
var start = [-118.24, 33.97];

// SAN FRANCISCO, CA
var end   = [-122.41, 37.77];

var dist_kilometers = haversineDistance(start, end, earth_radius['kilometers']);
var dist_miles = haversineDistance(start, end, earth_radius['miles']);

假设您已经从SQL查询中获取了结果集以及客户端JavaScript可用的用户位置,您可以使用JavaScripts本机数组排序函数中的hasrsineDistance函数轻松地按距离对位置进行排序。

var user_coords = [user_location.longitude, user_location.latitude];

sql_results.sort(function(a, b) {
  var a_coords = [a.longitude, a.latitude];
  var b_coords = [b.longitude, b.latitude];

  var a_dist = haversineDistance(user_coords, a_coords, earth_radius['miles']);
  var b_dist = haversineDistance(user_coords, b_coords, earth_radius['miles'])

  return a_dist - b_dist;
});

答案 1 :(得分:0)

因为你在Javascript中调用了你想要的函数,你不能使用数据库引擎外部定义的函数作为比较运算符,特别是如果通过你提供的语法使用它,从查询外部进行评估 - 你需要数据来查找值以评估应该返回数据的顺序。数据无法到达任何地方!

相反,您可以创建一个具有额外空列的表,然后在客户端通过Javascript在HTML中进行计算。这将允许多个用户使用该应用程序,您可以在那里对其进行排序。

当然,如果您愿意这样做,您可以在SQLite中创建或定义C函数 - 我不熟悉该过程,但在文档here中对其进行了描述。这将允许您在SQL本身中调用它; Select *, Distance(UserLat, UserLong, places.latitude, places.longitude) as dist from places, uservalues order by dist

或者,如建议的那样,您可以将数据保存回数据库,但这会限制并发性。

最后,您可以使用MySQL或其他更全面的数据库系统。