php-从数据库中为可见区域加载标记
作者:互联网
我正在尝试从数据库中加载标记(实际上是自定义叠加层),该数据库包含每个标记的经度和纬度.我只想在Google地图的当前可见区域中加载标记.
我要做的是获取地图边界并计算最大和最小纬度和经度.每次拖动或更改缩放比例时,都会使用ajax发送这些范围,然后使用如下所示的sql查询从数据库中检索正确的标记:
AND lat BETWEEN :minLat AND :maxLat
AND lng BETWEEN :minLng AND :maxLng
效果很好…除了当我当前在google地图的两个重复世界之间寻找时.
sql查询将不再适用于那些地图范围(sw和ne),因为每个范围都来自各自的世界.然后,我将不会检索任何标记.
示例:澳大利亚大约是lng = 150,在这种情况下,我将拥有
minLng = 25(sw)和maxLng = 0(ne)…即使我现在正在看澳大利亚,显然150也不在0到25之间.
我还没有看到关于这个特定问题的任何问题…
有解决的办法吗?我究竟做错了什么?
编辑:我终于解决了我的问题…这是我所做的:
// normal case
if( $swLng < $neLng )
{
$ANDOR_lng = "AND";
}
// Case where world repeated
else
{
$ANDOR_lng = "OR";
}
$dql = "SELECT MYSTUFF ...
AND lat BETWEEN :latA AND :latB
AND ( lng > :lngA ".$ANDOR_lng." lng < :lngB )";
$parameters = array(
'latA' => $swLat,
'latB' => $neLat,
'lngA' => $swLng,
'lngB' => $neLng
);
}
解决方法:
通常,您期望w(西经)小于e(东经),即:
:minLng < :maxLng
但是,但是当边界框包含180(或-180)的子午线时,这是不正确的.在这种情况下,查询的这一部分永远不会返回true:
( lng > :minLng AND lng < :maxLng )
您可以做的是交换:minLng和:maxLng,使上述假设再次变为正确:
if(:minLng > :maxLng) {
:minLng, :maxLng = :maxLng, :minLng
}
如果您在上方查看地图,则与绘制地图时所做的操作是一致的:sw角的经度大于ne角.
警告:我已经多年没有编写PHP代码了,我不知道您是否真的可以用a,b = b,a来交换它们的值,我只知道这在Python中有效,但是您明白了.
标签:google-maps-api-3,google-maps-markers,php 来源: https://codeday.me/bug/20191201/2083585.html