【问题标题】:MongoDB Geospatial queries in phpphp 中的 MongoDB 地理空间查询
【发布时间】:2011-03-18 03:32:53
【问题描述】:

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

它工作正常,我可以运行诸如

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

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

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

谢谢

【问题讨论】:

  • 嘿,我正在尝试做类似的事情。你能告诉我你指定的 maxDistace 是什么单位吗?是公里还是英里,为什么要除以 111。

标签: php mongodb geospatial


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢大家,我得到了它。很遗憾,mongo 中的简单 JSON 查询在 php 中变得如此冗长
【解决方案2】:

根据MongoDB website中的文档

{ $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)))));

【讨论】:

    【解决方案3】:

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

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

    请确保您使用浮点数对经纬度进行类型转换。否则 mongo 扩展会将其视为字符串(惊喜,惊喜),查询将返回假设为空条件(这让我永远找不到)。

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

    【讨论】:

    • +1 用于类型转换注释。这是一个麻烦的小细节。
    【解决方案4】:

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

    您可以改用 MongoDb geoNear 命令:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-07
        • 2019-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 2014-08-23
        相关资源
        最近更新 更多