2017-02-13 16 views
0

2つのGeography変数を宣言したSQLクエリがあり、次にそれらに値が割り当てられた後にポリゴンの中心点を検索しようとしています変数。Geography変数でEnvelopeCenterを使用すると、SQL Serverで正しい値が返されない

DECLARE @g1 GEOGRAPHY; 
DECLARE @g2 GEOGRAPHY; 

SET @g1 = geography::STGeomFromText('POLYGON((-90.06875038146973 35.512324341620996,-90.06767749786377 35.51504904492378,-90.06407260894775 35.51499664765537,-90.06381511688232 35.512219543493465,-90.06875038146973 35.512324341620996))',4326); 
SET @g2 = geography::STGeomFromText('POLYGON ((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))',4326); 

SELECT @g1 AS 'G1' , 
     @g2 AS 'G2'; 

SELECT 'G1' AS 'Polygon' , 
     @g1.EnvelopeCenter().Lat AS 'Lat' , 
     @g1.EnvelopeCenter().Long AS 'Long' 
UNION ALL 
SELECT 'G2' AS 'Polygon' , 
     @g2.EnvelopeCenter().Lat AS 'Lat' , 
     @g2.EnvelopeCenter().Long AS 'Long' 

は次に、第2のポリゴンのために、それは47.6545001086162、-122.352999904254として正しく中央緯度/ long値を返します。

は、これは私のコードです。しかし、最初のものでは、90、0の値を返します。

最初のポリゴンの中心点が正しくないのはなぜですか?何らかの理由でこのようにできない場合は、WKT文字列の中心点を見つけることができる他の方法がありますか?

答えて

1

グローブの表面上の閉じた線は、2つの異なる有限空間の1つを表すことができます。どのスペースが定義されているかを知るには、シェイプの「内側」がどこにあるかを判断する必要があります。

この場合、G1は現在、地球儀の大部分から約-90.066,35.513周りの少量のスペースを引いたものを表しています。

あなたはそれが -90.066、35.513が含まれていることを世界の小さな部分を記述する場合は、あなたは形状を記述するために使用しているポイントの順序を変更する必要があります。

DECLARE @g1 GEOGRAPHY; 
DECLARE @g2 GEOGRAPHY; 

SET @g1 = geography::STGeomFromText('POLYGON((
               -90.06875038146973 35.512324341620996, 
               -90.06381511688232 35.512219543493465, 
               -90.06407260894775 35.51499664765537, 
               -90.06767749786377 35.51504904492378, 
               -90.06875038146973 35.512324341620996 
              ))',4326); 
SET @g2 = geography::STGeomFromText('POLYGON ((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))',4326); 

SELECT @g1 AS 'G1' , 
     @g2 AS 'G2'; 

SELECT 'G1' AS 'Polygon' , 
     @g1.EnvelopeCenter().Lat AS 'Lat' , 
     @g1.EnvelopeCenter().Long AS 'Long' 
UNION ALL 
SELECT 'G2' AS 'Polygon' , 
     @g2.EnvelopeCenter().Lat AS 'Lat' , 
     @g2.EnvelopeCenter().Long AS 'Long' 

結果(2):それは形状の外側対内側を決定するために使用される形状を記述する一連の点だから

Polygon Lat     Long 
------- ---------------------- ---------------------- 
G1  35.5136474138606  -90.0660789036838 
G2  47.6545001086162  -122.352999904254 

である - それは「左手の法則」と呼ばれます。

+0

これは完璧です! 35.513、-90.066が私が期待していたものです。しかし、私は通常、入力されたポイントのシーケンスを制御しませんし、私のポリゴンのいくつかには穴があります。値が90、0の場合は、スペースを逆にする方法はありますか?手動でポイントシーケンスを変更すると、特にポリゴンに穴がある場合は乱雑になる可能性があります。 – Raj

+0

できない場合は問題ありません。私は代わりに 'ジオメトリ'変数の重心を返すSTCentroid()メソッドを使用して同様の値を得ることが可能であることを発見しました(ちょうどおおよその値が必要でした)。その場合、シーケンスは重要ではないようです。しかし、私はそれが可能かどうか疑問に思っていただけです。どちらのケースでも、私の問題を解決してくれてありがとう! – Raj

+0

@Raj - 'STArea'を使ってサニティチェックを追加することもできます。もしそれがかなり大きければ、現在の地理と' FullGlobe'の間に 'STDifference'を使うことができますか? –

関連する問題