首页 文章

php 中的 MongoDB 地理空间查询

提问于
浏览
5

我正在尝试使用 MongDBs 2d 索引来运行地理空间查询,如下所述 - http://www.mongodb.org/display/DOCS/Geospatial 索引

它工作正常,我可以运行诸如此类的查询

db.places.find( { point : { $near : [151.1955562233925,-33.87107475181752]  , $maxDistance : 0.1/111} } )

从 CLI 工具,但当我尝试在 PHP 中运行查询(使用 PECL mongo 驱动程序)时,我无法获得任何结果。

有关如何为 PHP 编写上述查询的任何帮助?有谁知道 PHP 驱动程序是否支持地理空间查询?

谢谢

5 回答

  • 7

    我在生产中使用 PHP 驱动程序进行地理查找。它看起来像这样:

    $latLong = $geo->lookupLatLong($address);
    $cursor = $coats->find(Array('latLong' => Array('$near' => $latLong)))->limit(10);
    

    此外,您可能需要考虑使用**$nearSphere**而不是$near 来获得更准确的坐标。有关更多信息,请参见mongo docs

  • 1

    让我为您的 mongo 查询尝试确切的 PHP 端口。

    $collection->find(Array("point" => Array('$within' => Array('$center'=> Array(Array(151.1955562233925,-33.87107475181752), 0.1/111 ) ) )));
    

    请确保使用 float 对 lat-longs 进行类型转换。或者 mongo 扩展将把它视为一个字符串(惊讶,惊讶),并且查询将返回假设空条件(这需要我永远找到)。

    编辑:查看 Cakephp mongo 驱动程序源,了解更多使用地理查询的方法。 https://github.com/ichikaway/cakephp-mongodb/blob/master/samples/controllers/geos_controller.php

  • 0

    我没有成功使用'near'作为 PHP 中查找条件的一部分。

    您可以使用 MongoDb geoNear 命令:

    $db->command(array('geoNear'=>'places','near'=>array(151.1955562233925,-33.87107475181752),'num'=>9));
    
  • 0

    在 PHP 中使用$nearSphere 命令的示例如下所示:

    $lonlat = array($lon, $lat);
    $cursor = $this->collection->find(Array('loc' => Array('$nearSphere' => $lonlat)))->limit($limit);
    

    其中'loc'是 2d 地理空间索引,limit 是可选的。

  • 0

    根据MongoDB 网站中的文件

    { $near: { $geometry: { type: "Point" , coordinates: [ <longitude> , <latitude> ] }, $maxDistance: <distance in meters>, $minDistance: <distance in meters> } }

    上述查询的 php 代码为:

    $query = array(
                    'loc' => array(
                        '$near' => array(
                            '$geometry' =>array(
                                'type' => 'Point',
                                'coordinates'=>array(floatval($lon),floatval($lat)),
                                '$maxDistance' => intval($max_distance),
                                '$mixDistance' => intval($min_distance)))));
    

相关问题