示例#1
0
 _doInsert(score: QueryScore) {
   if (this._full) {
     this._heap.replace(score);
   } else {
     this._heap.insert(score);
     this._full = this._heap.size() === this._capacity;
   }
   this._min = this._heap.peek();
 }
function findNearestZOrder(geoData, k, lat, lon) {
  var latRad = (lat * RADIANS_IN_DEGREE);
  var lonRad = (lon * RADIANS_IN_DEGREE);
  var coslat = Math.cos(latRad);
  var sinlat = Math.sin(latRad);
  var coslon = Math.cos(lonRad);
  var sinlon = Math.sin(lonRad);

  var heapq = new Heap(function (item1, item2) {
    return (item1.distance - item2.distance);
  });

  var pos = Math.abs(bsearch(geoData, geohash.encode(lat, lon, 6)));
  var count = geoData[pos].l.length;
  var maxOffset = Math.min(pos, (geoData.length - pos));
  var offset = 4;
  for (; offset < maxOffset; ++offset) {
    count += (geoData[pos - offset].l.length + geoData[pos + offset].l.length);
    if (count >= k) {
      break;
    }
  }
  offset = Math.ceil(offset * 1.25); // fudge
  var elements = geoData.slice(Math.max(0, (pos - offset)), Math.min(geoData.length, (pos + offset + 1)));
  /*
   console.log('count is ' + elements.length);
   var neighbors = [];
   var count = objs[pos].l.length;
   var offset = 1;
   do {
   var blocks = [];
   for (var jj = -offset; jj <= offset; ++jj) {
   blocks.push(geohash.neighbor(hash, [offset, jj]));
   blocks.push(geohash.neighbor(hash, [-offset, -jj]));
   }
   for (var ii = offset - 1; ii >= (-offset + 1); --ii) {
   blocks.push(geohash.neighbor(hash, [ii, offset]));
   blocks.push(geohash.neighbor(hash, [-ii, -offset]));
   }
   for (var ii in blocks) {
   if ('undefined' !== typeof invertedIndex[blocks[ii]]) {
   count += invertedIndex[blocks[ii]].length;
   //console.log('count -> ' + count);
   }
   }
   if (count >= k) {
   break;
   }
   ++offset;
   } while (true === true);
   console.log('count is ' + count);
   */
  for (var ii in elements) {
    for (var jj in elements[ii].l) {
      var city = elements[ii].l[jj];
      var val = (coslat * city.coslat * (city.coslon * coslon + city.sinlon * sinlon) + sinlat * city.sinlat);
      if (heapq.size() === k) {
        if (heapq.peek().distance < val) {
          heapq.replace({ distance: val, city: city });
        }
      } else {
        heapq.push({ distance: val, city: city });
      }
    }
  }

  var resultArray = [];
  var entry;
  while (entry = heapq.pop()) {
    entry.distance = (Math.acos(entry.distance) * EARTH_RADIUS_MILES);
    resultArray.unshift(entry);
  }

  return resultArray;
}