在OpenLayers中保存和恢复几何

时间:2011-03-04 05:00:32

标签: json persistence geospatial openlayers geojson

背景:我是OpenLayers的一个只有几个小时的新手,请保持温和。

从根本上说,我有一张地图上有一些绘制的物体。如果我理解正确,我有许多OpenLayer.Feature.Vector(layers?),上面有许多OpenLayer.Geometry“的东西”(比如LinearRing)。

目前,我似乎能够使用.toString()获得几何体的良好表示。是的,我怀疑我做错了 - 随意指出我正确的方向。

这产生了一个非常人性化且可存储数据库的字符串,例如:

  • 要点(-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 个答案:

答案 0 :(得分:29)

Openlayers.Geometry个对象'toString方法很好地将它们转换为WKT(众所周知的文本)。如果在数据库顶部使用GIS层(例如PostGIS for PostGres,SQL Spatial for SQL Server,Spatialite for 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()上使用的原始对象具有相同的属性。

如果将数组传递给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))

答案 1 :(得分: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');

第二个参数可让您指出要返回的对象类型。阅读链接到的文档以获取更多信息。

另外,请查看this demo以获取更广泛的示例。 (查看页面来源以了解他们是如何做到的)。