Запрос CouchDB, чтобы получить POI в пределах определенного радиуса

Я хочу создать базу данных CouchDB с некоторыми POI. Есть ли способ / запрос, чтобы получить poi в пределах определенного радиуса (скажем, 50 метров) от заданной широты / длинной позиции?

Я видел расширение https://github.com/couchbase/geocouch, но это означает, что мне нужно перекомпилировать CouchDB, но в данный момент у меня нет доступа администратора, чтобы сделать это.

2 ответа

Решение

У меня есть альтернативное предложение для вашего варианта использования. Предложение заключается в использовании геохэш.

Вы можете сохранить позицию в документе как геохэш. Длина геохэш зависит от точности, которую вы хотели бы хранить.

Предположим, что вы сохранили позицию с прецессией около 150 метров. В этом случае у вас будет геохэш из 7 символов, например "gbsukp7". Проверьте это для тестирования.

Тогда ваша функция карты может быть переопределена следующим образом:

function (doc) {
 emit([doc.geohash.substr(0,4), /* 39.1km × 19.5km bounding box */
      doc.geohash.substr(0,5), /* 4.89km ×  4.89km bounding box */
      doc.geohash.substr(0,6), /* 1.22km ×  0.61km bounding box */
      doc.geohash /* 153m × 153m bounding box */
      ],null)
}

При таком подходе у вас может быть простой механизм для получения документов, расположенных в той же ограничительной рамке, что и точка отсчета.

Это не идеально, но может быть вариантом

Решил это и сделал функцию карты:

function (doc) {

// Leidse plein
latitude = 52.3648111;
longitude = 4.8810906;

distance = Math.acos(
  Math.sin(doc.latitude * Math.PI / 180) * 
  Math.sin(latitude * Math.PI / 180) 
  + 
  Math.cos(doc.latitude * Math.PI / 180) * 
  Math.cos(latitude * Math.PI / 180) * 
  Math.cos((doc.longitude - longitude) * Math.PI / 180)) * 6371;

  // all poi's within 5km radius
  if(distance <= 5 ) {
      emit([doc.title,doc.latitude,doc.longitude], distance);
  }

 }
Другие вопросы по тегам