3

環境: SQL Server 2012 地球上のポリゴンとポイントをプロットするために、これまでに見つけた唯一のオンライン ツールを使用しています。http://www.birdtheme.org/useful/googletool.html 2 つのテーブルがあります。1つは「エリア」をポリゴンとして保存し、もう1つのテーブルは私の質問に関係のないポイントを保存します。簡単にするために、シナリオを sql 変数に減らします。

以下のクエリでは、よく知られている名所に地理データ型を使用しています。ロベン島、ロベン島のポイント、アルカトラズ島のポイントの周りにポリゴンを描きました。

DECLARE @robben_island geography = ('POLYGON((18.351803 -33.788421,18.382788 -33.787494,18.386736 -33.820515,18.354464 -33.822369,18.351803 -33.788421))')
DECLARE @point_in_robben_island geography= ('POINT(18.369226 -33.80554)')
DECLARE @point_in_alcatraz geography= ('POINT(-122.423401 37.827006)')

SELECT @robben_island.STContains(@point_in_robben_island)   --returns 'False', but it's not what I expected
SELECT @robben_island.STContains(@point_in_alcatraz)        --returns 'True', but it's not what I expected

上記のこのクエリは、正しく理解すれば、 my@point_in_robben_islandは に含まれておらず@robben_island、@point_in_alcatraz が存在する@robben_islandことを示しています。

データ型を geography から geometry に変更すると、すべて正常に動作しますが、ジオメトリ データ型を引き続き使用すると、いくつかの問題に遭遇する可能性があるのではないかと心配しています。幾何学が地球の曲率を完全に説明していないという事実によって悪影響を受けないかどうか、私はただ疑問に思っています. 木に触れる。

DECLARE @robben_island geometry = ('POLYGON((18.351803 -33.788421,18.382788 -33.787494,18.386736 -33.820515,18.354464 -33.822369,18.351803 -33.788421))')
DECLARE @point_in_robben_island geometry= ('POINT(18.369226 -33.80554)')
DECLARE @point_in_alcatraz geometry= ('POINT(-122.423401 37.827006)')

SELECT @robben_island.STContains(@point_in_robben_island)   --returns 'True' as it should
SELECT @robben_island.STContains(@point_in_alcatraz)        --returns 'False' as it should

私の質問は、ジオメトリが期待どおりに機能しているのに、地理データ型が予期しない結果を返すのはなぜですか? どうもありがとうございました。

4

1 に答える 1

9

geography タイプは、geometry よりも少し限定的です。異なる半球を横切ることはできず、外側のリングは反時計回りに描く必要があります。

残念ながら (これは良いことだと思う人もいます)、SQL Server 2012 は、無効な地理を作成してもエラーをスローしなくなりました。次のように、Roben Island ジオメトリのポイントの順序を逆にする必要があります。

DECLARE @robben_island geography = ('POLYGON((18.351803 -33.788421, 18.354464 -33.822369,18.386736 -33.820515, 18.382788 -33.787494, 18.351803 -33.788421))')
DECLARE @point_in_robben_island geography= ('POINT(18.369226 -33.80554)')
DECLARE @point_in_alcatraz geography= ('POINT(-122.423401 37.827006)')

SELECT @robben_island.STContains(@point_in_robben_island)   --returns 'True'
SELECT @robben_island.STContains(@point_in_alcatraz)        --returns 'False'
于 2013-02-05T08:52:15.640 に答える