2

私はこれを理解しようと数日を費やしましたが、問題を特定できないようです。緯度と経度をDecimal(18,8)として格納しているSQL 2005データベースがあります。これらはすべて、Googleにクエリして受け取ったものです。

これらの2つの場所の場合:From:10715 Downsville Pike Ste 100 MD 21740 to:444 East College Ave Ste 120 State College PA、16801

その距離が「カラスが飛ぶように」なることを考慮に入れると、私の結果はまだかなり遠いです。この例では、私の結果は21.32マイルと表示されていますが、Googleマップは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)
4

1 に答える 1

2

なぜCalculateDistance関数で@Tempを1または-1にリセットするのですか?

更新します。わかりました、上記を気にしないでください。緯度/経度は正しいですか?geocoder.usを使用して以下を計算しました:

10715 Downsville Pike 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

これは合理的なようです。

于 2009-10-22T00:00:56.507 に答える