Вычисление расстояния между двумя точками в Knex PostGIS: несколько методов, объясненных примерами кода

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!