入力された住所が事前定義されたサービス地域の一部であるかどうかを判断する、Google マップを使用した小さなアプリケーションを作成しています。
ユーザーが住所を入力すると、PHP スクリプトがGeocoding APIから緯度/経度を取得し、地域の頂点を構成する一連の座標 (Maps が生成した KML ファイルから取得) を使用してレイキャスティングを適用します。
問題は次のとおりです。これはほとんどの場合機能しますが、サービス地域外の一部の住所は適格と誤って報告され、地域内の他の住所は不適格と報告されます。最初は、これは Google マップの精度の問題だと思っていましたが、Geocoding サービスで住所から生成された座標は正確です。それはおそらく式と関係があります。
ここにあります(他の場所で見つけたコードに基づいています):
// $points is an array full of Point objects (the vertices), which contain lat/long variables
// $ctr is simply a counter that we will test to see if it's even/odd
for ($i = 0, $j = sizeof($points) - 1; $i < sizeof($points); $j = $i++) {
$p1 = $points[$i];
$p2 = $points[$j];
// $test_point is the lat/long pair of the user's address
if ($p1->lat < $test_point->lat && $p2->lat >= $test_point->lat || $p2->lat < $test_point->lat && $p1->lat >= $test_point->lat) {
if ($p1->long + ($test_point->lat - $p1->lat)/($p2->lat - $p1->lat)*($p2->long - $p1->long) < $test_point->long)
$ctr++;
}
}
私がここに欠けているものはありますか?自力で公式を導き出してみて、数学はある程度理解できたのですが、これでGoogleマップのGPS座標を使っても大丈夫でしょうか?
何が誤って報告されるかについて実際のパターンはないようです。境界に近い住所やサービス エリアの隅にある住所などをテストしましたが、うまくいきませんでした。また、注目に値するのは、このサービス エリアは都市の比較的小さな地域であり、州や国全体のエリアとは異なります.