在我的页面上,当它加载它获取你的位置并在你的位置设置标记,然后我希望它从我的数据库加载所有标记并在地图上设置它们,但我只想加载其中的标记1km的位置。我正试图设置它,但我遇到了一些麻烦。
所以标记是从数据库加载的,如下所示:
<?php while($stmt -> fetch()) { ?>
var longi = "<?php echo $gLongitude; ?>";
var lati = "<?php echo $gLatitude; ?>";
var title = "<?php echo $gTitle; ?>";
setMarker(lati, longi, title);
<?php } $stmt -> close(); $mysqli -> close();?>
然后setMarker函数调用如下:
function setMarker(lati, longi, title) {
var latLongMarker = new google.maps.LatLng(lati,longi);
marker = new google.maps.Marker({
position: latLongMarker,
map: map,
draggable: false,
title: title
});
arrMarkers.push(marker);
}
一切正常,花花公子,并将数据库中的所有标记加载到地图上,但我怎样才能加载距离我1公里的标记?我读到了关于computeDistanceBetween()但我找不到一个例子来拯救我的生命。提前谢谢大家。
我最终找到了一种方法来实现这一目标,最终会更容易,更快速地处理这里,你会去寻找未来的任何人:
<?php while($stmt -> fetch()) { ?>
var longi = "<?php echo $gLongitude; ?>";
var lati = "<?php echo $gLatitude; ?>";
var title = "<?php echo $gTitle; ?>";
var content = 'Bus arrives at: ' + "<?php echo $gWeekdayDay; ?>";
database.push({latitude: lati, longitude: longi, markerTitle: title, content: content});
<?php } $stmt -> close(); $mysqli -> close();?>
for (var i = 0; i < database.length; i++) {
createMarker(database[i].latitude, database[i].longitude, database[i].markerTitle, initialLocation,
database[i].content);
}
function createMarker(lati, longi, title, myPosition, content) {
var latLongMarker = new google.maps.LatLng(lati, longi);
distanceCompare.push({position: latLongMarker, markerTitle: title});
setMarker(myPosition, latLongMarker, title, content);
}
function setMarker(myPosition, latLongMarker, title, content) {
distance = google.maps.geometry.spherical.computeDistanceBetween(latLongMarker, myPosition);
console.log('Distance of '+latLongMarker+ 'and original position' + myPosition + 'Is equal to '+distance);
updateResults();
if (distance < setDistance) {
addMarker(latLongMarker, title, content);
stopsfound++;
updateResults();
console.log(content);
}
}
function addMarker(position, title, content) {
console.log('Adding Marker ' + content);
marker = new google.maps.Marker({
position: position,
map: map,
title: title
});
bindInfoWindow(marker, content);
markersArray.push(marker);
}
答案 0 :(得分:2)
您需要使用Haversine formaula。以下代码使用PDO使用此公式。您需要更改$mysqli
。
$stmt = $dbh->prepare("SELECT name, lat, lng, (6372.8 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM mytable HAVING distance < 1 ORDER BY distance ASC LIMIT 0 , 20");
// Assign parameters
$stmt->bindParam(1,$center_lat);//Coordinates of location
$stmt->bindParam(2,$center_lng);//Coordinates of location
$stmt->bindParam(3,$center_lat);
此查询用于此DEMO
答案 1 :(得分:0)
首先,你需要创建一个表,例如调用地点,这需要有lat和long字段。 然后你需要创建一个获取半径(km或milles)的位置的查询 这里是查询的一个例子
public function getRecents($nro_places, $lat='-33.45287', $lng='-70.58598') {
$query = Doctrine_Query::create();
$query->select('p.*, ( 6371 * acos( cos( radians('.$lat.') ) * cos( radians( m.lat ) ) * cos( radians( m.lng ) - radians('.$lng.') ) + sin( radians('.$lat.') ) * sin( radians( m.lat ) ) ) ) AS distance'); //this is all you need
$query->from('Places p, p.Maps m');
$query->having('distance < 3'); //3kms
$query->where('status = 1'); //places enabled
$query->orderBy('p.created_at DESC, distance ASC');
$query->limit($nro_places);
$result = $query->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
return $result;
}
这是一个带有您需要的查询的查询示例。 http://wiki.linuxservertech.com/faq/index.php?action=artikel&cat=4&id=7&artlang=en
希望这个帮助