Вычислить, какая пара координат находится на расстоянии другой пары
Мне нужна помощь в решении следующей проблемы: у меня есть таблица X, где я храню названия улиц с парой координат.
Таблица X
Street | x | y
street1, 22.342342, 44.234242
street2, 23.4324324, 44.432554
etc.
Например, если я ввожу данные улицы 1, я хочу узнать, какие другие улицы находятся в радиусе 500 метров от улицы 1. Как это можно сделать, не используя географию в SQL Server?
2 ответа
Если координаты декартовы и в метрах, вы можете сделать это, чтобы вернуть соответствующие улицы:
SELECT
X.Street
FROM
X as X,
X as REF
WHERE
REF.Street = 'street1' and
X.Street <> 'street1' and
SQRT(SQUARE(X.x - REF.x) + SQUARE(X.y - REF.y)) < 500
где 'street1'
может быть любая входная улица. X.Street <> 'street1'
строка избегает ввода входной улицы, если это важно.
Лучшее, что вы можете сделать без использования картографического программного обеспечения, это рассчитать Straight Line Distance
между двумя точками.
Вот хорошая ссылка, объясняющая Haversine
метод, который я использовал в прошлом.
Вот фрагмент кода, показывающий расчет:
function haversineDistance(latlong1,latlong2)
{
var lat1 = DegtoRad(latlong1.Latitude);
var lon1 = DegtoRad(latlong1.Longitude);
var lat2 = DegtoRad(latlong2.Latitude);
var lon2 = DegtoRad(latlong2.Longitude);
var dLat = lat2-lat1;
var dLon = lon2-lon1;
var cordLength = Math.pow(Math.sin(dLat/2),2)+Math.cos(lat1)*Math.cos(lat2)*Math.pow(Math.sin(dLon/2),2);
var centralAngle = 2 * Math.atan2(Math.sqrt(cordLength), Math.sqrt(1-cordLength));
return earthRadius * centralAngle;
}