我有一张表,例如:
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)
感谢,
答案 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或其他更全面的数据库系统。