2011-03-18 12 views
5

Estoy tratando de utilizar la indexación MongDBs 2d para ejecutar consultas geoespaciales, tal como se describe aquí - http://www.mongodb.org/display/DOCS/Geospatial+Indexingconsultas MongoDB geoespaciales en php

Está funcionando muy bien, y estoy consultas de ejecución capaces como

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

desde la herramienta CLI, pero cuando intento ejecutar la consulta en PHP (usando el controlador mongo PECL) no puedo obtener ningún resultado.

¿Alguna ayuda sobre cómo escribir la consulta anterior para PHP? ¿Alguien sabe si el controlador PHP admite consultas geoespaciales?

Gracias

+1

Hey, yo estoy tratando de hacer algo similar. ¿Puede decirme qué unidad es la maxDistace que ha especificado? ¿Es kilómetros o millas y por qué se divide por 111. – swordfish

Respuesta

7

tengo de búsqueda geográfica con el conductor PHP que trabajan en la producción. Se ve algo como esto:

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

Además, es posible que desee considerar el uso de $ nearSphere en comparación con $ cerca de obtener coordenadas más precisas. Ver the mongo docs para más información.

+0

Gracias montones, lo tengo trabajando con esto. Es una pena que la consulta JSON simple en mongo se vuelva tan detallada en php – micmcg

0

No he tenido éxito en el uso 'cerca' como parte de la condición hallazgo en PHP sea.

Usted puede utilizar el comando mongodb geoNear lugar:

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

Un ejemplo del uso del comando $ nearSphere en PHP sería algo como:

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

Donde 'loc' es el índice geoespacial 2d y el límite es opcional.

1

Déjame probar el puerto PHP exacto para tu consulta mongo.

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

Por favor, asegúrese de encasillar los lat-longs con flotador. O bien, la extensión de mongo lo tratará como una cadena (sorpresa, sorpresa) y la consulta volverá asumiendo la condición de vacío (esto me llevó mucho tiempo encontrarla).

EDIT: Eche un vistazo a la fuente del controlador CakePlus mongo para más formas de utilizar las consultas geográficas. https://github.com/ichikaway/cakephp-mongodb/blob/master/samples/controllers/geos_controller.php

+0

+1 para la nota de transmisión. Ese fue un pequeño detalle problemático. – pospi

0

De acuerdo con la documentación en MongoDB website

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

el código PHP para la consulta anterior sería:

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