المسافة بين اثنين من المواقع باستخدام خطوط الطول والعرض بعيدا ما تقول جوجل

StackOverflow https://stackoverflow.com/questions/1604298

سؤال

قضيت بضعة أيام في محاولة لمعرفة هذا واحد و لا يمكن أن يبدو لتحديد المشاكل.لدي قاعدة بيانات 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

والذي يبدو معقولا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top