Knex — популярный конструктор запросов для Node.js, который обеспечивает простой и интуитивно понятный способ взаимодействия с базами данных. При работе с пространственными данными в базе данных с поддержкой PostGIS вам часто может потребоваться вычислить расстояние между двумя точками. В этой статье блога мы рассмотрим несколько методов расчета расстояния между двумя точками с помощью Knex и PostGIS. Каждый метод будет сопровождаться примерами кода для лучшего понимания и реализации.
Метод 1: использование функции ST_Distance
Функция ST_Distance — это мощный инструмент в PostGIS, который вычисляет расстояние между двумя геометриями. Вот пример того, как использовать его с Knex:
const distance = await knex.raw(`
SELECT ST_Distance(
ST_SetSRID(ST_MakePoint(${point1.x}, ${point1.y}), 4326),
ST_SetSRID(ST_MakePoint(${point2.x}, ${point2.y}), 4326)
) as distance;
`);
console.log(distance.rows[0].distance);
Метод 2: использование функции ST_Distance_Sphere
Если вы работаете с географическими координатами (широтой и долготой), вы можете использовать функцию ST_Distance_Sphere для расчета расстояния на сфере. Вот пример:
const distance = await knex.raw(`
SELECT ST_Distance_Sphere(
ST_SetSRID(ST_MakePoint(${point1.longitude}, ${point1.latitude}), 4326),
ST_SetSRID(ST_MakePoint(${point2.longitude}, ${point2.latitude}), 4326)
) as distance;
`);
console.log(distance.rows[0].distance);
Метод 3: использование формулы гаверсина
Формула гаверсина — это математическое уравнение, которое вычисляет расстояние по большому кругу между двумя точками на сфере. Вот реализация с использованием JavaScript:
function calculateDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // Radius of the earth in km
const dLat = toRadians(lat2 - lat1);
const dLon = toRadians(lon2 - lon1);
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(toRadians(lat1)) *
Math.cos(toRadians(lat2)) *
Math.sin(dLon / 2) *
Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c;
return distance;
}
function toRadians(degrees) {
return (degrees * Math.PI) / 180;
}
console.log(calculateDistance(point1.latitude, point1.longitude, point2.latitude, point2.longitude));
В этой статье мы рассмотрели три различных метода расчета расстояния между двумя точками в Knex PostGIS. Мы рассмотрели использование встроенных функций PostGIS, таких как ST_Distance и ST_Distance_Sphere, а также реализацию формулы Haversine в JavaScript. Эти методы обеспечивают гибкость и точность при работе с пространственными данными. Не стесняйтесь выбирать метод, который лучше всего подходит для вашего конкретного случая использования, и начинайте рассчитывать расстояния между точками в ваших проектах Knex PostGIS!