1

在我的页面上,当它加载时它会获取您的位置并在您的位置设置一个标记,然后我希望它从我的数据库中加载所有标记并将它们设置在地图上,但我只想加载距离它们 1 公里以内的标记地点。我正在尝试设置它,但我遇到了一些麻烦。

所以标记是从数据库中加载的,如下所示:

<?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);
}
4

2 回答 2

2

您将需要使用Haversine 公式。下面的代码使用此公式使用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中使用了这个查询

于 2013-03-08T12:29:43.683 回答
0

首先,您需要创建一个表格,例如调用地点,这需要具有 lat 和 long 字段。然后,您需要创建一个查询来获取半径(公里或英里)的位置,这里是查询示例

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

希望这有帮助

于 2013-03-08T03:08:08.083 回答