Вычислить, какая пара координат находится на расстоянии другой пары

Мне нужна помощь в решении следующей проблемы: у меня есть таблица 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;
}
Другие вопросы по тегам