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



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

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

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

这不是一个非常令人兴奋的课程,但在这种情况下很有用。

现在,我

有一个事件,我在一个位置录制:

class ObservedEvent
{
  @BeanProperty
  var observation : String = _
  @Beanproperty
  var location : LatLon = _
}

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

谢谢!

Geojson 格式不是严格要求的;在 mongo 中的任何键上都可以有索引,所以你可以简单地索引 latDegrees 和 lonDegrees 键。加上 geojson 格式很详细,会增加您的数据库大小。我们已经这样做了大约 1 年,它没有造成映射问题。

是的,如果您希望使用各种漂亮的$near,$within地理空间查询或$geoNear聚合,您确实需要Geojson。但是,如果您不打算使用它们,请不要打扰恕我直言。

现在,我有大量观察到的事件,我想将它们存储在 MongoDB with Morphia."位置"应存储为 GeoJson 点,以便我可以索引集合等。

何时以及如果您需要将地理数据从纬度、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 在命令行上运行 scrip。

mongo DATABASE filename.js

无法帮助您解决核心问题,但是,我建议专注于反应式或流氓Mongo驱动程序上的BSON处理程序 - 而不是扩展您的私有代码。它更干净,然后其他人可以使用您的工作。是是一个常见问题,应该在 Mongo 驱动程序中。

即。查看此 Scala 示例,您会看到 use 或 BSONDocument。可以创建一个 BSONLatLonDocument,将 2 个浮点数组序列化/编组为所需的 geojson 格式。

我想从Java生成简单的GeoJSON,并找到了GeoJSON-POJO。

实施速度快,非常简单。

  1. 将 GeoJSON-POJO 作为新的依赖项添加到您的 pom 中。
  2. 使用您的数据构建 Java 对象。
  3. 将对象发送给杰克逊进行序列化。

我相信这个解决方案可以通过多种方式进行优化。 但我怀疑该功能能否以更少的工时完成。 我在大约 10 分钟内从服务器上的随机数据转到客户端浏览器地图(传单(上显示的 GeoJSON。

抱歉,如果这对MongoDB或Morphia没有帮助...

就其价值而言,morphia 0.110将大大改善地理支持。 如果您想试一试,sonatype 快照存储库中有快照构建。

您可以使用morphia GeoJson类生成一个点,该点将在mongo db中与类型点一起持久化

最新更新