1

ポリゴン内のすべてのポイントを取得しようとしていますが、いくつかのテストの後、最終的にキャッチしました。

STIntersectsポイントが「視覚的に」ポリゴンにない場合でも、すべてのエンティティに対して常に1を返します。

ポリゴンの作成方向に関する投稿を見つけて試してみましたが、役に立ちませんでした:)

そこで、単純なケースを作成することにしました。

  1. ロシアのどこかにある 4 つの頂点を持つポリゴン (コーナー: 55 37、56 38)
  2. この多角形内の 1 点
  3. そして外にもう一人

ここにポイント付きのGoogleマップへのリンクがあります

そして、このテストの結果は私を轍から抜け出させました

declare @cw geography, @ccw geography, @pointIn geography, @pointOut geography

-- counterclockwise direction from bottom left corner
set @ccw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,55.0 38.0
,56.0 38.0
,56.0 37.0
,55.0 37.0
))', 4326
)

-- clockwise direction from bottom left corner
set @cw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,56.0 37.0
,56.0 38.0
,55.0 38.0
,55.0 37.0
))', 4326
)

set @pointIn = geography::Point(55.5, 37.5, 4326)
set @pointOut = geography::Point(54, 36, 4326)


select @pointIn.STIntersects(@ccw) ccw, @pointIn.STIntersects(@cw) cw
-- result: 1   0

--here i should get inversed values, but it didnt happens
select @pointOut.STIntersects(@ccw) ccw, @pointOut.STIntersects(@cw) cw
-- result: 1   0

なぜこれが起こるのですか?何が欠けているのか理解できません

pointInポリゴンが小さい場合は 1 を返し、ポリゴンが全世界から選択した領域を引いたpointOut場合は 0 を返し、最初のケースでは 0 を返し、2 番目のケースでは 1を返すことを期待しています

ただし、反時計回りのポリゴンでは両方のポイントが 1 を返します。

アップデート

最後に、私のエラーは、geography::STPolyFromText 最初の入力パラメータの順序がlngで、2番目がlatである必要がありました。拡張機能では、順序が 異なります msdn は次のように述べています。Point ( Lat, Long, SRID )

4

1 に答える 1

1

SqlGeography インスタンスでは、@ccw はホールを定義します (反時計回りの順序のため)。この穴はポリゴン内にないため、グローブの穴になります。別の言い方をすれば、@cw ポリゴンを除いた地球全体をカバーする Polygon を取得します。

Geography::Pointは WKT の逆座標も使用するため、データを知っているのはあなただけなので、緯度と経度の座標が間違っていると思います (絶対に確実ではありません)。とにかく、添付の画像はこれを説明するのに十分なはずです. 「オレンジ」色は @ccw、青は @cw、残りはラベル付けされています。

SSMS を使用している場合は、次のクエリを使用して視覚化できます。ポイントはバッファリングされているため、確認できます。

select
'Clockwise' AS Label,
@cw AS Item

union all

select
'Counter-Clockwise' AS Label,
@ccw AS Item

union all

select
'Point In' AS Label,
@pointIn.STBuffer(100000) AS Item

union all

select
'Point Out' AS Label,
@pointOut.STBuffer(100000) AS Item

それが役に立てば幸い。

ここに画像の説明を入力

于 2014-08-28T15:09:42.533 に答える