【发布时间】:2013-01-03 23:43:48
【问题描述】:
我正在使用 Google 地图制作一个小型应用程序,用于确定输入的地址是否属于预定义的服务区域。
用户输入一个地址,PHP 脚本从Geocoding API 获取纬度/经度,并使用构成该区域顶点的一组坐标应用光线投射(取自生成的 KML 文件地图)。
问题是这样的:它在大部分时间都有效,但是服务区域外部的一些地址错误地报告为合格,而该区域内部的其他一些地址则不合格。起初我认为这是 Google 地图的精度问题,但从地理编码服务中的地址生成的坐标是准确的。大概和公式有关吧。
在这里(它基于我在其他地方找到的代码):
// $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 坐标吗?
对于错误报告的内容似乎没有真正的模式:我测试了靠近边界的地址或服务区角落的地址,但没有运气。另外值得注意的是,这个服务区只是一个城市中相对较小的区域,与州或全国范围内的区域完全不同。
【问题讨论】:
-
我发现这个算法在这里非常有用:bit.ly/1eJSugg
标签: php gps maps raycasting