0

テーブルの 1 つに保存したのは、次の形式の地理的ポイントです。

経度 緯度 郵便番号

アイデアは、表の情報を使用して、指定された経度と緯度によって最も近い利用可能な郵便番号を取得することです。

私のアルゴリズムは次のように機能します。

  1. UserLongitude と UserLatitude の初期化
  2. StepVariable を 1.0 として初期化
  3. テーブルからすべてのレコードを取得する

    longitude>UserLongitude-StepVariable 
    and
    longitude<UserLongitude+StepVariable 
    and
    latitude>Userlatitude-StepVariable   
    and
    latitude<Userlatitude+StepVariable
    
  4. レコードが見つからない場合は、StepVariable を 1.0 で増やし、手順 3 を実行します。

私が読んだように、1.0 の経度の値は、極に移動するにつれて小さくなります。そのため、経度と緯度の 1.0 の値が同じでない場合、私のアルゴリズムは正しくない方法で検索領域を拡張します。

検索可能な領域を正方形として拡張するトリッキーな方法はありますか? 今のところ、代わりに長方形を使用している場所があり、これにより検索が遅くなると思います。

4

2 に答える 2

0

特定の地理的地点の経度と緯度の長さが何メートルであるかを計算するために、次のアルゴリズムを使用します。

-- Geograpic Point Cordinates
DECLARE @LATTIDUDE REAL=45
DECLARE @LONGITUDE REAL=45
DECLARE @Distance REAL=10

-- Constants
DECLARE @ConvertionConstant AS FLOAT=2*PI()/360
DECLARE @MetersPerDegree AS FLOAT

DECLARE @LattidueInRadians AS FLOAT=@ConvertionConstant*@LATTIDUDE

DECLARE @LongitudeParameter1 AS FLOAT=111412.84
DECLARE @LongitudeParameter2 AS FLOAT=-93.5 
DECLARE @LongitudeParameter3 AS FLOAT=0.118

SET @MetersPerDegree=(@LongitudeParameter1*COS(@LattidueInRadians))+(@LongitudeParameter2*(COS(3*@LattidueInRadians)))+(@LongitudeParameter3*COS(5*@LattidueInRadians))
DECLARE @LongitudeRangeTemp AS FLOAT=@Distance/(@MetersPerDegree/1000)

-- Results for longitude
SELECT @LongitudeRangeTemp AS DegreesForGivenKM
SELECT @MetersPerDegree    AS MetersPerDegreeOfLongitude

-- Constants
DECLARE @LatitudeParameter1 AS FLOAT=111132.92
DECLARE @LatitudeParameter2 AS FLOAT=-559.82
DECLARE @LatitudeParameter3 AS FLOAT=1.175
DECLARE @LatitudeParameter4 AS FLOAT=-0.0023

-- Results for longitude
SET @MetersPerDegree=(@LatitudeParameter1+(@LatitudeParameter2*COS(2*@LattidueInRadians))+(@LatitudeParameter3*COS(4*@LattidueInRadians))+(@LatitudeParameter4*COS(6*@LattidueInRadians)))
DECLARE @LatitudeRangeTemp AS FLOAT=@Distance/(@MetersPerDegree/1000)
SELECT @LatitudeRangeTemp AS  DegreesForGivenKM
SELECT @MetersPerDegree   AS  MetersPerDegreeOfLatitude

キロメートルのパラメーターが追加されました。コードは、指定されたキロメートルに等しい度数を計算します。

関数内のコードを自由に実装できます。

于 2012-11-21T13:45:42.643 に答える
0

GeographyおよびGeometryデータ型とそれに関連する関数を使用することをお勧めします (例: STDistance)

http://msdn.microsoft.com/en-us/library/bb933917(v=sql.100).aspxを参照してください。

それができない場合は、Haversine 式が距離の計算に役立ちます。

于 2012-11-08T10:08:11.303 に答える