المسافة بين اثنين من المواقع باستخدام خطوط الطول والعرض بعيدا ما تقول جوجل
-
05-07-2019 - |
سؤال
قضيت بضعة أيام في محاولة لمعرفة هذا واحد و لا يمكن أن يبدو لتحديد المشاكل.لدي قاعدة بيانات SQL 2005 تخزين خطوط الطول والعرض كما العشرية(18,8) ، والتي وصلتني عن طريق الاستعلام عن جوجل.
هذه موقعين: من:10715 Downsville بايك Ste 100 MD 21740 إلى:444 East College Ave Ste 120 كلية ولاية بنسلفانيا ، 16801
مع الأخذ بعين الاعتبار أن المسافة سوف تكون 'تيجي', النتائج لا تزال بعيدا.في هذا المثال بلدي النتيجة يقول 21.32 ميلا لكن خرائط جوجل يقول 144 ميلا.
أعتقد أن تتصدر أن يجعل حتى أكثر إحباطا هو أنني وجدت هذا الموقع: http://jan.ucc.nau.edu/~cvm/latlongdist.html وجاء مع تقريبا نفس النتائج كما لي.
هنا هو بلدي وظائف و الاستعلام:
وظائف:CalculateDistance
DECLARE @Temp FLOAT
SET @Temp = SIN(@Latitude1/57.2957795130823) *
SIN(@Latitude2/57.2957795130823) +
COS(@Latitude1/57.2957795130823) * COS(@Latitude2/57.2957795130823) *
COS(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823)
IF @Temp > 1
SET @Temp = 1
ELSE IF @Temp < -1
SET @Temp = -1
RETURN (3958.75586574 * ACOS(@Temp) )
LatitudePlusDistance
RETURN (SELECT @StartLatitude + SQRT(@Distance * @Distance / 4766.8999155991))
LongitudePlusDistance
RETURN (SELECT @StartLongitude + SQRT(@Distance * @Distance /
(4784.39411916406 *
COS(2 * @StartLatitude / 114.591559026165) *
COS(2 * @StartLatitude / 114.591559026165))))
الاستعلام:
DECLARE @Longitude DECIMAL(18,8),
@Latitude DECIMAL(18,8),
@MinLongitude DECIMAL(18,8),
@MaxLongitude DECIMAL(18,8),
@MinLatitude DECIMAL(18,8),
@MaxLatitude DECIMAL(18,8),
@WithinMiles DECIMAL(2)
Set @Latitude = -77.856052
Set @Longitude = 40.799159
Set @WithinMiles = 50
-- Calculate the Max Lat/Long
SELECT @MaxLongitude = dbo.LongitudePlusDistance(@Longitude, @Latitude,
@WithinMiles),
@MaxLatitude = dbo.LatitudePlusDistance(@Latitude, @WithinMiles)
-- Calculate the min lat/long
SELECT @MinLatitude = 2 * @Latitude - @MaxLatitude,
@MinLongitude = 2 * @Longitude - @MaxLongitude
SELECT Top 20 *, dbo.CalculateDistance(@Longitude, @Latitude,
LocationLongitude, LocationLatitude) as 'Distance'
FROM Location
WHERE LocationLongitude Between @MinLongitude And @MaxLongitude
And LocationLatitude Between @MinLatitude And @MaxLatitude
And dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude,
LocationLatitude) <= @WithinMiles
ORDER BY dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude,
LocationLatitude)
المحلول
لماذا إعادة @الحرارة إلى 1 أو -1 في CalculateDistance وظيفة ؟
التحديث.حسنا لا يهم أعلاه.هل أنت متأكد من خط العرض / خط الطول صحيحة ؟ لقد حساب التالية باستخدام القالب.لنا:
10715 Downsville بايك Ste 100, 21740 يعود (39.607483, -77.753747)
444 E College Ave Ste 120, 16801 يعود (39.607483, -77.753747)
باستخدام الصيغ (تقريب إلى 6 أرقام بعد العلامة العشرية كما أن الدقة عاد أعلاه) تحصل على التالي:
sin(39.607483/57.295779) * sin(40.798594/57.295779)
+ cos(39.607483/57.295779) * cos(40.798594/57.295779)
* cos(77.753747/57.295779 - 77.856110/57.295779) = 0.99978299
3958.75586574 * arccos(0.99978299) = 82.4748331
والذي يبدو معقولا.