イベントの開始時刻と座標を含むcouchdbがあります。次のように、現在の場所からそれらのイベントまでの距離を計算するリスト ビューを作成しました。
locateEvents: function(head, req){
var row, comma = '';
start({
"headers": {
"Content-Type": "application/json"
}
});
if(req.query.latitude&&req.query.longitude&&req.query.radius&&req.query.now){
var R = 6371; // km
var dLon, dLat, lat1, lat2;
var results = [];
while(row = getRow()) {
dLon = Math.abs(row.value.venue.longitude-req.query.longitude);
dLat = Math.abs(row.value.venue.latitude-req.query.latitude);
dLon = (dLon*3.14159)/180;
dLat = (dLat*3.14159)/180;
lat1 = (Math.abs(req.query.longitude)*3.14159)/180;
lat2 = (Math.abs(req.query.latitude)*3.14159)/180;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
if((d < req.query.radius)&&(row.value.start_time > req.query.now)){
results.push(row.value);
}
}
send(JSON.stringify(results));
}else{
start({"code": 500});
send("Latitude, longitude, page and radius parameters should be provided. i.e: latitude=value&longitude=value&radius=value&now=value");
}
次のようなイベントの単純な byDate ビューがあります。
byDate: {
map: function(doc){ if (doc.resource === 'Event') {emit(doc.venue.start_time, doc);}}
}
私の懸念: 最初にリスト内の距離でイベントを並べ替えてから、並べ替えられたリストを開始時間で並べ替える方法はありますか?