0

我有一张桌子,例如:

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

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

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

我是否将距离保存回 Places 表中,然后按升序执行另一个 Select * ...?

我可以不做选择我的结果之类的事情,而是通过运行 javascript 函数对它们进行排序。基本上是这样的:

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

谢谢,

4

2 回答 2

1

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

请注意传递索引为 0 的经度和索引为 1 的纬度的数组,因为此函数是为处理 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,您可以使用 JavaScript 原生数组排序函数中的 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;
});
于 2012-06-15T01:28:10.463 回答
0

因为您在 Javascript 中调用了所需的函数,所以不能使用在数据库引擎外部定义的函数作为比较运算符,尤其是通过您提供的语法使用时,在查询外部对其进行评估时 - 您需要数据查找值以评估应返回数据的顺序。数据无法到达任何地方!

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

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

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

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

于 2012-06-15T01:28:37.267 回答