2011-03-18 80 views
5

我试图使用MongDBs 2D索引运行空间查询,因为这里概述 - http://www.mongodb.org/display/DOCS/Geospatial+Indexing在PHP MongoDB的地理空间查询

它的正常工作,而且我能够运行的查询,如

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

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

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

谢谢

+1

嘿我试图做同样的事情。你能告诉我你指定的maxDistace是什么单位吗?它是公里还是英里,为什么它被111除。 – swordfish 2012-01-31 12:37:02

回答

7

我与PHP驱动程序在生产工作的地缘查找。它看起来是这样的:

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

此外,您可能要考虑使用$ nearSphere,而不是$附近获得更精确的坐标。有关更多信息,请参见the mongo docs

+0

感谢堆,我得到了它的工作。令人遗憾的是,mongo中的简单JSON查询在php – micmcg 2011-03-21 00:37:41

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

其中“禄”是二维地理空间索引和限制是可选的。

1

让我试试你的mongo查询的确切的PHP端口。

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

请确保你使用浮点型来表示lat-longs。否则,mongo扩展将把它当作一个字符串(惊喜,惊喜),并且查询将返回假设为空的状态(这永远是我发现的)。

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

+0

+1中变得如此冗长以用于类型转换注释。这是一个麻烦的小细节。 – pospi 2014-06-03 06:16:54

0

根据文档中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)))));