2017-12-09 10 views
0

場所のセットに対してgeography :: EnvelopeAggregateを取得しようとしています。地理的な列の値は、個々の点の緯度/経度を使用して計算されます。 境界ボックス(エクステント)をフェッチしようとすると、ボックスはすべての個々のポイントをカバーしません。これは予想される動作ですか?この分野の専門知識を持つ人は、いくつかのインプットを提供できますか? 以下は、SQLコードと対応するマップをプロットしたものです。SQL geography :: EnvelopeAggregateの出力が正確でない

IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'tempdb..[#ServicePoints]')) 
    BEGIN 
     DROP TABLE #Points 
    END 
CREATE TABLE #Points 
(
    PointId nvarchar(max), 
    Lat float, 
    Long float, 
    Location geography 
) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point1', 47.659226, -117.218292, geography::Point(47.659226, -117.218292, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point2', 47.659226, -117.218292, geography::Point(47.659226, -117.218292, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point3', 47.659226, -117.218292, geography::Point(47.659226, -117.218292, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point3', 47.658276, -117.218474, geography::Point(47.658276, -117.218474, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point3', 47.658323, -117.21899, geography::Point(47.658323, -117.21899, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point3', 47.658341, -117.219487, geography::Point(47.658341, -117.219487, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point3', 47.660115, -117.219365, geography::Point(47.660115, -117.219365, 4326)) 
insert into #Points(PointId, Lat, Long, Location) 
values ('point3', 47.658478, -117.216265, geography::Point(47.658478, -117.216265, 4326)) 

select * from #Points 
--select geography::Point(47.658323, -117.21899, 4326) 
Select E1.ID, 
        E1.SPEXtents.STPointN(3).Lat as BottomLeft_Lat, 
        E1.SPEXtents.STPointN(3).Long as BottomLeft_Long, 
        E1.SPEXtents.STPointN(1).Lat as RightTop_Lat,   
        E1.SPEXtents.STPointN(1).Long as RightTop_Long, 
        E1.SPExtents.STPointN(2).Lat as BottomRight_Lat, 
        E1.SPExtents.STPointN(2).Long as BottomRight_Long, 
        E1.SPExtents.STPointN(4).Lat as TopRight_Lat, 
        E1.SPExtents.STPointN(4).Long as TopRight_Long 

     from 
     (SELECT 1 as ID, 
       geography::EnvelopeAggregate(sp.Location) AS SPExtents 
     FROM #Points sp 
     ) E1; 

これらの点の地図内の表現は以下のとおりです。見ることができるように、2点は境界の外側にある。 2 Points lying outside the extents.

または、これらの4つの座標を結ぶ円を描くべきですか?この場合、すべての点が円の中に入ることがわかります。いくつかの大まかなテストによると Circle plotted using the coordinates

Circle

答えて

1

EnvelopeAggregateは円形領域を返すように、それが見えます。私は次のようにこれを見つけた:

select geography::EnvelopeAggregate(sp.Location).ToString() AS SPExtents 
FROM #Points sp 

あなたはそれで説明実際の面積を見たい場合は、単に上から.ToString()を削除します。

関連する問題