我正在将地图标记加载到Google Maps API(v3),方法是检查它们是否在map.getBounds()中,然后使用该数据过滤SQL查询。它的工作效果很好,除了标记加载之外似乎只受到视口的北边和南边的限制 - 当我向左或向右平移时,仍有标记填充到我的初始的东和西视口位置。
如您所见,所有可能的标记都沿着东/西加载,即使它们不在原始边界框中。
PHP / MySQL的:
function get_addresses_from_bounds($swLat = null, $swLong = null, $neLat = null, $neLong = null) {
if(!$swLat || !$swLong || !$neLat || !$neLong) {
return;
}
$q_where = [];
$q = "SELECT `latitude`, `longitude` FROM `customer_cards` as `c` INNER JOIN `geo_location` as `g` ON `g`.`placename` = `c`.`delivery_postcode`";
//Bounds
$q_where[] = ":swLat < :neLat AND `latitude` BETWEEN :swLat AND :neLat) OR (:neLat < :swLat AND `latitude` BETWEEN :neLat AND :swLat";
$q_where[] = ":swLong < :neLong AND `longitude` BETWEEN :swLong AND :neLong) OR (:neLong < :swLong AND `longitude` BETWEEN :neLong AND :swLong";
if(!empty($q_where)) {
$q .= ' WHERE ( ' . implode(' ) && ( ', $q_where) . ')';
}
$stmt = $pdo->prepare($q);
// Assign variables
$stmt->bindParam(':swLat', $swLat, PDO::PARAM_STR);
$stmt->bindParam(':swLong', $swLong, PDO::PARAM_STR);
$stmt->bindParam(':neLat', $neLat, PDO::PARAM_STR);
$stmt->bindParam(':neLong', $neLong, PDO::PARAM_STR);
$stmt->execute();
$members = $stmt->fetchAll();
for ($i = 0; $i <= count($members); $i++) {
unset($members[$i][0]);
unset($members[$i][1]);
}
return $members;
}
更新:通过使用更简单的WHERE来选择边界,它已部分修复了我的问题。它现在只能向东方,屏幕以西的界限很好。
WHERE `latitude` > :swLat AND `latitude` < :neLat AND `longitude` > :swLong AND `longitude` < :neLong
更新2 :我使用上面的查询,不知道是怎么回事,因为它是在漫长的一天抨击之后。所以我没有添加这个作为答案