0

Windows Phone 7.5 から SQL Server 2008 R2 データベースに位置情報の更新を取得しています。モバイルは車内にあり、追跡装置としても機能します。

例: この場所 (緯度: 51.5557830164189 経度: 0.0711440443992739 ) は、携帯電話から受信したものです。ここで、ほぼ 1.7m のレコードを持つ郵便番号テーブルで、この場所に対して最も近い場所または郵便番号を見つけたいと考えています。

私の郵便番号テーブルの定義は

CREATE TABLE [dbo].[PostCode1](
    [Postcode] [nvarchar](50) NOT NULL,
    [Coordinates] [geography] NOT NULL,
 CONSTRAINT [PK_PostCode1] PRIMARY KEY CLUSTERED 
(
    [Postcode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

グーグルでたくさんのブログを試しましたが、答えが見つかりません

誰かがクエリを使用してこれを達成する方法を教えてもらえますか?テーブルから1つのレコードだけが必要で、短時間で済みます。

ありがとう

4

1 に答える 1

2

以下のこの機能は非常に役立つことがわかりました。kmではなくマイルになるように修正しました。

これを、最も近い郵便番号を返すプロシージャを構築するための基礎として使用できます。

ビュー / @temptable を作成すると、ポイントからポイントまでの距離を計算し、最短距離でトップ 1 でフィルター処理できます。

/****** Object:  UserDefinedFunction [dbo].[DISTANCE] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[DISTANCE]
    (
    @Latitude1  float,
    @Longitude1 float,
    @Latitude2  float,
    @Longitude2 float
    )
returns float
as
/*
fUNCTION: F_GREAT_CIRCLE_DISTANCE

    Computes the Great Circle distance in kilometers
    between two points on the Earth using the
    Haversine formula distance calculation.

Input Parameters:
    @Longitude1 - Longitude in degrees of point 1
    @Latitude1  - Latitude  in degrees of point 1
    @Longitude2 - Longitude in degrees of point 2
    @Latitude2  - Latitude  in degrees of point 2

*/
begin
declare @radius float

declare @lon1  float
declare @lon2  float
declare @lat1  float
declare @lat2  float

declare @a float
declare @distance float

-- Sets average radius of Earth in Kilometers
set @radius = 3959.0E

-- Convert degrees to radians
set @lon1 = radians( @Longitude1 )
set @lon2 = radians( @Longitude2 )
set @lat1 = radians( @Latitude1 )
set @lat2 = radians( @Latitude2 )

set @a = sqrt(square(sin((@lat2-@lat1)/2.0E)) + 
    (cos(@lat1) * cos(@lat2) * square(sin((@lon2-@lon1)/2.0E))) )

set @distance =
    @radius * ( 2.0E *asin(case when 1.0E < @a then 1.0E else @a end ))

return @distance

end
于 2012-12-07T21:01:48.340 に答える