我想只显示某个地理位置半径范围内的标记?

时间:2013-03-08 02:28:55

标签: javascript jquery google-maps google-maps-api-3

在我的页面上,当它加载它获取你的位置并在你的位置设置标记,然后我希望它从我的数据库加载所有标记并在地图上设置它们,但我只想加载其中的标记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);
}

2 个答案:

答案 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

希望这个帮助