17

上下文:我是 OpenLayers 的一个新人,请保持温和。

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

目前,我似乎能够使用 .toString() 很好地表示几何。是的,我怀疑我做错了——请随时指出我正确的方向。

这会产生一个非常可读且可数据库存储的字符串,例如:

  • 点(-104.74560546875 44.2841796875)

  • 多边形((-96.52783203125 44.6796875,-96.52783203125 45.734375,-92.22119140625 45.734375,-92.22119140625 44.6796875,-96.527832087592)

  • 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 属性在我窥视内部时所说的)。

非常感谢。

4

2 回答 2

29

Openlayers.Geometry对象的方法很好地将它们转换为WKT 众所周知的文本)。如果您在数据库顶部使用 GIS 图层(例如用于 PostGres 的 PostGIS、用于 SQL Server 的 SQL Spatial、用于 SQLite 的 Spatialite 等),它们应该提供使您能够处理 WKT 的功能。toString

但是,如果您想将该 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))

于 2011-03-04T11:43:56.203 回答
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');

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

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

于 2011-03-04T12:04:00.670 回答