Запрос 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);
}
}