我正在使用Google地图制作一个小应用程序,用于确定输入的地址是否属于预定义的服务区域。
用户输入地址,PHP脚本从Geocoding API获取纬度/经度,并使用一堆坐标(从Maps生成的KML文件中获取)应用射线投射到组成该区域的顶点上。
问题在于:它大多数时候都有效,但有些地址在服务区域之外错误地报告为合格,而其他一些地址则在区域内却不合格。起初我以为这是Google地图的精度问题,但从Geocoding服务中生成的坐标非常准确。这可能与公式有关。
这就是它(它基于我在其他地方找到的代码):
用户输入地址,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++;
}
}
这里有什么我忽略的吗?我尝试自己推导公式,并在一定程度上理解了其中的数学原理,但使用谷歌地图的GPS坐标是否可行呢?
似乎并没有真正准确的错误报告模式:我测试了靠近边界或服务区角落的地址等情况,但都没有发现规律。值得注意的是,此服务区仅是城市中相对较小的区域,与州或全国范围的区域完全不同。