java - 使用 MongoDB/Morphia(Scala 或 Java)将 LatLon 类存储为 GeoJSON

标签 java mongodb scala geospatial morphia

我正在编写一个需要使用地理引用数据的应用程序,并且我想使用 MongoDB + Morphia。该应用程序是用 Scala 编写的,但如果一部分需要用 Java 编写,那也没关系(兼容性好!)

我有一个类来表示事件的纬度和经度:

class LatLon
{
  @BeanProperty
  var latDegrees : Double
  @BeanProperty
  var lonDegrees : Double
}

这不是一门非常令人兴奋的类(class),但在这种情况下很有用。

现在,我在某个位置记录了一个事件:

class ObservedEvent
{
  @BeanProperty
  var observation : String = _

  @Beanproperty
  var location : LatLon = _
}

现在,我有大量观察到的事件,我想使用 Morphia 将它们存储在 MongoDB 中。 “位置”应该存储为 GeoJson 点,以便我可以索引集合等。我尝试过制作 SimpleValueConverter、适配器和其他一些技巧,但我无法弄清楚如何实现这项工作。这似乎是一个常见的用例,它将被内置。希望这里的答案是“它是内置的!看[这里]”。如果是的话,我还没找到:(

谢谢!

最佳答案

Geojson 格式不是严格要求的; mongo 中的任何键都可以建立索引,因此您可以简单地为 latDegrees 和 lonDegrees 键建立索引。另外,geojson 格式很冗长,会增加数据库大小。我们已经这样做了大约一年,并且没有给 map 带来任何问题。

是的,如果您想使用各种漂亮的 $near、$within geo-spatial queries ,您确实需要 Geojson或 $geoNear 聚合..但如果您不打算使用它们,那么请不要打扰恕我直言。

Now, I have a ton of observed events and I want to store them in MongoDB with Morphia. The 'location' should be stored as a GeoJson Point so I can index the collection, etc.

当您需要将地理数据从 latDegrees、lonDegrees 格式转换为预期的 geojson 格式时,请运行此 shell 脚本。这最好作为一次性操作。

db.COLLECTION.find().forEach(function(doc) { 
   // Create a geojson point using the lon and lat found in each doc.
   var location = {"type":"Point", "coordinates":[doc.lonDegrees, doc.latDegrees};   
   printjson ("Location is " + location);
   // update the collection with geojson doc and unset the old one    
   db.COLLECTION.update({"_id":doc._id},{$set:{"loc":location}, $unset : {"lonDegrees", "latDegrees"} } );
})
  • 其中 COLLECTION 是数据库中“表”的名称。
  • 请注意,geojson 需要 lon、lat 序列中的数据,而不是常见的 lat、lon 约定。

小心。上面的脚本通过一个决定性的操作设置 geojson 并取消设置旧格式。您始终可以通过在新集合上用插入替换更新来创建新集合。以下将保留您的数据并在同一数据库中创建一个新集合。

   db.NEW_COLLECTION_NAME.insert(doc};
   db.NEW_COLLECTION_NAME.update({"_id":doc._id},{$set:{"loc":location}, $unset : {"lonDegrees", "latDegrees"} } );

使用 mongo shell 在命令行上运行脚本。

mongo DATABASE filename.js

我无法帮助您解决核心问题,不过,我建议您重点关注 Reactive 或 Rogue Mongo 驱动程序上的 BSON 处理程序,而不是扩展您的私有(private)代码。它更干净,然后其他人就可以使用你的工作。是的,这是一个常见问题,应该在 Mongo 驱动程序中。

即。看看这个 Scala sample你看到使用还是BSONDocument。人们可以创建一个 BSONLatLonDocument,将 2 个 float 组序列化/编码为所需的 geojson 格式。

关于java - 使用 MongoDB/Morphia(Scala 或 Java)将 LatLon 类存储为 GeoJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205293/

相关文章:

Scala Option过滤方法疑惑

java - 文件问题

java - 为什么java Locale是最终的?

java - MongoDB/Java : Inserting Document in Sub-Document

java - 在 Mongodb 中使用正则表达式

mongodb 通过比较字段值查找

scala - 值 * 不是类型参数 Int 的成员

java - 无法在应用程序级别设置对象(HashMap)

java - 如何在 Chrome 中单击打印预览页面上的取消按钮?

scala - Play Framework 2.4.x。 Redis 模块 2.4.0。无法序列化 : java. io.NotSerializableException : play. api.i18n.DefaultMessagesApi