2017-01-10 5 views
0

ポイントがポリゴン内にあるかどうかを判断しようとしています。戻ってきた結果は、ポイントが境界内にあるかどうかにかかわらず常に1を返すように見えます。SQL Geography Intersectは常に1を返します

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.2225,-4.5366, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

私はあなたが古典的な問題を抱えているローカル

答えて

4

を実行しているSQL Expressの2014を使用しています。ジオメトリポリゴンでポイントを指定する順序は意味があります。あなたが定義したように、地球全体から小さな穴を差し引いたポリゴンを作成しました。幸いなことに、この問題のテストと修正プログラムはどちらも簡単です。

DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) 
set @polygon = @polygon.ReorientObject(); 
select @polygon.EnvelopeAngle() 

あなたはReorientObject()への呼び出しをコメントアウトする場合は、封筒の角度が180度であることがわかります。それはリングオリエンテーションの問題があるかどうかを私が個人的に調べるヒューリスティックです。また、STArea()で領域を確認することもできます。いずれにしても、再指向のオブジェクトは、あなたがおそらく予想していたものであり、交差テストを行うときにより良い結果をもたらすはずです。

+0

答えをありがとう - それは多くの意味があります。私は現在次のコードを使用していますが、戻り値はまだ '0'です 'DECLARE @point GEOGRAPHY = GEOGRAPHY :: Point(54.1826、-4.5420,4326)--INSIDE --DECLARE @point GEOGRAPHY = GEOGRAPHY :: Point(57.1826、-3.5420、4326) - 外部 DECLARE @polygon GEOGRAPHY = GEOGRAPHY :: STGeomFromText( 'POLYGON((54.2826-4.4420,54.2904-4.6564,54.0467-4.7031,54.2826-4.4420))、4326 ) if @ polygon.EnvelopeAngle()= 180 \t @polygon = @ polygon.ReorientObject(); SELECT @ polygon.STContains(@point) ' – Braydie

+2

これは大好きです:' POINT() 'メソッドは、あなたがポリゴンのために用意しているWKTとは逆の引数をとります!つまり、定義したように、緯​​度と経度を切り替えました。 'Select @ polygon.STPointN(1)。[Lat]、@point。[Lat]' –

+0

ああ、私は決してそれを見つけられませんでした!再度、感謝します!私はポイントのctorで私のcoordsの順序を逆転したが、まだゼロになっているように見える...私の脳は今少しあいまいですが、私は正しいとは思わない.. ..? – Braydie

関連する問題