我正在编写一个需要使用地理引用数据的应用程序,并且我想使用 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/