MongoDB地理空间-搜索点项目和地理交点
我正在开发一个应用程序,在某个点附近搜索业务: 文档结构当前看起来像:MongoDB地理空间-搜索点项目和地理交点,mongodb,mongoose,geospatial,Mongodb,Mongoose,Geospatial,我正在开发一个应用程序,在某个点附近搜索业务: 文档结构当前看起来像: { "_id" : ObjectId("52dbcf155b67b9f80f000021"), "name" : "Some Business Name", "town" : "Bournemouth", "postcode" : "BH7 4XK", "country_code" : "UK", "country_name" :
{
"_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
]
}
}
这代表着一项业务
“geo”表示它的纬度/经度
然后,我可以使用$near
然而,一些企业提供“移动”服务。-即,覆盖距离给定点x英里的区域。 在本例中,我考虑将另一个元素添加到文档中:
"mobileGeo" : {
"type" : "Polygon", //I'm guessing?
"coordinates" : [] // not sure how to represent...
}
我怎样才能将查询更改为既包含“geo”项,又包含与“mobileGeo”元素相交的任何项
例如:
A和B是“固定”点
C表示距离给定点10英里的区域。
由于该半径与“搜索”区域重叠,因此会在结果中返回
我看过“$geoIntersects”,但我不确定这是否正确?$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;
那么,我应该用“geo”(或我决定称之为“geo”)来代替“geo”和“mobileGeo”元素,并将其定义为多边形吗?如何将我的单点定义为多边形?是的,只有一个字段。你不必把另一个当作多边形,只要把它当作点就行了。