php - Laravel 谷歌地图检查矩形是否包含位置
问题描述
我想在 Laravel 中像这个谷歌地图文档示例containsLocation()那样做,我有一个带有选定点的区域,比如一个矩形(多边形),我想检查一个新点是在这个区域的内部还是外部。
我尝试了这个包并使用了下面的功能,但无济于事。
$response = \GoogleMaps::load('directions')
->setParam([
'origin' => 'place_id:ChIJ685WIFYViEgRHlHvBbiD5nE',
'destination' => 'place_id:ChIJA01I-8YVhkgRGJb0fW4UX7Y',
])
->setParam([
'origin' => 'place_id:ChIJA01I-8YVhkgRGJb0fW4UX7Y',
'destination' => 'place_id:ChIJIyaYpQC4h0gRJxfnfHsU8mQ',
])
->setParam([
'origin' => 'place_id:ChIJIyaYpQC4h0gRJxfnfHsU8mQ',
'destination' => 'place_id:ChIJ685WIFYViEgRHlHvBbiD5nE',
])
->containsLocation(56.152257678858895, -3.6390740222681406);
解决方案
事实证明,这可以在没有谷歌地图的情况下完成,只需纯 php 进行一些计算,这要感谢tutorialspots.com/php-detect-point-in-polygon。
检测多边形中的点的 PHP 函数:
function contains($point, $polygon)
{
if($polygon[0] != $polygon[count($polygon)-1])
$polygon[count($polygon)] = $polygon[0];
$j = 0;
$oddNodes = false;
$x = $point[1];
$y = $point[0];
$n = count($polygon);
for ($i = 0; $i < $n; $i++)
{
$j++;
if ($j == $n)
{
$j = 0;
}
if ((($polygon[$i][0] < $y) && ($polygon[$j][0] >= $y)) || (($polygon[$j][0] < $y) && ($polygon[$i][0] >=
$y)))
{
if ($polygon[$i][1] + ($y - $polygon[$i][0]) / ($polygon[$j][0] - $polygon[$i][0]) * ($polygon[$j][1] -
$polygon[$i][1]) < $x)
{
$oddNodes = !$oddNodes;
}
}
}
return $oddNodes;
}
去测试:
$polygon = array(
array(0,0),
array(0,5),
array(4,3),
array(3,0),
array(0,0),
);
$point1 = array(3,3);
echo contains($point1,$polygon)?'IN':'OUT';
echo "<br />";
$point2 = array(4,4);
echo contains($point2,$polygon)?'IN':'OUT';
结果:输入,输出
推荐阅读
- python - 我将如何将这些多个连接作为 Django 查询集进行?
- mongodb - 使用 MongoDB 的休眠 OGM 无法解析属性
- c# - c#如何检查队列是否包含具有特定值的对象属性?
- javascript - 按子元素获取 div
- image - 使用 Xbee 进行单播图像传输
- mongodb - 为数组分配权重
- python - “过滤”输入数据以在 Python 中进行分析
- c# - 如何覆盖单元测试 StreamWriter C#
- mocha.js - 使用 Chai/Mocha 检查 JSON 数组中的值
- javascript - Svelte 框架:在运行时将环境变量传递给客户端包