使用PHP进行MongoDB地理空间查询

5
我将尝试使用MongoDB的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驱动程序是否支持地理空间查询?

谢谢!


1
嘿,我正在尝试做类似的事情。你能告诉我你指定的maxDistance单位是什么吗?是公里还是英里?为什么要除以111? - swordfish
5个回答

7

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

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

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


非常感谢,我用这个方法解决了问题。很遗憾,在 PHP 中,简单的 MongoDB JSON 查询变得如此冗长。 - micmcg

2
根据MongoDB官网文档{ $near: { $geometry: { type: "Point" , coordinates: [ <经度> , <纬度> ] }, $maxDistance: <距离(米)>, $minDistance: <距离(米)> } } 以上查询的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)))));

1

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

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

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


1

让我尝试使用确切的PHP端口来执行您的Mongo查询。

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

请确保您使用float类型来转换经纬度。否则,mongo扩展将把它视为字符串(惊讶吧),并且查询将返回假定为空的条件(这花费了我很长时间才发现)。编辑:查看Cakephp mongo驱动程序源以获取更多使用地理查询的方法。https://github.com/ichikaway/cakephp-mongodb/blob/master/samples/controllers/geos_controller.php

+1 用于类型转换的注释。那是一个烦人的小细节。 - pospi

0

我在 PHP 中使用“near”作为查找条件时也没有成功。

您可以改用MongoDb的geoNear命令:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接