使用 Java 使用 morphia mongodb 查找地理空间

发布于 2024-12-12 03:28:16 字数 309 浏览 0 评论 0原文

我想用吗啡框架查询一些地理位置点。我使用我的纬度、经度和半径(100 公里)以及“Near”方法来查询我所在位置周围的其他人,并限制 10 个结果。就像这样:

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100).limit(10).asList();

它没有错误,但结果显示了我周围且超出我半径范围(100公里)的位置点。所以,查询结果时我的半径并不重要。

我的查询语句有什么问题?

预先感谢您

I would like to query some geo location points with morphia framework. I use my latitude, longitude, and radius(100 km.) with "Near" method to query the other around my location and limit 10 results. Just like this :

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100).limit(10).asList();

It doesn't error but the result shows me the location points that around me and out of scope of my radius(100km.). So, my radius doesn't concern when query the result.

What is my problem with query statement?

Thanks you in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

木有鱼丸 2024-12-19 03:28:16

南北纬度差弧度的长度,在任何纬度约为60海里、111公里或69法定英里;您可以在 wikipedia 或 mongo 地理空间页面中阅读更多相关信息a href="http://www.mongodb.org/display/DOCS/Geospatial+Indexing" rel="nofollow">地球是圆的,但地图是平的。

使用公里时,将距离换算为 111.12(1 度大约为 111.12 公里);如果使用英里,则将距离换算为 69。

因此,将查询更改为

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/111.12).limit(10).asList();

并确保 mongodb 接受 [long,lat] 中的坐标。

The length of an arcdegree of north-south latitude difference, is about 60 nautical miles, 111 kilometres or 69 statute miles at any latitude; You can read more about here in wikipedia or in mongo geospatial page The Earth is Round but Maps are Flat.

Convert distance by 111.12 (one degree is approximately 111.12 kilometers) when using km, or by 69 (for miles).

So change your query to

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/111.12).limit(10).asList();

And make sure mongodb accepts the co-ordinates in [long,lat].

怎会甘心 2024-12-19 03:28:16

根据网站(MongoDB :使用球面几何计算二维索引中的距离)为了获得我们所看到的距离的弧度,我们必须使用 3.959 英里内的土地或6.371 公里。

查看文档(MongoDB:$nearSphere)我认为呼叫应该是:

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/6371, true).limit(10).asList();

就我而言,经过一番检查,这就是我的工作方式。

According to the website (MongoDB: Calculate Distances in a 2d Index Using Spherical Geometry) to get the radians of the distance where we look, we have to use the land within 3.959 miles or 6.371 km.

Viewing the documentation (MongoDB:$nearSphere) I think the call should be:

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/6371, true).limit(10).asList();

In my case and after some checking, this is how I work.

若水般的淡然安静女子 2024-12-19 03:28:16
public static void test() {
        DB datastore = ConnectionFactory.getInstance().getDatabaseMongo();
        double[] near = { 20.593684, 78.96288 };
        BasicDBObject basicDBObject = new BasicDBObject();
        basicDBObject.put("type", "Point");
        basicDBObject.put("coordinates", near);
        BasicDBObject geoNearParams = new BasicDBObject();
        geoNearParams.append("geoNear", <Collection name>);
        geoNearParams.append("near", basicDBObject);
        geoNearParams.append("spherical", true);
        geoNearParams.append("maxDistance", 100);
        geoNearParams.append("limit", 10);
        CommandResult commandResult = datastore.command(geoNearParams);
        commandResult.getErrorMessage();
        Object data = commandResult.get("results");
        System.out.println(data.toString());
    }
public static void test() {
        DB datastore = ConnectionFactory.getInstance().getDatabaseMongo();
        double[] near = { 20.593684, 78.96288 };
        BasicDBObject basicDBObject = new BasicDBObject();
        basicDBObject.put("type", "Point");
        basicDBObject.put("coordinates", near);
        BasicDBObject geoNearParams = new BasicDBObject();
        geoNearParams.append("geoNear", <Collection name>);
        geoNearParams.append("near", basicDBObject);
        geoNearParams.append("spherical", true);
        geoNearParams.append("maxDistance", 100);
        geoNearParams.append("limit", 10);
        CommandResult commandResult = datastore.command(geoNearParams);
        commandResult.getErrorMessage();
        Object data = commandResult.get("results");
        System.out.println(data.toString());
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文