1

たとえば、ロシアの領土をカバーするポリゴンがあります(Googleマップのジオコーディングによる):

POLYGON ((19.64053 41.18535, -169.0465 41.18535, -169.0465 81.85812, 19.64053 81.85812, 19.64053 41.18535))

このポリゴンは、北半球と2つの反対側の半球(東半球と西半球)と交差しています。

シベリアのどこかでポイントを取りましょう:

POINT (93.3252301 56.1171069)

そして、シベリアがまだロシアにとどまっているものを確認してください:

var russia = DbGeography.FromText("POLYGON ((19.64053 41.18535, -169.0465 41.18535, -169.0465 81.85812, 19.64053 81.85812, 19.64053 41.18535))", 4326);
var point = DbGeography.FromText("POINT (93.3252301 56.1171069)", 4326);
var isSiberiaInRussia = russia.Intersects(point); 
// isSiberiaInRussia equals false, and it's wrong.

北半球と東半球だけが交差するポリゴンを考えてみましょう。モスクワにしましょう:

POLYGON ((37.31933 55.48993, 37.94566 55.48993, 37.94566 56.00966, 37.31933 56.00966, 37.31933 55.48993))

そしてそこに横たわっている誰かを連れて行ってください:

POINT (37.622504899999967 55.753602)

それを確認しましょう:

var moscow = DbGeography.FromText("POLYGON ((37.31933 55.48993, 37.94566 55.48993, 37.94566 56.00966, 37.31933 56.00966, 37.31933 55.48993))", 4326);
var lenin = DbGeography.FromText("POINT (37.622504899999967 55.753602)", 4326);
var isLeninLaysInMoscow = moscow.Intersects(lenin);
// He's still there...

それで、以下の基準を満たす地理的ヒットテストを行う方法はありますか?

  1. LINQと互換性がある
  2. EFコードファーストと互換性がある
4

1 に答える 1

2

あなたが抱えている問題は、地球の湾曲によるものです。ロシア用のポリゴンは、4点しかない非常に大きな長方形です。南端を表す線は、「シベリア」の上(北)に行くほど北に曲がっています。

これを機能させるには、「ロシア」ポリゴンにポイントを追加するか、地理の代わりにジオメトリを使用する必要があります。ただし、ジオメトリでは、ポリゴンが-180子午線と交差しないようにポリゴンを2つに分割する必要があります。

于 2013-08-29T10:35:12.380 に答える