在OpenLayers中保存和恢复几何图形

17

背景:我是一个 OpenLayers 的新手,刚学不久,请多关照。

基本上,我有一个地图,上面画了一些对象。如果我理解正确的话,我有许多包含 OpenLayer.Geometry “东西”的 OpenLayer.Feature.Vector(层?)。

目前,使用 .toString() 我似乎可以很好地表示几何形状。是的,我怀疑自己做错了——请随时指正。

这会产生非常人性化的、可存储到数据库中的字符串,例如:

  • POINT(-104.74560546875 44.2841796875)

  • POLYGON((-96.52783203125 44.6796875,-96.52783203125 45.734375,-92.22119140625 45.734375,-92.22119140625 44.6796875,-96.52783203125 44.6796875))

  • LINESTRING(-105.71240234375 44.6796875,-106.06396484375 42.658203125,-103.55908203125 42.7021484375,-103.47119140625 45.55859375,-104.65771484375 45.20703125)

是否有一种逆向的方法,可以将它们恢复成原来的对象格式?

我很想使用 JSON,但似乎无法让 GeoJSON 接受我的 OpenLayer.Feature.Vector 对象(当我查看内部的 CLASS_NAME 属性时,它就是这个对象)。

非常感谢。

2个回答

29

OpenLayers.Geometry对象的toString方法可以将它们转换为漂亮的WKT(Well-Known Text)格式。如果您在数据库上使用GIS图层(例如PostGIS用于PostGres,SQL Spatial用于SQL Server,Spatialite用于SQLite等),它们应该会提供能够处理WKT的函数。

但是,如果您想将该WKT转换为新的OpenLayers.Geometry对象(在浏览器中),则可以使用fromWKT函数:

var point = OpenLayers.Geometry.fromWKT('POINT(-104.74560546875 44.2841796875)');
alert(point.toString()); // POINT(-104.74560546875 44.2841796875)

在这里,变量point现在将包含一个新的OpenLayers.Geometry对象,该对象具有与使用toString() on的原始对象相同的属性。

如果将数组传递给fromWKT函数,则它将返回一个GeometryCollection,其中包含所有生成的几何图形。

var geometryTexts = [
      'POINT(-104.74560546875 44.2841796875)'
    , 'POLYGON((-96.52783203125 44.6796875,-96.52783203125 45.734375,-92.22119140625 45.734375,-92.22119140625 44.6796875,-96.52783203125 44.6796875))'
    , 'LINESTRING(-105.71240234375 44.6796875,-106.06396484375 42.658203125,-103.55908203125 42.7021484375,-103.47119140625 45.55859375,-104.65771484375 45.20703125)'
    ],
    collection = OpenLayers.Geometry.fromWKT(geometryTexts);
在此之后,collection.toString() 应该返回以下内容:

GEOMETRYCOLLECTION(POINT(-104.74560546875 44.2841796875),POLYGON((-96.52783203125 44.6796875,-96.52783203125 45.734375,-92.22119140625 45.734375,-92.22119140625 44.6796875,-96.52783203125 44.6796875)),LINESTRING(-105.71240234375 44.6796875,-106.06396484375 42.658203125,-103.55908203125 42.7021484375,-103.47119140625 45.55859375,-104.65771484375 45.20703125))


谢谢,谢谢,谢谢!这正是我在寻找的,并且正好达到了我需要的详细程度! - Walt Stoneburner
@WaltStoneburner: 不客气。我只是在探索OpenLayers的WKT支持。 :-) - Martijn

17

在我的另一个答案中,我选择了WKT,因为你提到了它。现在我看到你似乎更喜欢GeoJSON。

要将矢量图层或Openlayers.Geometry对象转换为GeoJSON字符串,您应该使用OpenLayers.Format.GeoJSON.write函数:

var geoJSON = new OpenLayers.Format.GeoJSON(),
    geoJSONText = geoJSON.write(geometryObject);

请注意,根据文档,此函数接受OpenLayers.Feature.Vector、OpenLayers.Geometry或要素数组,因此您应该能够将对象传递给此函数。
反之,当您有一个GeoJSON字符串时,您可以使用OpenLayers.Format.GeoJSON.read函数将其转换回对象。
var geometry = geoJSON.read(geoJSONText, 'Geometry');

第二个参数可以让您指定想要返回的对象类型。有关更多信息,请阅读链接到的文档。
此外,查看此演示以获取更详细的示例。(查看页面源代码以了解它们是如何实现的)。

出色的跟进! 这很棒。 - Walt Stoneburner
1
@WaltStoneburner:我同意,OpenLayers确实很棒。只是有点文档不足。 - Martijn
提示给那些正在关注的人,我实际上必须执行以下操作:var geoJSON = new OpenLayers.Format.GeoJSON().write(geometryObject); - Walt Stoneburner
啊,是的,GeoJSON是一个构造器。我已经更新了答案以修正这个问题。 - Martijn
有没有一种方法可以直接获取GeoJSON对象,而不是再次进行JSON解析? - relet
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接