マップ内の座標のポリラインが与えられた場合、座標がこのポリライン内にあるかどうかを知るにはどうすればよいですか?
たとえば、この画像では次のようになります。
40.744818、-73.989701 (例) が内部にあるかどうかを知るにはどうすればよいですか?
PHPの場合に最適:P
ありがとうございました !
マップ内の座標のポリラインが与えられた場合、座標がこのポリライン内にあるかどうかを知るにはどうすればよいですか?
たとえば、この画像では次のようになります。
40.744818、-73.989701 (例) が内部にあるかどうかを知るにはどうすればよいですか?
PHPの場合に最適:P
ありがとうございました !
この質問はすでに解決されています (javascript を使用)。お読みください: https://gis.stackexchange.com/questions/26225/solving-the-point-in-polygon-problem-using-google-maps-and-fusion-tables
そして、ここに数学的な説明があります:
http://en.wikipedia.org/wiki/Point_in_polygon、ここにいくつかの異なるアルゴリズムがあります。Ray casting algorithm
ここから( RCA
)
をお勧めします: http://rosettacode.org/wiki/Ray-casting_algorithm
PHPで実装できる疑似コードがあります;)
数学の問題を解決するには、このプロジェクトを参照することをお勧めします: http://www.phpmath.com/home そして、あなたの問題に対して実装された PHP ソリューションを見つけられることを願っています;)
さらにパフォーマンスが必要な場合はcollusion detection
、2D で処理できます。最初のステップ: 多角形の周りに外側の長方形を作成します。長方形の内側の点を参照してください。内側の場合、ポイントがポリゴンの内側にある可能性があり、Ray Casting Algorithm
. 見る:
$px //the x coordinate of your point
$py //the y coordinate of your point
$ppy //the y coordinates of points of your polygon (in the correct order)
$ppx //the x coordinates of points of your polygon (in the correct order)
$isInside =
(max($ppy)>$py && min($ppy)<$px && max($ppx)>$px && min($ppy)<$px)?
RCA($px,$py,$ppx,$ppy):
false;
}
/**
* @description decide, is a point in poligon
* @param float $px the x coordinate of your point
* @param float $py the y coordinate of your point
* @param array(float) $ppx the x coordinates of the points of polygon
* array(x1,x2,...)
* @param array(float) $ppy the y coordinates of the points of polygon
* array(y1,y2,...)
* points of polygon: [x1,y1],[x2,y2],...
* @return boolean : Is the point inside the polygon?
*/
function RCA($px,$py,array $ppx,array $ppy){
//the implementation
}
(使用中に、外側の長方形の外側に多くの座標がある場合、このコードはより高速に実行されます。 2 max
、 2 min
、 2 <
、および 2の>
条件テストは よりも高速でRCA
あり、点が長方形の外側にある場合は、走るRCA
)
(以下のソリューションはオブジェクト指向ではありません。OOP
ソリューションを使用すると、より良いものになる可能性があります:))
PHP での実装であるヘルプ リンク: http://assemblysys.com/php-point-in-polygon-algorithm/ (正確には私が書いたものではありませんが、動作するはずです)