web-dev-qa-db-ja.com

MSSQL Geography STIntersectsは、0が期待されるときに1を返します

説明できないMSSQL Geographyの問題が発生しています。私は数学に挑戦していると仮定しますが、次の点は次のポリゴンと交差してはならないようです:

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);


select
  @t_polygon.STAsText(), 
  @t_point.STAsText(),
  @t_point.STIntersects(@t_polygon), 
  @t_polygon.STIntersects(@t_point);

しかし、これを実行すると、次の結果が得られます。

POLYGON ((1 1, 5 5, 5 0, 1 1))  POINT (0 0) 1   1

最後の2つの列はどちらも1ですが、0を期待しています。0,0の空間内のポイントを、0,0に接触または包含していないポリゴンとどのように交差させることができますか?

-1、-1は100、100と同じように動作します。

ポイントを完全に異なる空間のポリゴンに変更しても、MSSQLはそれらが交差していると言います。

set @t_polygon = geography::STPolyFromText('POLYGON((10 10, 50 50, 50 10, 10 10))', 4326);
set @t_point = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);

STGeomFromText()も試しました。

私は何か間違ったことをしているに違いないと確信していますが、それが何であるか想像できません。

6
Mike Forget

あなたが問題を抱えている理由は、ポリゴンが間違った方法で巻かれているため、関心のある領域を除いて世界全体をカバーするポリゴンになるということです。

やってみる

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 0, 5 5, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);

少し奇妙ですが、地理的には球を扱っているため、境界のどちら側がポリゴンの内部であるかを判別する方法が必要です。 SQL Serverでは、これは外部境界を反時計回りとして定義することによって行われます。

ジオメトリは、どの方向に巻かれていてもかまいませんが、反時計回りを好みます。オブジェクトの方向を変更する地理ReorientObjectの関数があります。

9
MickyT