2011-12-14 32 views
1

私たちは1つのマップソリューションを開発中です。 ここで、ユーザーはマップ上に1つのポリゴンを描画しています。与えられた点について、ポイントがポリゴンの中にあるかどうかを調べる必要があります。ポリゴンの経度 - 緯度のポイント

このタスクを実行するのに、http://www.sql-statements.com/point-in-polygon.htmlとして1つのSQLテクニックを使用していますが、一部の地域では機能していないことがわかりました。

誰にもこれに適切な解決策がありますか?私たちはC#で解決策を試すこともできます。正常に動作する場合は

ありがとうございます。 http://en.wikipedia.org/wiki/Point_in_polygon

から

+0

Jasonwによって追加されたジオロケーションタグが削除されました。ジオロケーションとして "地理座標のセットではなく、意味のある場所(例:ストリートアドレス)の決定に重点を置いています" [Wikipedia] –

+0

失敗する?そのコードをスキャンすることは、完全に優れたレイトレーシング実装のようです。何が問題なの? –

答えて

4

SQL Server 2008を使用している場合は、STIntersection (geography Data Type)を使用できます.SQL Serverはすべての処理を行います。

この場合、地理的データのネイティブサポートを提供するため、SQL Server 2008をお勧めします。あなたがそれを使用する前に "STIntersect giving incorrect result for geography Datatype"は読む価値があります。そのサイトからの例:

declare @point geometry 
declare @polygon geometry 
set @point = geometry::STGeomFromText('POINT (-88.22 41.50000001)', 4326) 
set @polygon = geometry::STGeomFromText('POLYGON ((-88.2 41.5, -88.2 41.6, -88.3 41.6, -88.3 41.5, -88.2 41.5))', 4326)--124 
Select @point.STIntersection(@polygon).ToString() 
+0

幸運にも私はSQL 2008を持っており、あなたのソリューションはうまくいくように動作します。ありがとうございました – user867198

1

言い換えこれを行う最も簡単な方法は、一つの方向にあなたのポイントから仮想線を描き、それを横断する行数をカウントしています。それが奇妙であれば、ポイントは内側にあり、ポイントが外側にあっても。

基本的に各ポイントのペアを繰り返し、ポイントで水平線を横切る場所を見つけます。右に交差する場合はカウンタを増やし、左に交差する場合は無視します。あなたの地点での地平線は、どちらも数えられません(境界条件)。

+0

これは、リンク先のコードと同じです。 –

1

PIPソリューションの基本的な説明は重要なものの半分を欠けているIMHO、すなわち、ポリゴンのラインが実際に交差されていたためにテストするかを決定する方法。ちょうどMichałPowagaのソリューションの場合は、あなたのために働いていない。

ポイントP(x、y)がポイントです。点P0(x0、y0)とP1(x1、y1)は線を形成する。私たちが交差するポリラインの数を見るために描画する想像線は水平です。

1)まずラインは明らかに交差されない上または線以下である、実際に横断可能(あなたが描く想像線に平行なラインまたはライン)であるかを決定します。

For each line of the polygon, compute weather P would be able to cross it. 
If ((x0 < x < x1) OR (x0 > x > x1)) add line to some list. 

2)を決定します残りの行(リスト中のもの)のどちら実際交差する:

For each line in list, compute 
    result = (y - y0) * (x1- x0) - (x - x0) * (y1 - y0) 
If (result < 0) the line was crossed, increment a counter. 
If (result == 0) the point is ON the line, increment a counter if thats supposed 
    to count as the point having crossed the line, else don't ... 
If (result > 0) the line was not crossed, so just continue with the loop. 
[Note: double check weather I got the sides right ...] 

3)次に、カウンタはあなたの点が内部で奇数である場合、それも、またはゼロの場合、それはポリゴンの外側にあります。

関連する問題