2014-01-22 105 views
0

我工作的那附近的某一点搜索业务应用项目和geoIntersects:MongoDB的地理空间 - 搜索指向

文档结构目前是这样的:

{ 
     "_id" : ObjectId("52dbcf155b67b9f80f000021"), 
     "name" : "Some Business Name", 
     "town" : "Bournemouth", 
     "postcode" : "BH7 4XK", 
     "country_code" : "UK", 
     "country_name" : "United Kingdom", 

     "geo" : { 
       "type" : "Point", 
       "coordinates" : [ 
         -1.8185951, 
         50.7429735 
       ] 
     } 

} 

这代表了企业。

的“地理”表示这是经/纬度

然后我就可以使用$near

然而,一些商家提供了一个“移动”的服务搜索与点的x英里业务。
- 即覆盖距离给定点x英里的区域。 在这种情况下,我已经想过加入一个新元素的文档:

"mobileGeo" : { 
      "type" : "Polygon", //I'm guessing? 
      "coordinates" : [] // not sure how to represent... 
    } 

我怎么会改变我的查询,涵盖了“地理”项目,任何来自我的“mobileGeo”元素相交?

例如:

enter image description here

A和B被“固定”点 C表示从给定的点10英里的区域。由于此半径与“搜索”区域重叠,因此将返回结果中。

我见过`$ geoIntersects',但我不确定这是否正确?

回答

1

$ geoIntersects是包含完全覆盖的点(您的A和B)以及所有相交的运算符(C)的运算符。但是,只能使用一个运算符,因此如果要使用$geoIntersects,则需要确保搜索几何图形属于同一字段的一部分。因此,我建议将您的搜索字段(点或多边形)存储为与您的显示字段(点,我想)不同。然后只在搜索字段中设置索引。如果搜索字段包含一个点,那么你当然可以选择不存储显示字段,因为它是重复的信息。

你的第二个问题涉及计算点C +半径的多边形。我不认为你可以直接使用GeoJSON,所以你需要计算适当的点来组成你的圈子。在PHP中,你能做到这一点的东西,如:

<?php 
$lat = 51.5; 
$lon = -0.5; 

$latRad = deg2rad($lat); 
$lonRad = deg2rad($lon); 

$diameter = 6371; // radius of earth 
$distance = 5; // 5 km 

$radius = $distance/$diameter; 

$points = []; 

// create 16 points. 
for ($i = 0; $i <= M_PI * 2 + 0.1; $i += M_PI/8) 
{ 
    $latNew = $latRad + (sin($i) * $radius); 
    $lonNew = $lonRad + ((cos($i) * $radius)/cos($latNew)); 

    $points[] = [ rad2deg($lonNew), rad2deg($latNew) ]; 

} 

$json =json_encode([ 
    'type' => 'Polygon', 
    'coordinates' => [[ $points ]] 
], JSON_PRETTY_PRINT); 

echo $json; 
+0

所以,而不是“地球”和“mobileGeo”元素,我应该有“地缘”(或任何我决定将它命名) - 并有定义为多边形?我如何将单点定义为多边形? – Alex

+0

是的,只有一个领域。您不必将另一个作为多边形,只需将其保留为点即可。 – Derick