10

GPS からのデータを含むテーブルがあります。例: Latitude, Longitude, Time,UserId

すべての距離をすべてのポイント (時間順) で合計し、ユーザーごとにデータをグループ化して、指定された時間枠で合計距離を集計する方法は?

ありがとう

4

2 に答える 2

6

SQL Server を使用している場合は、専用の方法と地理的インデックスを使用してデータベースを要求できるように、geography データ型の使用に関心があるかもしれません。

geography データ型は SQL Server 2008 以降で使用できます。詳細については、次を参照してください。

http://msdn.microsoft.com/en-us/library/cc280766.aspx

geography 列にデータを取得したら、STDistance() メソッドを使用して 2 点間の距離を計算できます。MSDN を参照してください。

http://msdn.microsoft.com/en-us/library/bb933808.aspx

次の例では、STDistance() を使用して、メートル (国際標準単位) で返される 2 点間の距離 (地理的変形を含む) を計算しています。

DECLARE @pointA geography;
DECLARE @pointB geography;
SET @pointA = geography::STGeomFromText('POINT(-122.34900 50)', 4326);
SET @pointB = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @pointA.STDistance(@pointB);

SQL Server 2005 を使用している場合 (または geography データ型の使用を避けたい場合) は、CodePlex の MsSQLSpatial プロジェクトを参照してください: http://mssqlspatial.codeplex.com/wikipage?title =Features&referringTitle=ホーム

于 2013-02-25T08:55:21.313 に答える
5

以下の関数は、2 つの地理座標間の距離をマイル単位で返します。

create function [dbo].[fnCalcDistanceMiles] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4))
returns decimal (8,4) as
begin
declare @d decimal(28,10)
-- Convert to radians
set @Lat1 = @Lat1 / 57.2958
set @Long1 = @Long1 / 57.2958
set @Lat2 = @Lat2 / 57.2958
set @Long2 = @Long2 / 57.2958
-- Calc distance
set @d = (Sin(@Lat1) * Sin(@Lat2)) + (Cos(@Lat1) * Cos(@Lat2) * Cos(@Long2 - @Long1))
-- Convert to miles
if @d <> 0
begin
set @d = 3958.75 * Atan(Sqrt(1 - power(@d, 2)) / @d);
end
return @d
end 

以下の関数は、2 つの地理座標間の距離をキロメートルで返します。

CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT 
AS
BEGIN

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END

使用法:

select [dbo].[fnCalcDistanceKM](13.077085,80.262675,13.065701,80.258916)

以下の関数は、SQL Server 2008 で導入されたGeographyデータ型を 使用して、2 つの地理座標間の距離をキロメートル単位で示します。

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);

参照: Ref1Ref2

これが役立つことを願っています

于 2014-03-20T08:06:08.887 に答える