Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB地理空间-搜索点项目和地理交点_Mongodb_Mongoose_Geospatial - Fatal编程技术网

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”元素,并将其定义为多边形吗?如何将我的单点定义为多边形?是的,只有一个字段。你不必把另一个当作多边形,只要把它当作点就行了。