緯度/経度の値のペアが与えられた場合、そのペアがポリゴン内にあるかどうかを判断するにはどうすればよいですか? PHPでこれを行う必要があります。Google Maps API にはhttps://developers.google.com/maps/documentation/javascript/referencecontainsLocation
というメソッドがあることがわかりました。これを PHP から活用する方法はありますか?
4 に答える
ポイントが多角形内にあるかどうかを確認する 1 つの方法は、ポイントから (任意の方向に) 引いた線が多角形の境界と交差する回数を数えることです。それらが偶数回交差する場合、その点は外側にあります。
このPoint in Polygonの記事の C コードを PHP で実装し、以下のポリゴンを使用して説明しました。
<?php
//Point-In-Polygon Algorithm
$polySides = 4; //how many corners the polygon has
$polyX = array(4,9,11,2);//horizontal coordinates of corners
$polyY = array(10,7,2,2);//vertical coordinates of corners
$x = 3.5;
$y = 13.5;//Outside
//$y = 3.5;//Inside
function pointInPolygon($polySides,$polyX,$polyY,$x,$y) {
$j = $polySides-1 ;
$oddNodes = 0;
for ($i=0; $i<$polySides; $i++) {
if ($polyY[$i]<$y && $polyY[$j]>=$y
|| $polyY[$j]<$y && $polyY[$i]>=$y) {
if ($polyX[$i]+($y-$polyY[$i])/($polyY[$j]-$polyY[$i])*($polyX[$j]-$polyX[$i])<$x) {
$oddNodes=!$oddNodes; }}
$j=$i; }
return $oddNodes; }
if (pointInPolygon($polySides,$polyX,$polyY,$x,$y)){
echo "Is in polygon!";
}
else echo "Is not in polygon";
?>
あなたの質問で言ったように、このメソッドは Google Maps API V3 の幾何学的ライブラリに関連しているため、PHP からオブジェクトを処理することはできません。解決策は、サーバーに ajax を呼び出して緯度を要求することです。 long はデータを返し (データベースに移動して作業を行います)、イベントが成功した場合 (Google マップのライブラリが既に読み込まれている状態で)、ポイントにそのポイントが含まれているかどうかを確認します。そして、ある時点でこれを保存する必要がある場合は、現在の位置の結果を送信する別の ajax を作成します。
これを行うにはいくつかの方法があると思います。1つ目は、この拡張機能または次のようなものを使用して、ポイントがポリゴンの内側にあるかどうかを判断することです:
Google-Maps-Point-in-Polygon 拡張機能
以下は、レイ キャスティング アルゴリズムの説明です。これも少し役に立ちます。
拡張機能の単純な例は、それが非常に単純であることを示しています。
var coordinate = new google.maps.LatLng(40, -90);
var polygon = new google.maps.Polygon([], "#000000", 1, 1, "#336699", 0.3);
var isWithinPolygon = polygon.containsLatLng(coordinate);